xref: /phasta/phSolver/common/symhex.c (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen #include <stdlib.h>
2*59599516SKenneth E. Jansen 
3*59599516SKenneth E. Jansen #include <FCMangle.h>
4*59599516SKenneth E. Jansen #define symhex FortranCInterface_GLOBAL_(symhex, SYMHEX)
5*59599516SKenneth E. Jansen 
6*59599516SKenneth E. Jansen typedef double DARR4[4];
7*59599516SKenneth E. Jansen 
8*59599516SKenneth E. Jansen int hexIntPnt(int,DARR4**,double **);
9*59599516SKenneth E. Jansen 
10*59599516SKenneth E. Jansen symhex(int *n1, double pt[][4], double wt[], int *err)
11*59599516SKenneth E. Jansen {
12*59599516SKenneth E. Jansen   double *lwt;
13*59599516SKenneth E. Jansen   DARR4 *lpt;
14*59599516SKenneth E. Jansen   int i,j;
15*59599516SKenneth E. Jansen   *err = hexIntPnt(*n1, &lpt, &lwt);
16*59599516SKenneth E. Jansen   for(i=0; i < *n1; i++) {
17*59599516SKenneth E. Jansen     wt[i] = lwt[i];
18*59599516SKenneth E. Jansen     for(j=0; j <4; j++)
19*59599516SKenneth E. Jansen       pt[i][j]=lpt[i][j];
20*59599516SKenneth E. Jansen   }
21*59599516SKenneth E. Jansen }
22*59599516SKenneth E. Jansen 
23*59599516SKenneth E. Jansen /*$Id$*/
24*59599516SKenneth E. Jansen #include <stdio.h>
25*59599516SKenneth E. Jansen 
26*59599516SKenneth E. Jansen /* these are the rule 2 int points and weights */
27*59599516SKenneth E. Jansen 
28*59599516SKenneth E. Jansen #define Qp21 -0.577350269189626
29*59599516SKenneth E. Jansen #define Qp22  0.577350269189626
30*59599516SKenneth E. Jansen #define Qw2   1.000000000000000
31*59599516SKenneth E. Jansen 
32*59599516SKenneth E. Jansen /* these are the rule 3 int points and weights */
33*59599516SKenneth E. Jansen 
34*59599516SKenneth E. Jansen #define Qp31  -0.774596669241483
35*59599516SKenneth E. Jansen #define Qp32   0.000000000000000
36*59599516SKenneth E. Jansen #define Qp33   0.774596669241483
37*59599516SKenneth E. Jansen #define Qw31   0.555555555555556
38*59599516SKenneth E. Jansen #define Qw32   0.888888888888889
39*59599516SKenneth E. Jansen #define Qw33   0.555555555555556
40*59599516SKenneth E. Jansen #define Qw311  0.308641975308642
41*59599516SKenneth E. Jansen #define Qw321  0.493827160493831
42*59599516SKenneth E. Jansen #define Qw322  0.790123456790124
43*59599516SKenneth E. Jansen 
44*59599516SKenneth E. Jansen 
45*59599516SKenneth E. Jansen #define Qw3111 0.171467764060361
46*59599516SKenneth E. Jansen #define Qw3112 0.274348422496571
47*59599516SKenneth E. Jansen #define Qw3113 0.171467764060361
48*59599516SKenneth E. Jansen #define Qw3121 0.274348422496571
49*59599516SKenneth E. Jansen #define Qw3122 0.438957475994513
50*59599516SKenneth E. Jansen #define Qw3123 0.274348422496571
51*59599516SKenneth E. Jansen #define Qw3131 0.171467764060361
52*59599516SKenneth E. Jansen #define Qw3132 0.274348422496571
53*59599516SKenneth E. Jansen #define Qw3133 0.171467764060361
54*59599516SKenneth E. Jansen 
55*59599516SKenneth E. Jansen #define Qw3211 0.274348422496571
56*59599516SKenneth E. Jansen #define Qw3212 0.438957475994513
57*59599516SKenneth E. Jansen #define Qw3213 0.274348422496571
58*59599516SKenneth E. Jansen #define Qw3221 0.438957475994513
59*59599516SKenneth E. Jansen #define Qw3222 0.702331961591221
60*59599516SKenneth E. Jansen #define Qw3223 0.438957475994513
61*59599516SKenneth E. Jansen #define Qw3231 0.274348422496571
62*59599516SKenneth E. Jansen #define Qw3232 0.438957475994513
63*59599516SKenneth E. Jansen #define Qw3233 0.274348422496571
64*59599516SKenneth E. Jansen 
65*59599516SKenneth E. Jansen #define Qw3311 0.171467764060361
66*59599516SKenneth E. Jansen #define Qw3312 0.274348422496571
67*59599516SKenneth E. Jansen #define Qw3313 0.171467764060361
68*59599516SKenneth E. Jansen #define Qw3321 0.274348422496571
69*59599516SKenneth E. Jansen #define Qw3322 0.438957475994513
70*59599516SKenneth E. Jansen #define Qw3323 0.274348422496571
71*59599516SKenneth E. Jansen #define Qw3331 0.171467764060361
72*59599516SKenneth E. Jansen #define Qw3332 0.274348422496571
73*59599516SKenneth E. Jansen #define Qw3333 0.171467764060357
74*59599516SKenneth E. Jansen 
75*59599516SKenneth E. Jansen /* Rule 1*/
76*59599516SKenneth E. Jansen 
77*59599516SKenneth E. Jansen static double  rstw1[][4] = {
78*59599516SKenneth E. Jansen   { 0.0, 0.0, 0.0, 0.0 }
79*59599516SKenneth E. Jansen };
80*59599516SKenneth E. Jansen 
81*59599516SKenneth E. Jansen static double twt1[] = { 8.0000000 };
82*59599516SKenneth E. Jansen 
83*59599516SKenneth E. Jansen 
84*59599516SKenneth E. Jansen /* Rule 2*/
85*59599516SKenneth E. Jansen 
86*59599516SKenneth E. Jansen 
87*59599516SKenneth E. Jansen static double rstw8[][4] = {
88*59599516SKenneth E. Jansen   {Qp21,Qp21,Qp21,0.0},
89*59599516SKenneth E. Jansen   {Qp22,Qp21,Qp21,0.0},
90*59599516SKenneth E. Jansen   {Qp21,Qp22,Qp21,0.0},
91*59599516SKenneth E. Jansen   {Qp22,Qp22,Qp21,0.0},
92*59599516SKenneth E. Jansen   {Qp21,Qp21,Qp22,0.0},
93*59599516SKenneth E. Jansen   {Qp22,Qp21,Qp22,0.0},
94*59599516SKenneth E. Jansen   {Qp21,Qp22,Qp22,0.0},
95*59599516SKenneth E. Jansen   {Qp22,Qp22,Qp22,0.0}
96*59599516SKenneth E. Jansen };
97*59599516SKenneth E. Jansen 
98*59599516SKenneth E. Jansen static double twt8[] = {Qw2,Qw2,Qw2,Qw2,Qw2,Qw2,Qw2,Qw2};
99*59599516SKenneth E. Jansen 
100*59599516SKenneth E. Jansen /* Rule 3*/
101*59599516SKenneth E. Jansen 
102*59599516SKenneth E. Jansen static double rstw27[][4] = {
103*59599516SKenneth E. Jansen   { Qp31,  Qp31,  Qp31,  0.0 },
104*59599516SKenneth E. Jansen   { Qp32,  Qp31,  Qp31,  0.0 },
105*59599516SKenneth E. Jansen   { Qp33,  Qp31,  Qp31,  0.0 },
106*59599516SKenneth E. Jansen   { Qp31,  Qp32,  Qp31,  0.0 },
107*59599516SKenneth E. Jansen   { Qp32,  Qp32,  Qp31,  0.0 },
108*59599516SKenneth E. Jansen   { Qp33,  Qp32,  Qp31,  0.0 },
109*59599516SKenneth E. Jansen   { Qp31,  Qp33,  Qp31,  0.0 },
110*59599516SKenneth E. Jansen   { Qp32,  Qp33,  Qp31,  0.0 },
111*59599516SKenneth E. Jansen   { Qp33,  Qp33,  Qp31,  0.0 },
112*59599516SKenneth E. Jansen   { Qp31,  Qp31,  Qp32,  0.0 },
113*59599516SKenneth E. Jansen   { Qp32,  Qp31,  Qp32,  0.0 },
114*59599516SKenneth E. Jansen   { Qp33,  Qp31,  Qp32,  0.0 },
115*59599516SKenneth E. Jansen   { Qp31,  Qp32,  Qp32,  0.0 },
116*59599516SKenneth E. Jansen   { Qp32,  Qp32,  Qp32,  0.0 },
117*59599516SKenneth E. Jansen   { Qp33,  Qp32,  Qp32,  0.0 },
118*59599516SKenneth E. Jansen   { Qp31,  Qp33,  Qp32,  0.0 },
119*59599516SKenneth E. Jansen   { Qp32,  Qp33,  Qp32,  0.0 },
120*59599516SKenneth E. Jansen   { Qp33,  Qp33,  Qp32,  0.0 },
121*59599516SKenneth E. Jansen   { Qp31,  Qp31,  Qp33,  0.0 },
122*59599516SKenneth E. Jansen   { Qp32,  Qp31,  Qp33,  0.0 },
123*59599516SKenneth E. Jansen   { Qp33,  Qp31,  Qp33,  0.0 },
124*59599516SKenneth E. Jansen   { Qp31,  Qp32,  Qp33,  0.0 },
125*59599516SKenneth E. Jansen   { Qp32,  Qp32,  Qp33,  0.0 },
126*59599516SKenneth E. Jansen   { Qp33,  Qp32,  Qp33,  0.0 },
127*59599516SKenneth E. Jansen   { Qp31,  Qp33,  Qp33,  0.0 },
128*59599516SKenneth E. Jansen   { Qp32,  Qp33,  Qp33,  0.0 },
129*59599516SKenneth E. Jansen   { Qp33,  Qp33,  Qp33,  0.0 }
130*59599516SKenneth E. Jansen };
131*59599516SKenneth E. Jansen 
132*59599516SKenneth E. Jansen 
133*59599516SKenneth E. Jansen static double twt27[] =
134*59599516SKenneth E. Jansen { Qw3111, Qw3211, Qw3311, Qw3121, Qw3221, Qw3321, Qw3131, Qw3231, Qw3331,
135*59599516SKenneth E. Jansen   Qw3112, Qw3212, Qw3312, Qw3122, Qw3222, Qw3322, Qw3132, Qw3232, Qw3332,
136*59599516SKenneth E. Jansen   Qw3113, Qw3213, Qw3313, Qw3123, Qw3223, Qw3323, Qw3133, Qw3233, Qw3333 };
137*59599516SKenneth E. Jansen 
138*59599516SKenneth E. Jansen 
139*59599516SKenneth E. Jansen 
140*59599516SKenneth E. Jansen #ifdef __cplusplus
141*59599516SKenneth E. Jansen extern "C" {
142*59599516SKenneth E. Jansen #endif
143*59599516SKenneth E. Jansen 
144*59599516SKenneth E. Jansen int hexIntPnt(int nint, DARR4 **bcord, double **wt)
145*59599516SKenneth E. Jansen {
146*59599516SKenneth E. Jansen   int retval = 1;
147*59599516SKenneth E. Jansen   int i,j,k,l;
148*59599516SKenneth E. Jansen   DARR4 *rstw;
149*59599516SKenneth E. Jansen   double *twt;
150*59599516SKenneth E. Jansen 
151*59599516SKenneth E. Jansen   /* Rule 4 & 5*/
152*59599516SKenneth E. Jansen   /* rule 5 has not been tested */
153*59599516SKenneth E. Jansen   double bp4[]={-0.8611363115940526,-0.3399810435848563,0.339981043584856,0.8611363115940526};
154*59599516SKenneth E. Jansen   double bp5[]={-0.9061798459386640,-0.5384693101056831,0,0.5384693101056831,0.9061798459386640};
155*59599516SKenneth E. Jansen   double bw4[]={0.3478548451374539,0.6521451548625461,0.6521451548625461,0.3478548451374539};
156*59599516SKenneth E. Jansen   double bw5[]={0.2369268850561891,0.4786286704993665,0.5688888888888889,0.4786286704993665,0.2369268850561891};
157*59599516SKenneth E. Jansen 
158*59599516SKenneth E. Jansen 
159*59599516SKenneth E. Jansen   if( nint == 1){ *bcord = rstw1; *wt = twt1;}
160*59599516SKenneth E. Jansen 
161*59599516SKenneth E. Jansen   else if( nint == 8 ){*bcord = rstw8 ; *wt = twt8; }
162*59599516SKenneth E. Jansen 
163*59599516SKenneth E. Jansen   else if( nint == 27 ) {*bcord = rstw27 ; *wt = twt27; }
164*59599516SKenneth E. Jansen 
165*59599516SKenneth E. Jansen   else if( nint == 64 ) {
166*59599516SKenneth E. Jansen 
167*59599516SKenneth E. Jansen     rstw = (DARR4 *)malloc(64*sizeof(DARR4));
168*59599516SKenneth E. Jansen     twt   = (double *)malloc(64*sizeof(double));
169*59599516SKenneth E. Jansen 
170*59599516SKenneth E. Jansen     i=j=k=0;
171*59599516SKenneth E. Jansen 
172*59599516SKenneth E. Jansen     for(l=0;l<64;l++){
173*59599516SKenneth E. Jansen       rstw[l][0]=bp4[i];
174*59599516SKenneth E. Jansen       rstw[l][1]=bp4[j];
175*59599516SKenneth E. Jansen       rstw[l][2]=bp4[k];
176*59599516SKenneth E. Jansen       rstw[l][3]=0.0;
177*59599516SKenneth E. Jansen       twt[l]=bw4[i]*bw4[j]*bw4[k];
178*59599516SKenneth E. Jansen       i++;
179*59599516SKenneth E. Jansen       if(i == 4){
180*59599516SKenneth E. Jansen 	i=0 ; j++ ;
181*59599516SKenneth E. Jansen 	if(j == 4) { j=0; k++;}
182*59599516SKenneth E. Jansen       }
183*59599516SKenneth E. Jansen     }
184*59599516SKenneth E. Jansen     *bcord = rstw; *wt = twt;
185*59599516SKenneth E. Jansen 
186*59599516SKenneth E. Jansen   } else if( nint == 125) {
187*59599516SKenneth E. Jansen 
188*59599516SKenneth E. Jansen     rstw = (DARR4 *)malloc(125*sizeof(DARR4));
189*59599516SKenneth E. Jansen     twt   = (double *)malloc(125*sizeof(double));
190*59599516SKenneth E. Jansen 
191*59599516SKenneth E. Jansen     i=j=k=0;
192*59599516SKenneth E. Jansen 
193*59599516SKenneth E. Jansen     for(l=0;l<125;l++){
194*59599516SKenneth E. Jansen       rstw[l][0]=bp5[i];
195*59599516SKenneth E. Jansen       rstw[l][1]=bp5[j];
196*59599516SKenneth E. Jansen       rstw[l][2]=bp5[k];
197*59599516SKenneth E. Jansen       rstw[l][3]=0.0;
198*59599516SKenneth E. Jansen       twt[l]=bw5[i]*bw5[j]*bw5[k];
199*59599516SKenneth E. Jansen       i++;
200*59599516SKenneth E. Jansen       if(i == 5){
201*59599516SKenneth E. Jansen 	i=0 ; j++ ;
202*59599516SKenneth E. Jansen 	if(j == 5) { j=0; k++;}
203*59599516SKenneth E. Jansen       }
204*59599516SKenneth E. Jansen     }
205*59599516SKenneth E. Jansen     *bcord = rstw; *wt = twt;
206*59599516SKenneth E. Jansen 
207*59599516SKenneth E. Jansen   } else {
208*59599516SKenneth E. Jansen 
209*59599516SKenneth E. Jansen     fprintf(stderr,"\n%d integration points unsupported; give {8,27,64,125,.}\n",nint);
210*59599516SKenneth E. Jansen     retval = 0;
211*59599516SKenneth E. Jansen   }
212*59599516SKenneth E. Jansen   return retval ;
213*59599516SKenneth E. Jansen }
214*59599516SKenneth E. Jansen 
215*59599516SKenneth E. Jansen #ifdef __cplusplus
216*59599516SKenneth E. Jansen }
217*59599516SKenneth E. Jansen #endif
218