54 int korn[3][4]={{0,1,2,3},{0,1,1,3},{3,1,2,3}};
55 int kcsi[4]={0,0,1,1};
56 int keta[4]={1,0,0,1};
57 DOUBLE signc,signj[4]={-1.0,1.0,-1.0,1.0};
64 struct vector a1p[2],a2p[2];
81 DOUBLE tanp,hnumer,qdotq,denom;
82 DOUBLE aa1,qdota1,aqxa1,alog1;
83 DOUBLE aa2,qdota2,aqxa2,alog2;
92 pij[0].x = .25*(element->
x[0].
x+ element->
x[1].
x+ element->
x[2].
x+ element->
x[3].
x);
93 pij[0].y = .25*(element->
x[0].
y+ element->
x[1].
y+ element->
x[2].
y+ element->
x[3].
y);
94 pij[0].z = .25*(element->
x[0].
z+ element->
x[1].
z+ element->
x[2].
z+ element->
x[3].
z);
96 pij[1].x = .25*(element->
x[1].
x+ element->
x[0].
x- element->
x[2].
x- element->
x[3].
x);
97 pij[1].y = .25*(element->
x[1].
y+ element->
x[0].
y- element->
x[2].
y- element->
x[3].
y);
98 pij[1].z = .25*(element->
x[1].
z+ element->
x[0].
z- element->
x[2].
z- element->
x[3].
z);
100 pij[2].x = .25*(element->
x[1].
x- element->
x[0].
x+ element->
x[2].
x- element->
x[3].
x);
101 pij[2].y = .25*(element->
x[1].
y- element->
x[0].
y+ element->
x[2].
y- element->
x[3].
y);
102 pij[2].z = .25*(element->
x[1].
z- element->
x[0].
z+ element->
x[2].
z- element->
x[3].
z);
104 pij[3].x = .25*(element->
x[1].
x- element->
x[0].
x- element->
x[2].
x+ element->
x[3].
x);
105 pij[3].y = .25*(element->
x[1].
y- element->
x[0].
y- element->
x[2].
y+ element->
x[3].
y);
106 pij[3].z = .25*(element->
x[1].
z- element->
x[0].
z- element->
x[2].
z+ element->
x[3].
z);
127 if( a1a1 > eps)
goto l73;
140 unc.x = ((a1[0].y + a1[1].y)*(a2[0].
z + a2[1].
z) - (a1[0].z + a1[1].z)*(a2[0].
y + a2[1].
y))*.25;
141 unc.y = ((a1[0].z + a1[1].z)*(a2[0].
x + a2[1].
x) - (a1[0].x + a1[1].x)*(a2[0].z + a2[1].z))*.25;
142 unc.z = ((a1[0].x + a1[1].x)*(a2[0].y + a2[1].y) - (a1[0].y + a1[1].y)*(a2[0].x + a2[1].x))*.25;
164 for(iloop=0;iloop<3;iloop++){
169 if(0 == iloop)
goto l105;
181 for(jcornr=0;jcornr<4;jcornr++){
184 icornr = korn[iloop][jcornr];
185 qa1xa2[jcornr] = 0.0;
187 vec_cross(&un[jcornr],a1p[ieta],a2p[icsi]);
188 qa1xa2[jcornr] =
vec_dot(q[icornr],un[jcornr]);
190 if(qa1xa2[jcornr] < (-eps)){
193 if(qa1xa2[jcornr] > (eps)){
199 if(0 != iloop )
goto l125;
201 if(1 == kode )
goto l125;
202 if(4 == abs(ks) || 0 != natri )
goto l125;
208 if(fabs(qa1xa2[0]) > eps) sj =
SIGN(1,qa1xa2[1]);
209 for(jcornr=0;jcornr<4;jcornr++){
212 signc = signj[jcornr];
213 icornr = korn[iloop][jcornr];
217 if(4 != abs(ks) )
goto l140;
218 if(1 == kode )
goto l140;
221 qdotq =
vec_dot(q[icornr],q[icornr]);
222 denom = sqrt(qdotq) * fabs(qa1xa2[jcornr]);
223 cplt = hnumer + I*denom;
224 if(denom > eps) tanp = atan2l(hnumer,denom)*sj;
230 qdota1 =
vec_dot(q[icornr],a1p[ieta]);
233 if(aqxa1 > eps) alog1 = asinhl(qdota1/aqxa1)/aa1;
236 qdota2 =
vec_dot(q[icornr],a2p[icsi]);
239 if(aqxa2 > eps) alog2 = asinhl(qdota2/aqxa2)/aa2;
243 bij = bij - signc*(-unqxa1*alog1+unqxa2*alog2+pzun*tanp);
248 if(2 == nloop)
break;
251 *source = bij*consta;
252 *doublet = cij*consta*signe;
253 *ratelet = cij*consta*signe*rc1;
void vec_normalize(struct vector *v)
Definition: math.c:130
void vec_scale(struct vector *v1, DOUBLE d)
Definition: math.c:170
void vec_copy(struct vector *vdest, const struct vector vsrc)
Definition: math.c:158
#define SIGN(x, y)
Definition: functions.h:27
vector struct to hold triplets.
Definition: structs.h:29
DOUBLE vec_mod(struct vector v1)
Definition: math.c:121
void vec_zero(struct vector *v)
Definition: math.c:146
#define COMPLEX
Definition: types.h:48
DOUBLE vec_mod_square(struct vector v1)
Definition: math.c:108
DOUBLE z
Definition: structs.h:35
void vec_diff(struct vector *vdest, const struct vector v1, const struct vector v2)
Definition: math.c:52
DOUBLE vec_dot(struct vector v1, struct vector v2)
Definition: math.c:34
double DOUBLE
Definition: types.h:44
void vec_cross(struct vector *vdest, const struct vector v1, const struct vector v2)
Definition: math.c:92
DOUBLE x
Definition: structs.h:31
struct vector x[4]
Definition: structs.h:46
DOUBLE y
Definition: structs.h:33