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