1 /**********
2 Copyright 1990 Regents of the University of California.  All rights reserved.
3 Author: 1988 Jaijeet S Roychowdhury
4 **********/
5 
6 #include "ngspice/ngspice.h"
7 #include "ngspice/distodef.h"
8 
9 
10 /*
11  * all subFns are local to this file so they need not be renamed to
12  * the awful 7 letter standard; however, for reasons of uniformity,
13  * they are being renamed, losing all readability in the process.
14  * the renaming convention is as follows:
15  *   example: 3v3F1m2
16  * 3v => 3 variable term xyz
17  * 2F1m2 => Two F1 minus F2
18  * therefore the old name would be : S3v3F1minusF2
19  * for the imaginary sub functions, the v is replaced by an i
20  *
21  */
22 static double
S2v2F1(double cxy,double r1h1x,double i1h1x,double r1h1y,double i1h1y)23 S2v2F1(double cxy, double r1h1x, double i1h1x, double r1h1y, double i1h1y)
24 
25                     		/* 5 arguments */
26 
27 {
28 return(cxy*(r1h1x*r1h1y - i1h1x*i1h1y));
29 }
30 
31 static double
S2i2F1(double cxy,double r1h1x,double i1h1x,double r1h1y,double i1h1y)32 S2i2F1(double cxy, double r1h1x, double i1h1x, double r1h1y, double i1h1y)
33 
34                                /* 5 arguments */
35 
36 {
37 return(cxy*(r1h1x*i1h1y + i1h1x*r1h1y));
38 }
39 
40 static double
S2v3F1(double cxy,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r2h11x,double i2h11x,double r2h11y,double i2h11y)41 S2v3F1(double cxy, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r2h11x, double i2h11x, double r2h11y, double i2h11y)
42 
43 			/* 9 arguments */
44 
45 
46 {
47 return(cxy*(r1h1x*r2h11y - i1h1x*i2h11y + r1h1y*r2h11x - i1h1y*
48 			i2h11x));
49 }
50 
51 
52 static double
S2i3F1(double cxy,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r2h11x,double i2h11x,double r2h11y,double i2h11y)53 S2i3F1(double cxy, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r2h11x, double i2h11x, double r2h11y, double i2h11y)
54 
55 			/* 9 arguments */
56 
57 
58 {
59 return(cxy*(r1h1x*i2h11y + i1h1x*r2h11y + r1h1y*i2h11x + i1h1y*
60 			r2h11x));
61 }
62 
63 static double
S2vF12(double cxy,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h2x,double i1h2x,double r1h2y,double i1h2y)64 S2vF12(double cxy, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h2x, double i1h2x, double r1h2y, double i1h2y)
65 
66 				/* 9 arguments */
67 
68 
69 {
70 return(cxy*(r1h1x*r1h2y - i1h1x*i1h2y + r1h1y*r1h2x - i1h1y*i1h2x));
71 }
72 
73 static double
S2iF12(double cxy,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h2x,double i1h2x,double r1h2y,double i1h2y)74 S2iF12(double cxy, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h2x, double i1h2x, double r1h2y, double i1h2y)
75 
76 				/* 9 arguments */
77 
78 
79 {
80 return(cxy*(r1h1x*i1h2y + i1h1x*r1h2y + r1h1y*i1h2x + i1h1y*r1h2x));
81 }
82 
83 static double
S2v2F12(double cxy,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h2x,double i1h2x,double r1h2y,double i1h2y,double r2h11x,double i2h11x,double r2h11y,double i2h11y,double h2f1f2x,double ih2f1f2x,double h2f1f2y,double ih2f1f2y)84 S2v2F12(double cxy, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h2x, double i1h2x, double r1h2y, double i1h2y, double r2h11x, double i2h11x, double r2h11y, double i2h11y, double h2f1f2x, double ih2f1f2x, double h2f1f2y, double ih2f1f2y)
85 
86 				/* 17 arguments */
87 
88 
89 
90 
91 {
92 return ( cxy * (
93 		2*(r1h1x*h2f1f2y - i1h1x*ih2f1f2y
94 		  +r1h1y*h2f1f2x - i1h1y*ih2f1f2x)
95 		+ r1h2x*r2h11y - i1h2x*i2h11y
96 		+ r1h2y*r2h11x - i1h2y*i2h11x
97 		));
98 }
99 
100 static double
S2i2F12(double cxy,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h2x,double i1h2x,double r1h2y,double i1h2y,double r2h11x,double i2h11x,double r2h11y,double i2h11y,double h2f1f2x,double ih2f1f2x,double h2f1f2y,double ih2f1f2y)101 S2i2F12(double cxy, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h2x, double i1h2x, double r1h2y, double i1h2y, double r2h11x, double i2h11x, double r2h11y, double i2h11y, double h2f1f2x, double ih2f1f2x, double h2f1f2y, double ih2f1f2y)
102 
103 				/* 17 arguments */
104 
105 
106 
107 
108 {
109 return ( cxy * (
110 		2*(r1h1x*ih2f1f2y + i1h1x*h2f1f2y
111 		  +r1h1y*ih2f1f2x + i1h1y*h2f1f2x)
112 		+ r1h2x*i2h11y + i1h2x*r2h11y
113 		+ r1h2y*i2h11x + i1h2y*r2h11x
114 		));
115 }
116 
117 static double
S3v3F1(double cxyz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z)118 S3v3F1(double cxyz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z)
119 
120 				/* 7 arguments */
121 
122 
123 {
124 return( cxyz * (
125 		(r1h1x*r1h1y - i1h1x*i1h1y)*r1h1z - (i1h1x*r1h1y + r1h1x*i1h1y)*i1h1z
126 	       ));
127 }
128 
129 static double
S3i3F1(double cxyz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z)130 S3i3F1(double cxyz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z)
131 
132 				/* 7 arguments */
133 
134 
135 {
136 return( cxyz * (
137 	       (r1h1x*r1h1y - i1h1x*i1h1y)*i1h1z + (i1h1x*r1h1y + r1h1x*i1h1y)*r1h1z
138 	       ));
139 }
140 
141 static double
S3v2F12(double cxyz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z,double r1h2x,double i1h2x,double r1h2y,double i1h2y,double r1h2z,double i1h2z)142 S3v2F12(double cxyz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z, double r1h2x, double i1h2x, double r1h2y, double i1h2y, double r1h2z, double i1h2z)
143 
144 				/* 13 arguments */
145 
146 
147 
148 {
149 return ( cxyz * (
150 		 (r1h1x*r1h1y - i1h1x*i1h1y)*r1h2z - (i1h1x*r1h1y + r1h1x*i1h1y)*i1h2z
151 		 +
152 		 (r1h1x*r1h1z - i1h1x*i1h1z)*r1h2y - (i1h1x*r1h1z + r1h1x*i1h1z)*i1h2y
153 		 +
154 		 (r1h1z*r1h1y - i1h1z*i1h1y)*r1h2x - (i1h1z*r1h1y + r1h1z*i1h1y)*i1h2x
155 		 ));
156 }
157 
158 static double
S3i2F12(double cxyz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z,double r1h2x,double i1h2x,double r1h2y,double i1h2y,double r1h2z,double i1h2z)159 S3i2F12(double cxyz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z, double r1h2x, double i1h2x, double r1h2y, double i1h2y, double r1h2z, double i1h2z)
160 
161 				/* 13 arguments */
162 
163 
164 
165 {
166 return ( cxyz * (
167 		 (r1h1x*r1h1y - i1h1x*i1h1y)*i1h2z + (i1h1x*r1h1y + r1h1x*i1h1y)*r1h2z
168 		 +
169 		 (r1h1x*r1h1z - i1h1x*i1h1z)*i1h2y + (i1h1x*r1h1z + r1h1x*i1h1z)*r1h2y
170 		 +
171 		 (r1h1z*r1h1y - i1h1z*i1h1y)*i1h2x + (i1h1z*r1h1y + r1h1z*i1h1y)*r1h2x
172 		 ));
173 }
174 
175 	/* the load functions */
176  /* also renamed... */
177 double
DFn2F1(double cxx,double cyy,double czz,double cxy,double cyz,double cxz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z)178 DFn2F1(double cxx, double cyy, double czz, double cxy, double cyz, double cxz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z)
179 
180 			/* 12 variables */
181 
182 
183 {
184 double temp;
185 
186 	temp = S2v2F1(cxx,r1h1x,i1h1x,r1h1x,i1h1x) +
187 	       S2v2F1(cyy,r1h1y,i1h1y,r1h1y,i1h1y) +
188 	       S2v2F1(czz,r1h1z,i1h1z,r1h1z,i1h1z) +
189 	       S2v2F1(cxy,r1h1x,i1h1x,r1h1y,i1h1y) +
190 	       S2v2F1(cyz,r1h1y,i1h1y,r1h1z,i1h1z) +
191 	       S2v2F1(cxz,r1h1x,i1h1x,r1h1z,i1h1z);
192 
193 	       return(temp);
194 }
195 
196 double
DFi2F1(double cxx,double cyy,double czz,double cxy,double cyz,double cxz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z)197 DFi2F1(double cxx, double cyy, double czz, double cxy, double cyz, double cxz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z)
198 
199 			/* 12 variables */
200 
201 
202 {
203 double temp;
204 
205 	temp = S2i2F1(cxx,r1h1x,i1h1x,r1h1x,i1h1x) +
206 	       S2i2F1(cyy,r1h1y,i1h1y,r1h1y,i1h1y) +
207 	       S2i2F1(czz,r1h1z,i1h1z,r1h1z,i1h1z) +
208 	       S2i2F1(cxy,r1h1x,i1h1x,r1h1y,i1h1y) +
209 	       S2i2F1(cyz,r1h1y,i1h1y,r1h1z,i1h1z) +
210 	       S2i2F1(cxz,r1h1x,i1h1x,r1h1z,i1h1z);
211 
212 	       return(temp);
213 }
214 
215 double
DFn3F1(double cxx,double cyy,double czz,double cxy,double cyz,double cxz,double cxxx,double cyyy,double czzz,double cxxy,double cxxz,double cxyy,double cyyz,double cxzz,double cyzz,double cxyz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z,double r2h11x,double i2h11x,double r2h11y,double i2h11y,double r2h11z,double i2h11z)216 DFn3F1(double cxx, double cyy, double czz, double cxy, double cyz, double cxz, double cxxx, double cyyy, double czzz, double cxxy, double cxxz, double cxyy, double cyyz, double cxzz, double cyzz, double cxyz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z, double r2h11x, double i2h11x, double r2h11y, double i2h11y, double r2h11z, double i2h11z)
217 			 /* 28 args - 16 + 6 + 6 */
218 
219 
220 
221 {
222 double temp;
223 
224 	temp = S2v3F1(cxx,r1h1x,i1h1x,r1h1x,i1h1x,r2h11x,i2h11x,r2h11x,i2h11x)
225 	      +S2v3F1(cyy,r1h1y,i1h1y,r1h1y,i1h1y,r2h11y,i2h11y,r2h11y,i2h11y)
226 	      +S2v3F1(czz,r1h1z,i1h1z,r1h1z,i1h1z,r2h11z,i2h11z,r2h11z,i2h11z);
227 	      temp +=
228 	      S2v3F1(cxy,r1h1x,i1h1x,r1h1y,i1h1y,r2h11x,i2h11x,r2h11y,i2h11y)
229 	      +S2v3F1(cyz,r1h1y,i1h1y,r1h1z,i1h1z,r2h11y,i2h11y,r2h11z,i2h11z)
230 	      +S2v3F1(cxz,r1h1x,i1h1x,r1h1z,i1h1z,r2h11x,i2h11x,r2h11z,i2h11z)
231 	      +S3v3F1(cxxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h1x,i1h1x);
232 	      temp +=
233 	      S3v3F1(cyyy,r1h1y,i1h1y,r1h1y,i1h1y,r1h1y,i1h1y)
234 	      +S3v3F1(czzz,r1h1z,i1h1z,r1h1z,i1h1z,r1h1z,i1h1z)
235 	      +S3v3F1(cxxy,r1h1x,i1h1x,r1h1x,i1h1x,r1h1y,i1h1y)
236 	      +S3v3F1(cxxz,r1h1x,i1h1x,r1h1x,i1h1x,r1h1z,i1h1z)
237 	      +S3v3F1(cxyy,r1h1x,i1h1x,r1h1y,i1h1y,r1h1y,i1h1y);
238 	      temp +=
239 	      S3v3F1(cyyz,r1h1y,i1h1y,r1h1y,i1h1y,r1h1z,i1h1z)
240 	      +S3v3F1(cxzz,r1h1x,i1h1x,r1h1z,i1h1z,r1h1z,i1h1z)
241 	      +S3v3F1(cyzz,r1h1y,i1h1y,r1h1z,i1h1z,r1h1z,i1h1z)
242 	      +S3v3F1(cxyz,r1h1x,i1h1x,r1h1y,i1h1y,r1h1z,i1h1z);
243 
244 	      return(temp);
245 }
246 
247 double
DFi3F1(double cxx,double cyy,double czz,double cxy,double cyz,double cxz,double cxxx,double cyyy,double czzz,double cxxy,double cxxz,double cxyy,double cyyz,double cxzz,double cyzz,double cxyz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z,double r2h11x,double i2h11x,double r2h11y,double i2h11y,double r2h11z,double i2h11z)248 DFi3F1(double cxx, double cyy, double czz, double cxy, double cyz, double cxz, double cxxx, double cyyy, double czzz, double cxxy, double cxxz, double cxyy, double cyyz, double cxzz, double cyzz, double cxyz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z, double r2h11x, double i2h11x, double r2h11y, double i2h11y, double r2h11z, double i2h11z)
249 			 /* 28 args - 10 + 6 + 6 */
250 
251 
252 
253 {
254 double temp;
255 
256 	temp = S2i3F1(cxx,r1h1x,i1h1x,r1h1x,i1h1x,r2h11x,i2h11x,r2h11x,i2h11x)
257 	      +S2i3F1(cyy,r1h1y,i1h1y,r1h1y,i1h1y,r2h11y,i2h11y,r2h11y,i2h11y)
258 	      +S2i3F1(czz,r1h1z,i1h1z,r1h1z,i1h1z,r2h11z,i2h11z,r2h11z,i2h11z)
259 	      +S2i3F1(cxy,r1h1x,i1h1x,r1h1y,i1h1y,r2h11x,i2h11x,r2h11y,i2h11y);
260 	      temp +=
261 	      S2i3F1(cyz,r1h1y,i1h1y,r1h1z,i1h1z,r2h11y,i2h11y,r2h11z,i2h11z)
262 	      +S2i3F1(cxz,r1h1x,i1h1x,r1h1z,i1h1z,r2h11x,i2h11x,r2h11z,i2h11z)
263 	      +S3i3F1(cxxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h1x,i1h1x)
264 	      +S3i3F1(cyyy,r1h1y,i1h1y,r1h1y,i1h1y,r1h1y,i1h1y);
265 	      temp +=
266 	      S3i3F1(czzz,r1h1z,i1h1z,r1h1z,i1h1z,r1h1z,i1h1z)
267 	      +S3i3F1(cxxy,r1h1x,i1h1x,r1h1x,i1h1x,r1h1y,i1h1y)
268 	      +S3i3F1(cxxz,r1h1x,i1h1x,r1h1x,i1h1x,r1h1z,i1h1z)
269 	      +S3i3F1(cxyy,r1h1x,i1h1x,r1h1y,i1h1y,r1h1y,i1h1y);
270 	      temp +=
271 	      S3i3F1(cyyz,r1h1y,i1h1y,r1h1y,i1h1y,r1h1z,i1h1z)
272 	      +S3i3F1(cxzz,r1h1x,i1h1x,r1h1z,i1h1z,r1h1z,i1h1z)
273 	      +S3i3F1(cyzz,r1h1y,i1h1y,r1h1z,i1h1z,r1h1z,i1h1z)
274 	      +S3i3F1(cxyz,r1h1x,i1h1x,r1h1y,i1h1y,r1h1z,i1h1z);
275 
276 	      return(temp);
277 }
278 
279 double
DFnF12(double cxx,double cyy,double czz,double cxy,double cyz,double cxz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z,double r1h2x,double i1h2x,double r1h2y,double i1h2y,double r1h2z,double i1h2z)280 DFnF12(double cxx, double cyy, double czz, double cxy, double cyz, double cxz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z, double r1h2x, double i1h2x, double r1h2y, double i1h2y, double r1h2z, double i1h2z)
281 
282 			/* 18 args - 6 + 6 + 6	*/
283 
284 
285 
286 {
287 double temp;
288 
289 	temp = S2vF12(cxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h2x,i1h2x,r1h2x,i1h2x)
290 	      +S2vF12(cyy,r1h1y,i1h1y,r1h1y,i1h1y,r1h2y,i1h2y,r1h2y,i1h2y)
291 	      +S2vF12(czz,r1h1z,i1h1z,r1h1z,i1h1z,r1h2z,i1h2z,r1h2z,i1h2z);
292 	      temp +=
293 	      S2vF12(cxy,r1h1x,i1h1x,r1h1y,i1h1y,r1h2x,i1h2x,r1h2y,i1h2y)
294 	      +S2vF12(cyz,r1h1y,i1h1y,r1h1z,i1h1z,r1h2y,i1h2y,r1h2z,i1h2z)
295 	      +S2vF12(cxz,r1h1x,i1h1x,r1h1z,i1h1z,r1h2x,i1h2x,r1h2z,i1h2z);
296 
297 	      return(0.5*temp);
298 }
299 
300 double
DFiF12(double cxx,double cyy,double czz,double cxy,double cyz,double cxz,double r1h1x,double i1h1x,double r1h1y,double i1h1y,double r1h1z,double i1h1z,double r1h2x,double i1h2x,double r1h2y,double i1h2y,double r1h2z,double i1h2z)301 DFiF12(double cxx, double cyy, double czz, double cxy, double cyz, double cxz, double r1h1x, double i1h1x, double r1h1y, double i1h1y, double r1h1z, double i1h1z, double r1h2x, double i1h2x, double r1h2y, double i1h2y, double r1h2z, double i1h2z)
302 
303 			/* 18 args - 6 + 6 + 6	*/
304 
305 
306 
307 {
308 double temp;
309 
310 	temp = S2iF12(cxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h2x,i1h2x,r1h2x,i1h2x)
311 	      +S2iF12(cyy,r1h1y,i1h1y,r1h1y,i1h1y,r1h2y,i1h2y,r1h2y,i1h2y)
312 	      +S2iF12(czz,r1h1z,i1h1z,r1h1z,i1h1z,r1h2z,i1h2z,r1h2z,i1h2z);
313 	      temp +=
314 	      S2iF12(cxy,r1h1x,i1h1x,r1h1y,i1h1y,r1h2x,i1h2x,r1h2y,i1h2y)
315 	      +S2iF12(cyz,r1h1y,i1h1y,r1h1z,i1h1z,r1h2y,i1h2y,r1h2z,i1h2z)
316 	      +S2iF12(cxz,r1h1x,i1h1x,r1h1z,i1h1z,r1h2x,i1h2x,r1h2z,i1h2z);
317 
318 	      return(temp*0.5); /* divided by two to scale down */
319 }
320 
321 double
DFn2F12(DpassStr * p)322 DFn2F12(DpassStr *p)
323 
324 				/* 40 vars - 16 + 6 + 6 + 6 + 6 */
325 /*
326  * a structure because a standard C compiler can handle only
327  * 32 variables.
328  *
329  */
330 {
331 double temp;
332 
333 	temp = S2v2F12(p->cxx,p->r1h1x,p->i1h1x,
334 	p->r1h1x,p->i1h1x,
335 						p->r1h2x,p->i1h2x,
336 	p->r1h2x,p->i1h2x,
337 						p->r2h11x,p->i2h11x,
338 	p->r2h11x,p->i2h11x,
339 						p->h2f1f2x,p->ih2f1f2x,
340 	p->h2f1f2x,p->ih2f1f2x);
341 	temp +=
342 	      S2v2F12(p->cyy,p->r1h1y,p->i1h1y,
343 	p->r1h1y,p->i1h1y,
344 						p->r1h2y,p->i1h2y,
345 	p->r1h2y,p->i1h2y,
346 						p->r2h11y,p->i2h11y,
347 	p->r2h11y,p->i2h11y,
348 						p->h2f1f2y,p->ih2f1f2y,
349 	p->h2f1f2y,p->ih2f1f2y);
350 	temp +=
351 	      S2v2F12(p->czz,p->r1h1z,p->i1h1z,
352 	p->r1h1z,p->i1h1z,
353 						p->r1h2z,p->i1h2z,
354 	p->r1h2z,p->i1h2z,
355 						p->r2h11z,p->i2h11z,
356 	p->r2h11z,p->i2h11z,
357 						p->h2f1f2z,p->ih2f1f2z,
358 	p->h2f1f2z,p->ih2f1f2z);
359 	temp +=
360               S2v2F12(p->cxy,p->r1h1x,p->i1h1x,
361 	p->r1h1y,p->i1h1y,
362 						p->r1h2x,p->i1h2x,
363 	p->r1h2y,p->i1h2y,
364 						p->r2h11x,p->i2h11x,
365 	p->r2h11y,p->i2h11y,
366 						p->h2f1f2x,p->ih2f1f2x,
367 	p->h2f1f2y,p->ih2f1f2y);
368 	      temp +=
369 	      S2v2F12(p->cyz,p->r1h1y,p->i1h1y,
370 	p->r1h1z,p->i1h1z,
371 						p->r1h2y,p->i1h2y,
372 	p->r1h2z,p->i1h2z,
373 						p->r2h11y,p->i2h11y,
374 	p->r2h11z,p->i2h11z,
375 						p->h2f1f2y,p->ih2f1f2y,
376 	p->h2f1f2z,p->ih2f1f2z);
377 	temp +=
378 	      S2v2F12(p->cxz,p->r1h1x,p->i1h1x,
379 	p->r1h1z,p->i1h1z,
380 						p->r1h2x,p->i1h2x,
381 	p->r1h2z,p->i1h2z,
382 						p->r2h11x,p->i2h11x,
383 	p->r2h11z,p->i2h11z,
384 						p->h2f1f2x,p->ih2f1f2x,
385 	p->h2f1f2z,p->ih2f1f2z);
386 	temp +=
387 	      S3v2F12(p->cxxx,p->r1h1x,
388 	p->i1h1x,p->r1h1x,p->i1h1x,p->r1h1x,p->i1h1x,
389 						p->r1h2x,p->i1h2x,
390 	p->r1h2x,p->i1h2x,p->r1h2x,p->i1h2x)
391 	      +S3v2F12(p->cyyy,p->r1h1y,
392 	p->i1h1y,p->r1h1y,p->i1h1y,p->r1h1y,p->i1h1y,
393 						p->r1h2y,p->i1h2y,
394 	p->r1h2y,p->i1h2y,p->r1h2y,p->i1h2y);
395 	      temp +=
396 	      S3v2F12(p->czzz,p->r1h1z,
397 	p->i1h1z,p->r1h1z,p->i1h1z,p->r1h1z,p->i1h1z,
398 						p->r1h2z,p->i1h2z,
399 	p->r1h2z,p->i1h2z,p->r1h2z,p->i1h2z)
400 	      +S3v2F12(p->cxxy,p->r1h1x,
401 	p->i1h1x,p->r1h1x,p->i1h1x,p->r1h1y,p->i1h1y,
402 						p->r1h2x,p->i1h2x,
403 	p->r1h2x,p->i1h2x,p->r1h2y,p->i1h2y);
404 	temp +=
405 	      S3v2F12(p->cxxz,p->r1h1x,
406 	p->i1h1x,p->r1h1x,p->i1h1x,p->r1h1z,p->i1h1z,
407 						p->r1h2x,p->i1h2x,
408 	p->r1h2x,p->i1h2x,p->r1h2z,p->i1h2z)
409 	      +S3v2F12(p->cxyy,p->r1h1x,
410 	p->i1h1x,p->r1h1y,p->i1h1y,p->r1h1y,p->i1h1y,
411 						p->r1h2x,p->i1h2x,
412 	p->r1h2y,p->i1h2y,p->r1h2y,p->i1h2y);
413 	      temp +=
414 	      S3v2F12(p->cyyz,p->r1h1y,
415 	p->i1h1y,p->r1h1y,p->i1h1y,p->r1h1z,p->i1h1z,
416 						p->r1h2y,p->i1h2y,
417 	p->r1h2y,p->i1h2y,p->r1h2z,p->i1h2z)
418 	      +S3v2F12(p->cxzz,p->r1h1x,
419 	p->i1h1x,p->r1h1z,p->i1h1z,p->r1h1z,p->i1h1z,
420 						p->r1h2x,p->i1h2x,
421 	p->r1h2z,p->i1h2z,p->r1h2z,p->i1h2z);
422 	temp +=
423 	      S3v2F12(p->cyzz,p->r1h1y,
424 	p->i1h1y,p->r1h1z,p->i1h1z,p->r1h1z,p->i1h1z,
425 						p->r1h2y,p->i1h2y,
426 	p->r1h2z,p->i1h2z,p->r1h2z,p->i1h2z)
427 	      +S3v2F12(p->cxyz,p->r1h1x,
428 	p->i1h1x,p->r1h1y,p->i1h1y,p->r1h1z,p->i1h1z,
429 						p->r1h2x,p->i1h2x,
430 	p->r1h2y,p->i1h2y,p->r1h2z,p->i1h2z);
431 
432 	return(temp/3.); /* divided by 3 to get kernel (otherwise we get 3*kernel) */
433 }
434 
435 double
DFi2F12(DpassStr * p)436 DFi2F12(DpassStr *p)
437 
438 				/* 40 vars - 16 + 6 + 6 + 6 + 6 */
439 {
440 double temp;
441 
442 	temp = S2i2F12(p->cxx,p->r1h1x,p->i1h1x,
443 	p->r1h1x,p->i1h1x,
444 						p->r1h2x,p->i1h2x,
445 	p->r1h2x,p->i1h2x,
446 						p->r2h11x,p->i2h11x,
447 	p->r2h11x,p->i2h11x,
448 						p->h2f1f2x,p->ih2f1f2x,
449 	p->h2f1f2x,p->ih2f1f2x);
450 	temp +=
451 	      S2i2F12(p->cyy,p->r1h1y,p->i1h1y,
452 	p->r1h1y,p->i1h1y,
453 						p->r1h2y,p->i1h2y,
454 	p->r1h2y,p->i1h2y,
455 						p->r2h11y,p->i2h11y,
456 	p->r2h11y,p->i2h11y,
457 						p->h2f1f2y,p->ih2f1f2y,
458 	p->h2f1f2y,p->ih2f1f2y);
459 	temp +=
460 	      S2i2F12(p->czz,p->r1h1z,p->i1h1z,
461 	p->r1h1z,p->i1h1z,
462 						p->r1h2z,p->i1h2z,
463 	p->r1h2z,p->i1h2z,
464 						p->r2h11z,p->i2h11z,
465 	p->r2h11z,p->i2h11z,
466 						p->h2f1f2z,p->ih2f1f2z,
467 	p->h2f1f2z,p->ih2f1f2z);
468 	      temp +=
469               S2i2F12(p->cxy,p->r1h1x,p->i1h1x,
470 	p->r1h1y,p->i1h1y,
471 						p->r1h2x,p->i1h2x,
472 	p->r1h2y,p->i1h2y,
473 						p->r2h11x,p->i2h11x,
474 	p->r2h11y,p->i2h11y,
475 						p->h2f1f2x,p->ih2f1f2x,
476 	p->h2f1f2y,p->ih2f1f2y);
477 	temp +=
478 	      S2i2F12(p->cyz,p->r1h1y,p->i1h1y,
479 	p->r1h1z,p->i1h1z,
480 						p->r1h2y,p->i1h2y,
481 	p->r1h2z,p->i1h2z,
482 						p->r2h11y,p->i2h11y,
483 	p->r2h11z,p->i2h11z,
484 						p->h2f1f2y,p->ih2f1f2y,
485 	p->h2f1f2z,p->ih2f1f2z);
486 	temp +=
487 	      S2i2F12(p->cxz,p->r1h1x,p->i1h1x,
488 	p->r1h1z,p->i1h1z,
489 						p->r1h2x,p->i1h2x,
490 	p->r1h2z,p->i1h2z,
491 						p->r2h11x,p->i2h11x,
492 	p->r2h11z,p->i2h11z,
493 						p->h2f1f2x,p->ih2f1f2x,
494 	p->h2f1f2z,p->ih2f1f2z);
495 	temp +=
496 	      S3i2F12(p->cxxx,p->r1h1x,
497 	p->i1h1x,p->r1h1x,p->i1h1x,p->r1h1x,p->i1h1x,
498 						p->r1h2x,p->i1h2x,
499 	p->r1h2x,p->i1h2x,p->r1h2x,p->i1h2x);
500 	      temp +=
501 	      S3i2F12(p->cyyy,p->r1h1y,
502 	p->i1h1y,p->r1h1y,p->i1h1y,p->r1h1y,p->i1h1y,
503 						p->r1h2y,p->i1h2y,
504 	p->r1h2y,p->i1h2y,p->r1h2y,p->i1h2y)
505 	      +S3i2F12(p->czzz,p->r1h1z,
506 	p->i1h1z,p->r1h1z,p->i1h1z,p->r1h1z,p->i1h1z,
507 						p->r1h2z,p->i1h2z,
508 	p->r1h2z,p->i1h2z,p->r1h2z,p->i1h2z);
509 	temp +=
510 	      S3i2F12(p->cxxy,p->r1h1x,
511 	p->i1h1x,p->r1h1x,p->i1h1x,p->r1h1y,p->i1h1y,
512 						p->r1h2x,p->i1h2x,
513 	p->r1h2x,p->i1h2x,p->r1h2y,p->i1h2y)
514 	      +S3i2F12(p->cxxz,p->r1h1x,
515 	p->i1h1x,p->r1h1x,p->i1h1x,p->r1h1z,p->i1h1z,
516 						p->r1h2x,p->i1h2x,
517 	p->r1h2x,p->i1h2x,p->r1h2z,p->i1h2z);
518 	temp +=
519 	      S3i2F12(p->cxyy,p->r1h1x,
520 	p->i1h1x,p->r1h1y,p->i1h1y,p->r1h1y,p->i1h1y,
521 						p->r1h2x,p->i1h2x,
522 	p->r1h2y,p->i1h2y,p->r1h2y,p->i1h2y)
523 	      +S3i2F12(p->cyyz,p->r1h1y,
524 	p->i1h1y,p->r1h1y,p->i1h1y,p->r1h1z,p->i1h1z,
525 						p->r1h2y,p->i1h2y,
526 	p->r1h2y,p->i1h2y,p->r1h2z,p->i1h2z);
527 	      temp +=
528 	      S3i2F12(p->cxzz,p->r1h1x,
529 	p->i1h1x,p->r1h1z,p->i1h1z,p->r1h1z,p->i1h1z,
530 						p->r1h2x,p->i1h2x,
531 	p->r1h2z,p->i1h2z,p->r1h2z,p->i1h2z);
532 	      temp += S3i2F12(p->cyzz,p->r1h1y,
533 	p->i1h1y,p->r1h1z,p->i1h1z,p->r1h1z,p->i1h1z,
534 						p->r1h2y,p->i1h2y,
535 	p->r1h2z,p->i1h2z,p->r1h2z,p->i1h2z)
536 	      +S3i2F12(p->cxyz,p->r1h1x,
537 	p->i1h1x,p->r1h1y,p->i1h1y,p->r1h1z,p->i1h1z,
538 						p->r1h2x,p->i1h2x,
539 	p->r1h2y,p->i1h2y,p->r1h2z,p->i1h2z);
540 
541 	return(temp/3.); /* divided by 3 to get kernel (otherwise we get 3*kernel) */
542 }
543 
544 double
D1n2F1(double cxx,double r1h1x,double i1h1x)545 D1n2F1(double cxx, double r1h1x, double i1h1x)
546 
547 			/* 12 variables */
548 
549 
550 {
551 double temp;
552 
553 	temp = S2v2F1(cxx,r1h1x,i1h1x,r1h1x,i1h1x);
554 
555 	       return(temp);
556 }
557 
558 double
D1n3F1(double cxx,double cxxx,double r1h1x,double i1h1x,double r2h11x,double i2h11x)559 D1n3F1(double cxx, double cxxx, double r1h1x, double i1h1x, double r2h11x, double i2h11x)
560 {
561 double temp;
562 
563 	temp = S2v3F1(cxx,r1h1x,i1h1x,r1h1x,i1h1x,r2h11x,i2h11x,r2h11x,i2h11x)
564 	      +S3v3F1(cxxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h1x,i1h1x);
565 
566 	      return(temp);
567 }
568 
569 
570 double
D1nF12(double cxx,double r1h1x,double i1h1x,double r1h2x,double i1h2x)571 D1nF12(double cxx, double r1h1x, double i1h1x, double r1h2x, double i1h2x)
572 
573 			/* 18 args - 6 + 6 + 6	*/
574 
575 
576 
577 {
578 double temp;
579 
580 	temp = S2vF12(cxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h2x,i1h2x,r1h2x,i1h2x);
581 
582 	      return(0.5*temp);
583 }
584 
585 
586 double
D1n2F12(double cxx,double cxxx,double r1h1x,double i1h1x,double r1h2x,double i1h2x,double r2h11x,double i2h11x,double h2f1f2x,double ih2f1f2x)587 D1n2F12(double cxx, double cxxx, double r1h1x, double i1h1x, double r1h2x, double i1h2x, double r2h11x, double i2h11x, double h2f1f2x, double ih2f1f2x)
588 
589 				/* 40 vars - 16 + 6 + 6 + 6 + 6 */
590 
591 
592 
593 
594 
595 {
596 double temp;
597 
598 	temp = S2v2F12(cxx,r1h1x,i1h1x,r1h1x,i1h1x,
599 						r1h2x,i1h2x,r1h2x,i1h2x,
600 						r2h11x,i2h11x,r2h11x,i2h11x,
601 						h2f1f2x,ih2f1f2x,h2f1f2x,ih2f1f2x)
602 	      +S3v2F12(cxxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h1x,i1h1x,
603 						r1h2x,i1h2x,r1h2x,i1h2x,r1h2x,i1h2x);
604 
605 	return(temp/3.); /* divided by 3 to get kernel (otherwise we get 3*kernel) */
606 }
607 
608 
609 double
D1i2F1(double cxx,double r1h1x,double i1h1x)610 D1i2F1(double cxx, double r1h1x, double i1h1x)
611 
612 			/* 12 variables */
613 
614 
615 {
616 double temp;
617 
618 	temp = S2i2F1(cxx,r1h1x,i1h1x,r1h1x,i1h1x);
619 
620 	       return(temp);
621 }
622 
623 
624 double
D1i3F1(double cxx,double cxxx,double r1h1x,double i1h1x,double r2h11x,double i2h11x)625 D1i3F1(double cxx, double cxxx, double r1h1x, double i1h1x, double r2h11x, double i2h11x)
626 {
627 double temp;
628 
629 	temp = S2i3F1(cxx,r1h1x,i1h1x,r1h1x,i1h1x,r2h11x,i2h11x,r2h11x,i2h11x)
630 	      +S3i3F1(cxxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h1x,i1h1x);
631 
632 	      return(temp);
633 }
634 
635 
636 double
D1iF12(double cxx,double r1h1x,double i1h1x,double r1h2x,double i1h2x)637 D1iF12(double cxx, double r1h1x, double i1h1x, double r1h2x, double i1h2x)
638 
639 			/* 18 args - 6 + 6 + 6	*/
640 
641 
642 
643 {
644 double temp;
645 
646 	temp = S2iF12(cxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h2x,i1h2x,r1h2x,i1h2x);
647 
648 	      return(0.5*temp);
649 }
650 
651 
652 double
D1i2F12(double cxx,double cxxx,double r1h1x,double i1h1x,double r1h2x,double i1h2x,double r2h11x,double i2h11x,double h2f1f2x,double ih2f1f2x)653 D1i2F12(double cxx, double cxxx, double r1h1x, double i1h1x, double r1h2x, double i1h2x, double r2h11x, double i2h11x, double h2f1f2x, double ih2f1f2x)
654 
655 				/* 40 vars - 16 + 6 + 6 + 6 + 6 */
656 
657 
658 
659 
660 
661 {
662 double temp;
663 
664 	temp = S2i2F12(cxx,r1h1x,i1h1x,r1h1x,i1h1x,
665 						r1h2x,i1h2x,r1h2x,i1h2x,
666 						r2h11x,i2h11x,r2h11x,i2h11x,
667 						h2f1f2x,ih2f1f2x,h2f1f2x,ih2f1f2x)
668 	      +S3i2F12(cxxx,r1h1x,i1h1x,r1h1x,i1h1x,r1h1x,i1h1x,
669 						r1h2x,i1h2x,r1h2x,i1h2x,r1h2x,i1h2x);
670 
671 	return(temp/3.); /* divided by 3 to get kernel (otherwise we get 3*kernel) */
672 }
673 
674