xref: /phasta/shapeFunction/src/uniformP.c (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen #include "shapeFuncInternals.h"
2*59599516SKenneth E. Jansen 
3*59599516SKenneth E. Jansen #ifdef __cplusplus
4*59599516SKenneth E. Jansen extern "C" {
5*59599516SKenneth E. Jansen #endif
6*59599516SKenneth E. Jansen 
7*59599516SKenneth E. Jansen   /* Calculate shape functions and derivative for tet elements */
TetShapeAndDrv(int p,double par[3],double N[],double dN[][3])8*59599516SKenneth E. Jansen int TetShapeAndDrv(int p,double par[3],double N[],double dN[][3]) {
9*59599516SKenneth E. Jansen   static int TetEMAP[6][2]={{0,1},{1,2},{2,0},{0,3},{1,3},{2,3}};
10*59599516SKenneth E. Jansen   static int TetFMAP[4][3]={{0,1,2},{0,3,1},{1,3,2},{0,2,3}};
11*59599516SKenneth E. Jansen   int NS,is,i,j,ip,nshp=0,(*fpdrv)[2];
12*59599516SKenneth E. Jansen   double L[4],Le[2],Lf[3],mode,blend,bdrv[3],mdrv[3],epdrv[3][2],mfdrv[2];
13*59599516SKenneth E. Jansen   double tmp,rst,rsw,stw,rstw,rtw;
14*59599516SKenneth E. Jansen   if(p<1)
15*59599516SKenneth E. Jansen     return nshp;
16*59599516SKenneth E. Jansen   L[0]=par[0];
17*59599516SKenneth E. Jansen   L[1]=par[1];
18*59599516SKenneth E. Jansen   L[2]=par[2];
19*59599516SKenneth E. Jansen   L[3]=1.0e0-par[0]-par[1]-par[2];
20*59599516SKenneth E. Jansen   /* collect all vertex modes */
21*59599516SKenneth E. Jansen   for(i=0; i <4; i++) {
22*59599516SKenneth E. Jansen     N[i] = L[i];
23*59599516SKenneth E. Jansen     if(i==3)
24*59599516SKenneth E. Jansen       dN[i][0]=dN[i][1]=dN[i][2]=-1.0e0;
25*59599516SKenneth E. Jansen     else {
26*59599516SKenneth E. Jansen       for(j=0; j <3; j++) {
27*59599516SKenneth E. Jansen 	if(i==j)
28*59599516SKenneth E. Jansen 	  dN[i][j] = 1.0e0;
29*59599516SKenneth E. Jansen 	else
30*59599516SKenneth E. Jansen 	  dN[i][j] = 0.0e0;
31*59599516SKenneth E. Jansen       }
32*59599516SKenneth E. Jansen     }
33*59599516SKenneth E. Jansen   }
34*59599516SKenneth E. Jansen   nshp=4;
35*59599516SKenneth E. Jansen   if( p > 1 ) {
36*59599516SKenneth E. Jansen     /* collect all edge modes, for all p */
37*59599516SKenneth E. Jansen     for(i=0; i <6; i++) {
38*59599516SKenneth E. Jansen       Le[0]=L[TetEMAP[i][0]];
39*59599516SKenneth E. Jansen       Le[1]=L[TetEMAP[i][1]];
40*59599516SKenneth E. Jansen       blend = R_edgeBlendTet(TetEMAP[i],L);
41*59599516SKenneth E. Jansen       R_edgeBlendTetDrv(TetEMAP[i],L,bdrv);
42*59599516SKenneth E. Jansen       E_parDrv(TetEMAP[i][0],TetEMAP[i][1],Stet,epdrv);
43*59599516SKenneth E. Jansen       for(ip=2; ip <= p; ip++) {
44*59599516SKenneth E. Jansen 	mode = E_modeShape(ip,Le);
45*59599516SKenneth E. Jansen 	E_modeShapeDrv(ip, Le, mdrv);
46*59599516SKenneth E. Jansen 	N[nshp] = blend*mode;
47*59599516SKenneth E. Jansen 	dN[nshp][0] = bdrv[0]*mode +
48*59599516SKenneth E. Jansen 	        blend*(mdrv[0]*epdrv[0][0]+mdrv[1]*epdrv[0][1]);
49*59599516SKenneth E. Jansen         dN[nshp][1] = bdrv[1]*mode +
50*59599516SKenneth E. Jansen 	        blend*(mdrv[0]*epdrv[1][0]+mdrv[1]*epdrv[1][1]);
51*59599516SKenneth E. Jansen         dN[nshp][2] = bdrv[2]*mode +
52*59599516SKenneth E. Jansen 	        blend*(mdrv[0]*epdrv[2][0]+mdrv[1]*epdrv[2][1]);
53*59599516SKenneth E. Jansen 	nshp++;
54*59599516SKenneth E. Jansen       }
55*59599516SKenneth E. Jansen     }
56*59599516SKenneth E. Jansen   }
57*59599516SKenneth E. Jansen   if( p > 2 ) {
58*59599516SKenneth E. Jansen     /* collect all face modes for all p */
59*59599516SKenneth E. Jansen     for(i=0; i <4; i++) {
60*59599516SKenneth E. Jansen       Lf[0]=L[TetFMAP[i][0]];
61*59599516SKenneth E. Jansen       Lf[1]=L[TetFMAP[i][1]];
62*59599516SKenneth E. Jansen       Lf[2]=L[TetFMAP[i][2]];
63*59599516SKenneth E. Jansen       blend=Lf[0]*Lf[1]*Lf[2];
64*59599516SKenneth E. Jansen       R_faceBlendTetDrv(TetFMAP[i],L,bdrv);
65*59599516SKenneth E. Jansen       F_parDrv(TetFMAP[i][0],TetFMAP[i][1],TetFMAP[i][2],Stet,&fpdrv);
66*59599516SKenneth E. Jansen       for(ip=3; ip <= p; ip++) {
67*59599516SKenneth E. Jansen 	NS = ip-2;
68*59599516SKenneth E. Jansen 	for(is=0; is < NS; is++) {
69*59599516SKenneth E. Jansen 	  mode = F_modeShapeTri(ip,is,Lf);
70*59599516SKenneth E. Jansen 	  N[nshp] = blend*mode;
71*59599516SKenneth E. Jansen 	  F_modeShapeTriDrv(ip,is,Lf,mfdrv);
72*59599516SKenneth E. Jansen 	  mdrv[0]=mfdrv[0]*(double)fpdrv[0][0]+ mfdrv[1]*(double)fpdrv[0][1];
73*59599516SKenneth E. Jansen 	  mdrv[1]=mfdrv[0]*(double)fpdrv[1][0]+ mfdrv[1]*(double)fpdrv[1][1];
74*59599516SKenneth E. Jansen 	  mdrv[2]=mfdrv[0]*(double)fpdrv[2][0]+ mfdrv[1]*(double)fpdrv[2][1];
75*59599516SKenneth E. Jansen 	  dN[nshp][0] = bdrv[0]*mode + blend*mdrv[0] ;
76*59599516SKenneth E. Jansen 	  dN[nshp][1] = bdrv[1]*mode + blend*mdrv[1] ;
77*59599516SKenneth E. Jansen 	  dN[nshp][2] = bdrv[2]*mode + blend*mdrv[2] ;
78*59599516SKenneth E. Jansen 	  nshp++;
79*59599516SKenneth E. Jansen 	}
80*59599516SKenneth E. Jansen       }
81*59599516SKenneth E. Jansen     }
82*59599516SKenneth E. Jansen   }
83*59599516SKenneth E. Jansen   if( p > 3 ) {
84*59599516SKenneth E. Jansen     /* collect all region modes */
85*59599516SKenneth E. Jansen     for(ip=4; ip <= p; ip++) {
86*59599516SKenneth E. Jansen       NS = (ip-3)*(ip-2)/2 ;
87*59599516SKenneth E. Jansen       blend = L[0]*L[1]*L[2]*L[3];
88*59599516SKenneth E. Jansen       tmp = 1.0e0-L[0]-L[1]-L[2] ;
89*59599516SKenneth E. Jansen       rsw = L[0]*L[1]*tmp;
90*59599516SKenneth E. Jansen       stw = L[1]*L[2]*tmp ;
91*59599516SKenneth E. Jansen       rtw = L[0]*L[2]*tmp ;
92*59599516SKenneth E. Jansen       rst = L[0]*L[1]*L[2] ;
93*59599516SKenneth E. Jansen       rstw = rst*L[3] ;
94*59599516SKenneth E. Jansen       for(is=0; is < NS; is++) {
95*59599516SKenneth E. Jansen 	mode = R_modeShapeTet(ip,is,L);
96*59599516SKenneth E. Jansen 	N[nshp] = blend*mode;
97*59599516SKenneth E. Jansen 	R_modeShapeTetDrv(ip, is, L, mdrv);
98*59599516SKenneth E. Jansen 	dN[nshp][0] = mode*(stw-rst) + rstw*mdrv[0] ;
99*59599516SKenneth E. Jansen 	dN[nshp][1] = mode*(rtw-rst) + rstw*mdrv[1] ;
100*59599516SKenneth E. Jansen 	dN[nshp][2] = mode*(rsw-rst) + rstw*mdrv[2] ;
101*59599516SKenneth E. Jansen 	nshp++;
102*59599516SKenneth E. Jansen       }
103*59599516SKenneth E. Jansen     }
104*59599516SKenneth E. Jansen   }
105*59599516SKenneth E. Jansen   return nshp;
106*59599516SKenneth E. Jansen }
107*59599516SKenneth E. Jansen 
108*59599516SKenneth E. Jansen /* calculate the shape functions and their derivatives for
109*59599516SKenneth E. Jansen    triangular faces
110*59599516SKenneth E. Jansen    */
111*59599516SKenneth E. Jansen 
TriShapeAndDrv(int p,double par[2],double N[],double dN[][2])112*59599516SKenneth E. Jansen int TriShapeAndDrv(int p,double par[2],double N[],double dN[][2]){
113*59599516SKenneth E. Jansen   int i,j,nshp=0;
114*59599516SKenneth E. Jansen   double L[3];
115*59599516SKenneth E. Jansen 
116*59599516SKenneth E. Jansen   if(p > 2) /* not supported */
117*59599516SKenneth E. Jansen     return nshp;
118*59599516SKenneth E. Jansen   L[0]=par[0];
119*59599516SKenneth E. Jansen   L[1]=par[1];
120*59599516SKenneth E. Jansen   L[2]=1.0e0-par[0]-par[1];
121*59599516SKenneth E. Jansen 
122*59599516SKenneth E. Jansen   /* define shape functions for a quadratic triangle */
123*59599516SKenneth E. Jansen 
124*59599516SKenneth E. Jansen   /* collect all vertex modes */
125*59599516SKenneth E. Jansen   for(i=0; i<3; i++) {
126*59599516SKenneth E. Jansen     N[i] = L[i];
127*59599516SKenneth E. Jansen     if(i==2)
128*59599516SKenneth E. Jansen       dN[i][0]=dN[i][1]=-1.0e0;
129*59599516SKenneth E. Jansen     else {
130*59599516SKenneth E. Jansen       for(j=0; j<2; j++) {
131*59599516SKenneth E. Jansen 	if(i==j)
132*59599516SKenneth E. Jansen 	  dN[i][j] = 1.0e0;
133*59599516SKenneth E. Jansen 	else
134*59599516SKenneth E. Jansen 	  dN[i][j] = 0.0e0;
135*59599516SKenneth E. Jansen       }
136*59599516SKenneth E. Jansen     }
137*59599516SKenneth E. Jansen   }
138*59599516SKenneth E. Jansen   nshp=3;
139*59599516SKenneth E. Jansen   if( p > 1 ){
140*59599516SKenneth E. Jansen     /* collect edge modes (only quadratic for now) */
141*59599516SKenneth E. Jansen     N[3] = -2.0e0*L[0]*L[1];
142*59599516SKenneth E. Jansen     N[4] = -2.0e0*L[1]*L[2];
143*59599516SKenneth E. Jansen     N[5] = -2.0e0*L[0]*L[2];
144*59599516SKenneth E. Jansen     dN[3][0] = -2.0e0*L[1];
145*59599516SKenneth E. Jansen     dN[3][1] = -2.0e0*L[0];
146*59599516SKenneth E. Jansen     dN[4][0] = 2.0e0*L[1];
147*59599516SKenneth E. Jansen     dN[4][1] = -2.0e0+2.0e0*L[0]+4.0e0*L[1];
148*59599516SKenneth E. Jansen     dN[5][0] = -2.0e0+4.0e0*L[0]+2.0e0*L[1];
149*59599516SKenneth E. Jansen     dN[5][1] = 2.0e0*L[0];
150*59599516SKenneth E. Jansen     nshp=6;
151*59599516SKenneth E. Jansen   }
152*59599516SKenneth E. Jansen   return nshp;
153*59599516SKenneth E. Jansen }
154*59599516SKenneth E. Jansen 
155*59599516SKenneth E. Jansen 
156*59599516SKenneth E. Jansen 
157*59599516SKenneth E. Jansen 
158*59599516SKenneth E. Jansen 
159*59599516SKenneth E. Jansen 
160*59599516SKenneth E. Jansen #ifdef __cplusplus
161*59599516SKenneth E. Jansen }
162*59599516SKenneth E. Jansen #endif
163*59599516SKenneth E. Jansen 
164