xref: /phasta/phSolver/common/GaussLegendreSimplex.c (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen /*$Id$*/
2*59599516SKenneth E. Jansen #include <math.h>
3*59599516SKenneth E. Jansen 
4*59599516SKenneth E. Jansen #ifdef __cplusplus
5*59599516SKenneth E. Jansen extern "C" {
6*59599516SKenneth E. Jansen #endif
7*59599516SKenneth E. Jansen 
8*59599516SKenneth E. Jansen void brickToTet(double xi,double eta, double zeta,
9*59599516SKenneth E. Jansen                 double *r, double *s, double *t, double *J);
10*59599516SKenneth E. Jansen 
11*59599516SKenneth E. Jansen void quadToTri(double xi,double eta,
12*59599516SKenneth E. Jansen                double *r, double *s,double *J);
13*59599516SKenneth E. Jansen double quadToTriJac(double xi,double eta);
14*59599516SKenneth E. Jansen int GaussLegendre1D(int, double **,double **);
15*59599516SKenneth E. Jansen 
GaussLegendreTet(int n1,int n2,int n3,double GLrstw[][4],double * GLwt)16*59599516SKenneth E. Jansen int GaussLegendreTet(int n1,int n2,int n3,double GLrstw[][4],double *GLwt) {
17*59599516SKenneth E. Jansen   /* get degenerate n1Xn2Xn3 Gauss-Legendre scheme to integrate over a tet */
18*59599516SKenneth E. Jansen   int i,j,k,index=0;
19*59599516SKenneth E. Jansen   double *pt1,*pt2,*pt3,*wt1,*wt2,*wt3,dJ;
20*59599516SKenneth E. Jansen   const double six=6.000000000000000;
21*59599516SKenneth E. Jansen 
22*59599516SKenneth E. Jansen   GaussLegendre1D(n1,&pt1,&wt1);
23*59599516SKenneth E. Jansen   GaussLegendre1D(n2,&pt2,&wt2);
24*59599516SKenneth E. Jansen   GaussLegendre1D(n3,&pt3,&wt3);
25*59599516SKenneth E. Jansen   for(i=0; i < n1; i++) {
26*59599516SKenneth E. Jansen     for(j=0; j < n2; j++) {
27*59599516SKenneth E. Jansen       for(k=0; k < n3; k++) {
28*59599516SKenneth E. Jansen         brickToTet(pt1[i],pt2[j],pt3[k],&GLrstw[index][0],
29*59599516SKenneth E. Jansen                    &GLrstw[index][1],&GLrstw[index][2],&dJ);
30*59599516SKenneth E. Jansen         GLrstw[index][3] = 1.0e0-GLrstw[index][0]-GLrstw[index][1]
31*59599516SKenneth E. Jansen                                 -GLrstw[index][2];
32*59599516SKenneth E. Jansen         GLwt[index++] = dJ*wt1[i]*wt2[j]*wt3[k]*six;
33*59599516SKenneth E. Jansen       }
34*59599516SKenneth E. Jansen     }
35*59599516SKenneth E. Jansen   }
36*59599516SKenneth E. Jansen   return index;
37*59599516SKenneth E. Jansen }
GaussLegendreTri(int n1,int n2,double GLr[][3],double * GLwt)38*59599516SKenneth E. Jansen int GaussLegendreTri(int n1,int n2,double GLr[][3],double *GLwt) {
39*59599516SKenneth E. Jansen   /* get degenerate n1Xn2 Gauss-Legendre scheme to integrate over a tet */
40*59599516SKenneth E. Jansen   int i,j,index=0;
41*59599516SKenneth E. Jansen   double *pt1,*pt2,*wt1,*wt2,dJ;
42*59599516SKenneth E. Jansen   const double two = 2.0000000000000000;
43*59599516SKenneth E. Jansen 
44*59599516SKenneth E. Jansen   GaussLegendre1D(n1,&pt1,&wt1);
45*59599516SKenneth E. Jansen   GaussLegendre1D(n2,&pt2,&wt2);
46*59599516SKenneth E. Jansen   for(i=0; i < n1; i++) {
47*59599516SKenneth E. Jansen     for(j=0; j < n2; j++) {
48*59599516SKenneth E. Jansen       quadToTri(pt1[i],pt2[j],&GLr[index][0],&GLr[index][1],&dJ);
49*59599516SKenneth E. Jansen       GLr[index][2] = 1.0e0-GLr[index][0]-GLr[index][1];
50*59599516SKenneth E. Jansen       GLwt[index++] = dJ*wt1[i]*wt2[j]*two;
51*59599516SKenneth E. Jansen     }
52*59599516SKenneth E. Jansen   }
53*59599516SKenneth E. Jansen   return index;
54*59599516SKenneth E. Jansen }
55*59599516SKenneth E. Jansen 
brickToTet(double xi,double eta,double zeta,double * r,double * s,double * t,double * J)56*59599516SKenneth E. Jansen void brickToTet(double xi,double eta, double zeta,
57*59599516SKenneth E. Jansen                       double *r, double *s, double *t, double *J) {
58*59599516SKenneth E. Jansen   double r1,rs1;
59*59599516SKenneth E. Jansen   *r = 0.5e0*(1.0e0+xi);
60*59599516SKenneth E. Jansen   r1 = 1.0e0-(*r);
61*59599516SKenneth E. Jansen   *s = 0.5e0*(1.0e0+eta)*r1;
62*59599516SKenneth E. Jansen   rs1 = 1.0e0-(*r)-(*s);
63*59599516SKenneth E. Jansen   *t = 0.5e0*(1.0e0+zeta)*rs1;
64*59599516SKenneth E. Jansen   *J = 0.125e0*r1*rs1;
65*59599516SKenneth E. Jansen }
66*59599516SKenneth E. Jansen 
quadToTri(double xi,double eta,double * r,double * s,double * J)67*59599516SKenneth E. Jansen void quadToTri(double xi,double eta,double *r, double *s, double *J) {
68*59599516SKenneth E. Jansen   double r1;
69*59599516SKenneth E. Jansen   *r = 0.5e0*(1.0e0+xi);
70*59599516SKenneth E. Jansen   r1 = 1.0e0-(*r);
71*59599516SKenneth E. Jansen   *s = 0.5e0*(1.0e0+eta)*r1;
72*59599516SKenneth E. Jansen   *J = 0.25e0*r1;
73*59599516SKenneth E. Jansen }
74*59599516SKenneth E. Jansen 
quadToTriJac(double xi,double eta)75*59599516SKenneth E. Jansen double quadToTriJac(double xi,double eta) {
76*59599516SKenneth E. Jansen   return 0.125e0*(1.0e0-eta);
77*59599516SKenneth E. Jansen }
78*59599516SKenneth E. Jansen 
79*59599516SKenneth E. Jansen #ifdef __cplusplus
80*59599516SKenneth E. Jansen }
81*59599516SKenneth E. Jansen #endif
82*59599516SKenneth E. Jansen 
83