159599516SKenneth E. Jansen #include <stdlib.h>
259599516SKenneth E. Jansen
359599516SKenneth E. Jansen #include <FCMangle.h>
459599516SKenneth E. Jansen #define symhex FortranCInterface_GLOBAL_(symhex, SYMHEX)
559599516SKenneth E. Jansen
659599516SKenneth E. Jansen typedef double DARR4[4];
759599516SKenneth E. Jansen
859599516SKenneth E. Jansen int hexIntPnt(int,DARR4**,double **);
959599516SKenneth E. Jansen
symhex(int * n1,double pt[][4],double wt[],int * err)10*f34e7d5cSCameron Smith void symhex(int *n1, double pt[][4], double wt[], int *err)
1159599516SKenneth E. Jansen {
1259599516SKenneth E. Jansen double *lwt;
1359599516SKenneth E. Jansen DARR4 *lpt;
1459599516SKenneth E. Jansen int i,j;
1559599516SKenneth E. Jansen *err = hexIntPnt(*n1, &lpt, &lwt);
1659599516SKenneth E. Jansen for(i=0; i < *n1; i++) {
1759599516SKenneth E. Jansen wt[i] = lwt[i];
1859599516SKenneth E. Jansen for(j=0; j <4; j++)
1959599516SKenneth E. Jansen pt[i][j]=lpt[i][j];
2059599516SKenneth E. Jansen }
2159599516SKenneth E. Jansen }
2259599516SKenneth E. Jansen
2359599516SKenneth E. Jansen /*$Id$*/
2459599516SKenneth E. Jansen #include <stdio.h>
2559599516SKenneth E. Jansen
2659599516SKenneth E. Jansen /* these are the rule 2 int points and weights */
2759599516SKenneth E. Jansen
2859599516SKenneth E. Jansen #define Qp21 -0.577350269189626
2959599516SKenneth E. Jansen #define Qp22 0.577350269189626
3059599516SKenneth E. Jansen #define Qw2 1.000000000000000
3159599516SKenneth E. Jansen
3259599516SKenneth E. Jansen /* these are the rule 3 int points and weights */
3359599516SKenneth E. Jansen
3459599516SKenneth E. Jansen #define Qp31 -0.774596669241483
3559599516SKenneth E. Jansen #define Qp32 0.000000000000000
3659599516SKenneth E. Jansen #define Qp33 0.774596669241483
3759599516SKenneth E. Jansen #define Qw31 0.555555555555556
3859599516SKenneth E. Jansen #define Qw32 0.888888888888889
3959599516SKenneth E. Jansen #define Qw33 0.555555555555556
4059599516SKenneth E. Jansen #define Qw311 0.308641975308642
4159599516SKenneth E. Jansen #define Qw321 0.493827160493831
4259599516SKenneth E. Jansen #define Qw322 0.790123456790124
4359599516SKenneth E. Jansen
4459599516SKenneth E. Jansen
4559599516SKenneth E. Jansen #define Qw3111 0.171467764060361
4659599516SKenneth E. Jansen #define Qw3112 0.274348422496571
4759599516SKenneth E. Jansen #define Qw3113 0.171467764060361
4859599516SKenneth E. Jansen #define Qw3121 0.274348422496571
4959599516SKenneth E. Jansen #define Qw3122 0.438957475994513
5059599516SKenneth E. Jansen #define Qw3123 0.274348422496571
5159599516SKenneth E. Jansen #define Qw3131 0.171467764060361
5259599516SKenneth E. Jansen #define Qw3132 0.274348422496571
5359599516SKenneth E. Jansen #define Qw3133 0.171467764060361
5459599516SKenneth E. Jansen
5559599516SKenneth E. Jansen #define Qw3211 0.274348422496571
5659599516SKenneth E. Jansen #define Qw3212 0.438957475994513
5759599516SKenneth E. Jansen #define Qw3213 0.274348422496571
5859599516SKenneth E. Jansen #define Qw3221 0.438957475994513
5959599516SKenneth E. Jansen #define Qw3222 0.702331961591221
6059599516SKenneth E. Jansen #define Qw3223 0.438957475994513
6159599516SKenneth E. Jansen #define Qw3231 0.274348422496571
6259599516SKenneth E. Jansen #define Qw3232 0.438957475994513
6359599516SKenneth E. Jansen #define Qw3233 0.274348422496571
6459599516SKenneth E. Jansen
6559599516SKenneth E. Jansen #define Qw3311 0.171467764060361
6659599516SKenneth E. Jansen #define Qw3312 0.274348422496571
6759599516SKenneth E. Jansen #define Qw3313 0.171467764060361
6859599516SKenneth E. Jansen #define Qw3321 0.274348422496571
6959599516SKenneth E. Jansen #define Qw3322 0.438957475994513
7059599516SKenneth E. Jansen #define Qw3323 0.274348422496571
7159599516SKenneth E. Jansen #define Qw3331 0.171467764060361
7259599516SKenneth E. Jansen #define Qw3332 0.274348422496571
7359599516SKenneth E. Jansen #define Qw3333 0.171467764060357
7459599516SKenneth E. Jansen
7559599516SKenneth E. Jansen /* Rule 1*/
7659599516SKenneth E. Jansen
7759599516SKenneth E. Jansen static double rstw1[][4] = {
7859599516SKenneth E. Jansen { 0.0, 0.0, 0.0, 0.0 }
7959599516SKenneth E. Jansen };
8059599516SKenneth E. Jansen
8159599516SKenneth E. Jansen static double twt1[] = { 8.0000000 };
8259599516SKenneth E. Jansen
8359599516SKenneth E. Jansen
8459599516SKenneth E. Jansen /* Rule 2*/
8559599516SKenneth E. Jansen
8659599516SKenneth E. Jansen
8759599516SKenneth E. Jansen static double rstw8[][4] = {
8859599516SKenneth E. Jansen {Qp21,Qp21,Qp21,0.0},
8959599516SKenneth E. Jansen {Qp22,Qp21,Qp21,0.0},
9059599516SKenneth E. Jansen {Qp21,Qp22,Qp21,0.0},
9159599516SKenneth E. Jansen {Qp22,Qp22,Qp21,0.0},
9259599516SKenneth E. Jansen {Qp21,Qp21,Qp22,0.0},
9359599516SKenneth E. Jansen {Qp22,Qp21,Qp22,0.0},
9459599516SKenneth E. Jansen {Qp21,Qp22,Qp22,0.0},
9559599516SKenneth E. Jansen {Qp22,Qp22,Qp22,0.0}
9659599516SKenneth E. Jansen };
9759599516SKenneth E. Jansen
9859599516SKenneth E. Jansen static double twt8[] = {Qw2,Qw2,Qw2,Qw2,Qw2,Qw2,Qw2,Qw2};
9959599516SKenneth E. Jansen
10059599516SKenneth E. Jansen /* Rule 3*/
10159599516SKenneth E. Jansen
10259599516SKenneth E. Jansen static double rstw27[][4] = {
10359599516SKenneth E. Jansen { Qp31, Qp31, Qp31, 0.0 },
10459599516SKenneth E. Jansen { Qp32, Qp31, Qp31, 0.0 },
10559599516SKenneth E. Jansen { Qp33, Qp31, Qp31, 0.0 },
10659599516SKenneth E. Jansen { Qp31, Qp32, Qp31, 0.0 },
10759599516SKenneth E. Jansen { Qp32, Qp32, Qp31, 0.0 },
10859599516SKenneth E. Jansen { Qp33, Qp32, Qp31, 0.0 },
10959599516SKenneth E. Jansen { Qp31, Qp33, Qp31, 0.0 },
11059599516SKenneth E. Jansen { Qp32, Qp33, Qp31, 0.0 },
11159599516SKenneth E. Jansen { Qp33, Qp33, Qp31, 0.0 },
11259599516SKenneth E. Jansen { Qp31, Qp31, Qp32, 0.0 },
11359599516SKenneth E. Jansen { Qp32, Qp31, Qp32, 0.0 },
11459599516SKenneth E. Jansen { Qp33, Qp31, Qp32, 0.0 },
11559599516SKenneth E. Jansen { Qp31, Qp32, Qp32, 0.0 },
11659599516SKenneth E. Jansen { Qp32, Qp32, Qp32, 0.0 },
11759599516SKenneth E. Jansen { Qp33, Qp32, Qp32, 0.0 },
11859599516SKenneth E. Jansen { Qp31, Qp33, Qp32, 0.0 },
11959599516SKenneth E. Jansen { Qp32, Qp33, Qp32, 0.0 },
12059599516SKenneth E. Jansen { Qp33, Qp33, Qp32, 0.0 },
12159599516SKenneth E. Jansen { Qp31, Qp31, Qp33, 0.0 },
12259599516SKenneth E. Jansen { Qp32, Qp31, Qp33, 0.0 },
12359599516SKenneth E. Jansen { Qp33, Qp31, Qp33, 0.0 },
12459599516SKenneth E. Jansen { Qp31, Qp32, Qp33, 0.0 },
12559599516SKenneth E. Jansen { Qp32, Qp32, Qp33, 0.0 },
12659599516SKenneth E. Jansen { Qp33, Qp32, Qp33, 0.0 },
12759599516SKenneth E. Jansen { Qp31, Qp33, Qp33, 0.0 },
12859599516SKenneth E. Jansen { Qp32, Qp33, Qp33, 0.0 },
12959599516SKenneth E. Jansen { Qp33, Qp33, Qp33, 0.0 }
13059599516SKenneth E. Jansen };
13159599516SKenneth E. Jansen
13259599516SKenneth E. Jansen
13359599516SKenneth E. Jansen static double twt27[] =
13459599516SKenneth E. Jansen { Qw3111, Qw3211, Qw3311, Qw3121, Qw3221, Qw3321, Qw3131, Qw3231, Qw3331,
13559599516SKenneth E. Jansen Qw3112, Qw3212, Qw3312, Qw3122, Qw3222, Qw3322, Qw3132, Qw3232, Qw3332,
13659599516SKenneth E. Jansen Qw3113, Qw3213, Qw3313, Qw3123, Qw3223, Qw3323, Qw3133, Qw3233, Qw3333 };
13759599516SKenneth E. Jansen
13859599516SKenneth E. Jansen
13959599516SKenneth E. Jansen
14059599516SKenneth E. Jansen #ifdef __cplusplus
14159599516SKenneth E. Jansen extern "C" {
14259599516SKenneth E. Jansen #endif
14359599516SKenneth E. Jansen
hexIntPnt(int nint,DARR4 ** bcord,double ** wt)14459599516SKenneth E. Jansen int hexIntPnt(int nint, DARR4 **bcord, double **wt)
14559599516SKenneth E. Jansen {
14659599516SKenneth E. Jansen int retval = 1;
14759599516SKenneth E. Jansen int i,j,k,l;
14859599516SKenneth E. Jansen DARR4 *rstw;
14959599516SKenneth E. Jansen double *twt;
15059599516SKenneth E. Jansen
15159599516SKenneth E. Jansen /* Rule 4 & 5*/
15259599516SKenneth E. Jansen /* rule 5 has not been tested */
15359599516SKenneth E. Jansen double bp4[]={-0.8611363115940526,-0.3399810435848563,0.339981043584856,0.8611363115940526};
15459599516SKenneth E. Jansen double bp5[]={-0.9061798459386640,-0.5384693101056831,0,0.5384693101056831,0.9061798459386640};
15559599516SKenneth E. Jansen double bw4[]={0.3478548451374539,0.6521451548625461,0.6521451548625461,0.3478548451374539};
15659599516SKenneth E. Jansen double bw5[]={0.2369268850561891,0.4786286704993665,0.5688888888888889,0.4786286704993665,0.2369268850561891};
15759599516SKenneth E. Jansen
15859599516SKenneth E. Jansen
15959599516SKenneth E. Jansen if( nint == 1){ *bcord = rstw1; *wt = twt1;}
16059599516SKenneth E. Jansen
16159599516SKenneth E. Jansen else if( nint == 8 ){*bcord = rstw8 ; *wt = twt8; }
16259599516SKenneth E. Jansen
16359599516SKenneth E. Jansen else if( nint == 27 ) {*bcord = rstw27 ; *wt = twt27; }
16459599516SKenneth E. Jansen
16559599516SKenneth E. Jansen else if( nint == 64 ) {
16659599516SKenneth E. Jansen
16759599516SKenneth E. Jansen rstw = (DARR4 *)malloc(64*sizeof(DARR4));
16859599516SKenneth E. Jansen twt = (double *)malloc(64*sizeof(double));
16959599516SKenneth E. Jansen
17059599516SKenneth E. Jansen i=j=k=0;
17159599516SKenneth E. Jansen
17259599516SKenneth E. Jansen for(l=0;l<64;l++){
17359599516SKenneth E. Jansen rstw[l][0]=bp4[i];
17459599516SKenneth E. Jansen rstw[l][1]=bp4[j];
17559599516SKenneth E. Jansen rstw[l][2]=bp4[k];
17659599516SKenneth E. Jansen rstw[l][3]=0.0;
17759599516SKenneth E. Jansen twt[l]=bw4[i]*bw4[j]*bw4[k];
17859599516SKenneth E. Jansen i++;
17959599516SKenneth E. Jansen if(i == 4){
18059599516SKenneth E. Jansen i=0 ; j++ ;
18159599516SKenneth E. Jansen if(j == 4) { j=0; k++;}
18259599516SKenneth E. Jansen }
18359599516SKenneth E. Jansen }
18459599516SKenneth E. Jansen *bcord = rstw; *wt = twt;
18559599516SKenneth E. Jansen
18659599516SKenneth E. Jansen } else if( nint == 125) {
18759599516SKenneth E. Jansen
18859599516SKenneth E. Jansen rstw = (DARR4 *)malloc(125*sizeof(DARR4));
18959599516SKenneth E. Jansen twt = (double *)malloc(125*sizeof(double));
19059599516SKenneth E. Jansen
19159599516SKenneth E. Jansen i=j=k=0;
19259599516SKenneth E. Jansen
19359599516SKenneth E. Jansen for(l=0;l<125;l++){
19459599516SKenneth E. Jansen rstw[l][0]=bp5[i];
19559599516SKenneth E. Jansen rstw[l][1]=bp5[j];
19659599516SKenneth E. Jansen rstw[l][2]=bp5[k];
19759599516SKenneth E. Jansen rstw[l][3]=0.0;
19859599516SKenneth E. Jansen twt[l]=bw5[i]*bw5[j]*bw5[k];
19959599516SKenneth E. Jansen i++;
20059599516SKenneth E. Jansen if(i == 5){
20159599516SKenneth E. Jansen i=0 ; j++ ;
20259599516SKenneth E. Jansen if(j == 5) { j=0; k++;}
20359599516SKenneth E. Jansen }
20459599516SKenneth E. Jansen }
20559599516SKenneth E. Jansen *bcord = rstw; *wt = twt;
20659599516SKenneth E. Jansen
20759599516SKenneth E. Jansen } else {
20859599516SKenneth E. Jansen
20959599516SKenneth E. Jansen fprintf(stderr,"\n%d integration points unsupported; give {8,27,64,125,.}\n",nint);
21059599516SKenneth E. Jansen retval = 0;
21159599516SKenneth E. Jansen }
21259599516SKenneth E. Jansen return retval ;
21359599516SKenneth E. Jansen }
21459599516SKenneth E. Jansen
21559599516SKenneth E. Jansen #ifdef __cplusplus
21659599516SKenneth E. Jansen }
21759599516SKenneth E. Jansen #endif
218