xref: /phasta/phSolver/common/newshape.cc (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen /* This file contains the routines which generate hierarchic shape
2*59599516SKenneth E. Jansen    functions for a any (right now hexahedral) element, using the
3*59599516SKenneth E. Jansen    concept of Blend functions and entity level shapefunctions.
4*59599516SKenneth E. Jansen 
5*59599516SKenneth E. Jansen    The shapefunction for a mesh entity Mj^dj is defined as
6*59599516SKenneth E. Jansen 
7*59599516SKenneth E. Jansen               N = psi(Mj^di,Me^de)*phi(Mj^dj)
8*59599516SKenneth E. Jansen 
9*59599516SKenneth E. Jansen    where psi(...) is the blending function and phi(..) is the entity
10*59599516SKenneth E. Jansen    level function which takes care of the polynomial order .
11*59599516SKenneth E. Jansen */
12*59599516SKenneth E. Jansen 
13*59599516SKenneth E. Jansen 
14*59599516SKenneth E. Jansen 
15*59599516SKenneth E. Jansen #include <math.h>
16*59599516SKenneth E. Jansen 
17*59599516SKenneth E. Jansen #include "topo_shapedefs.h"
18*59599516SKenneth E. Jansen 
19*59599516SKenneth E. Jansen int nshp =0;
20*59599516SKenneth E. Jansen double LP(int j, double x)
21*59599516SKenneth E. Jansen {
22*59599516SKenneth E. Jansen     /* Bonnet's recursion formula for Legendre Polynomials */
23*59599516SKenneth E. Jansen     if( j==0) return 1;
24*59599516SKenneth E. Jansen     if( j==1) return x;
25*59599516SKenneth E. Jansen 
26*59599516SKenneth E. Jansen     double ply;
27*59599516SKenneth E. Jansen     ply = ((2*j-1)*x*LP(j-1,x)-(j-1)*LP(j-2,x))/j;
28*59599516SKenneth E. Jansen     return ply;
29*59599516SKenneth E. Jansen 
30*59599516SKenneth E. Jansen }
31*59599516SKenneth E. Jansen /***************************************************************************/
32*59599516SKenneth E. Jansen double LPdrv(int j, double x)
33*59599516SKenneth E. Jansen {
34*59599516SKenneth E. Jansen     if(j == 0) return 0;
35*59599516SKenneth E. Jansen     if(j == 1) return 1;
36*59599516SKenneth E. Jansen 
37*59599516SKenneth E. Jansen     double plydrv;
38*59599516SKenneth E. Jansen     plydrv = (2*j -1)*LP(j-1,x)+LPdrv(j-2,x);
39*59599516SKenneth E. Jansen     return plydrv;
40*59599516SKenneth E. Jansen }
41*59599516SKenneth E. Jansen 
42*59599516SKenneth E. Jansen /***************************************************************************/
43*59599516SKenneth E. Jansen double phi(int p, double x)
44*59599516SKenneth E. Jansen {
45*59599516SKenneth E. Jansen     double PHI;
46*59599516SKenneth E. Jansen 
47*59599516SKenneth E. Jansen     PHI = LP(p,x)-LP(p-2,x);
48*59599516SKenneth E. Jansen     PHI = PHI / (2*p-1);
49*59599516SKenneth E. Jansen     /*  PHI = PHI/sqrt(2*(2*p-1)); */
50*59599516SKenneth E. Jansen     return PHI;
51*59599516SKenneth E. Jansen }
52*59599516SKenneth E. Jansen 
53*59599516SKenneth E. Jansen double phiDrv(int p, double x)
54*59599516SKenneth E. Jansen {
55*59599516SKenneth E. Jansen     double Phidrv;
56*59599516SKenneth E. Jansen     Phidrv = LP(p-1,x);
57*59599516SKenneth E. Jansen     /*  Phidrv = sqrt(0.5*(2*p-1))*LP(p-1,x); */
58*59599516SKenneth E. Jansen     return Phidrv;
59*59599516SKenneth E. Jansen }
60*59599516SKenneth E. Jansen 
61*59599516SKenneth E. Jansen 
62*59599516SKenneth E. Jansen /*******************************************************************/
63*59599516SKenneth E. Jansen /* Construction of Blending functions */
64*59599516SKenneth E. Jansen 
65*59599516SKenneth E. Jansen /* Line element edge blend and its derivatives */
66*59599516SKenneth E. Jansen 
67*59599516SKenneth E. Jansen double Line_eB(double xi1)
68*59599516SKenneth E. Jansen {
69*59599516SKenneth E. Jansen     /* edge parameterization I defined in Saikat's thesis */
70*59599516SKenneth E. Jansen     return 0.5*(xi1*xi1 - 1);
71*59599516SKenneth E. Jansen }
72*59599516SKenneth E. Jansen 
73*59599516SKenneth E. Jansen double dLEBdxi1(double xi1){  return xi1; }
74*59599516SKenneth E. Jansen double dLEBdxi2(double xi1){return 0;}
75*59599516SKenneth E. Jansen double dLEBdxi3(double xi1){return 0;}
76*59599516SKenneth E. Jansen 
77*59599516SKenneth E. Jansen /* Quadrilateral edge blend and its derivatives */
78*59599516SKenneth E. Jansen 
79*59599516SKenneth E. Jansen 
80*59599516SKenneth E. Jansen double Quad_eB(double xi1, double xi2, int sign)
81*59599516SKenneth E. Jansen {
82*59599516SKenneth E. Jansen     /* Quad element edge blend, for edge along xi1 */
83*59599516SKenneth E. Jansen     return 0.25*(xi1*xi1 - 1)*(1+sign*xi2);
84*59599516SKenneth E. Jansen }
85*59599516SKenneth E. Jansen 
86*59599516SKenneth E. Jansen double dQEBdxi1(double xi1, double xi2, int sign)
87*59599516SKenneth E. Jansen { return 0.5*xi1*(1+sign*xi2); }
88*59599516SKenneth E. Jansen 
89*59599516SKenneth E. Jansen double dQEBdxi2(double xi1, double xi2, int sign)
90*59599516SKenneth E. Jansen { return 0.25*sign*(xi1*xi1 - 1); }
91*59599516SKenneth E. Jansen 
92*59599516SKenneth E. Jansen double dQEBdxi3(double xi1, double xi2, int sign)
93*59599516SKenneth E. Jansen { return 0; }
94*59599516SKenneth E. Jansen 
95*59599516SKenneth E. Jansen 
96*59599516SKenneth E. Jansen /* Quadrilateral face blend and its derivatives */
97*59599516SKenneth E. Jansen 
98*59599516SKenneth E. Jansen double Quad_fB(double xi1, double xi2)
99*59599516SKenneth E. Jansen {
100*59599516SKenneth E. Jansen     return 0.25*(xi1*xi1 - 1)*(xi2*xi2 - 1);
101*59599516SKenneth E. Jansen }
102*59599516SKenneth E. Jansen 
103*59599516SKenneth E. Jansen double dQFBdxi1(double xi1, double xi2)
104*59599516SKenneth E. Jansen { return 0.5*xi1*(xi2*xi2 - 1); }
105*59599516SKenneth E. Jansen 
106*59599516SKenneth E. Jansen double dQFBdxi2(double xi1, double xi2)
107*59599516SKenneth E. Jansen { return 0.5*xi2*(xi1*xi1 - 1); }
108*59599516SKenneth E. Jansen 
109*59599516SKenneth E. Jansen double dQFBdxi3(double xi1, double xi2)
110*59599516SKenneth E. Jansen { return 0.0 ; }
111*59599516SKenneth E. Jansen 
112*59599516SKenneth E. Jansen 
113*59599516SKenneth E. Jansen /* The hexahedral element edge blend and its derivatives */
114*59599516SKenneth E. Jansen 
115*59599516SKenneth E. Jansen double Hex_eB(double xi[3], int sign2, int sign3)
116*59599516SKenneth E. Jansen {
117*59599516SKenneth E. Jansen     /* For edge along xi1 */
118*59599516SKenneth E. Jansen 
119*59599516SKenneth E. Jansen     //  return 0.125*(xi[0]*xi[0] - 1)*(1+sign2*xi[1])*(1+sign3*xi[2]);
120*59599516SKenneth E. Jansen     return 0.25*(1+sign2*xi[1])*(1+sign3*xi[2]);
121*59599516SKenneth E. Jansen }
122*59599516SKenneth E. Jansen 
123*59599516SKenneth E. Jansen double dHEBdxi1(double xi[3], int sign2, int sign3)
124*59599516SKenneth E. Jansen {
125*59599516SKenneth E. Jansen     /* For edge along xi1 */
126*59599516SKenneth E. Jansen 
127*59599516SKenneth E. Jansen     //  return 0.25*xi[0]*(1+sign2*xi[1])*(1+sign3*xi[2]);
128*59599516SKenneth E. Jansen     return 0;
129*59599516SKenneth E. Jansen }
130*59599516SKenneth E. Jansen 
131*59599516SKenneth E. Jansen double dHEBdxi2(double xi[3], int sign2, int sign3)
132*59599516SKenneth E. Jansen {
133*59599516SKenneth E. Jansen 
134*59599516SKenneth E. Jansen     /* For edge along xi1 */
135*59599516SKenneth E. Jansen 
136*59599516SKenneth E. Jansen     //  return 0.125*sign2*(xi[0]*xi[0] - 1)*(1+sign3*xi[2]);
137*59599516SKenneth E. Jansen 
138*59599516SKenneth E. Jansen     return 0.25*sign2*(1+sign3*xi[2]);
139*59599516SKenneth E. Jansen }
140*59599516SKenneth E. Jansen 
141*59599516SKenneth E. Jansen double dHEBdxi3(double xi[3], int sign2, int sign3)
142*59599516SKenneth E. Jansen {
143*59599516SKenneth E. Jansen     /* For edge along xi1 */
144*59599516SKenneth E. Jansen 
145*59599516SKenneth E. Jansen     return 0.25*sign3*(1+sign2*xi[1]);
146*59599516SKenneth E. Jansen }
147*59599516SKenneth E. Jansen 
148*59599516SKenneth E. Jansen 
149*59599516SKenneth E. Jansen /* The hexahedral face blend and its derivatives */
150*59599516SKenneth E. Jansen 
151*59599516SKenneth E. Jansen double Hex_fB(double xi[3], int  sign3)
152*59599516SKenneth E. Jansen {
153*59599516SKenneth E. Jansen     /* for face perpendicular to xi3 */
154*59599516SKenneth E. Jansen 
155*59599516SKenneth E. Jansen     return 0.5*(1+sign3*xi[2]);
156*59599516SKenneth E. Jansen     //  return 0.125*(xi[0]*xi[0] - 1)*(xi[1]*xi[1] - 1)*(1+sign3*xi[2]);
157*59599516SKenneth E. Jansen }
158*59599516SKenneth E. Jansen 
159*59599516SKenneth E. Jansen double dHFBdxi1(double xi[3], int sign3)
160*59599516SKenneth E. Jansen     //{ return 0.25*xi[0]*(xi[1]*xi[1] - 1)*(1+sign3*xi[2]);}
161*59599516SKenneth E. Jansen { return 0;}
162*59599516SKenneth E. Jansen 
163*59599516SKenneth E. Jansen double dHFBdxi2(double xi[3], int sign3)
164*59599516SKenneth E. Jansen     //{ return 0.25*xi[1]*(xi[0]*xi[0] - 1)*(1+sign3*xi[2]);}
165*59599516SKenneth E. Jansen { return 0; }
166*59599516SKenneth E. Jansen 
167*59599516SKenneth E. Jansen double dHFBdxi3(double xi[3], int sign3)
168*59599516SKenneth E. Jansen     //{ return 0.125*(xi[0]*xi[0] - 1)*(xi[1]*xi[1] - 1)*sign3; }
169*59599516SKenneth E. Jansen { return 0.5*sign3; }
170*59599516SKenneth E. Jansen 
171*59599516SKenneth E. Jansen 
172*59599516SKenneth E. Jansen // The Construction of higher-order blending functions for edge and face of pyramid */
173*59599516SKenneth E. Jansen 
174*59599516SKenneth E. Jansen /* The pyramid element edge blend and its derivatives */
175*59599516SKenneth E. Jansen double Pyr_eB(double xi[3], int sign[3], int k, int m, int along)
176*59599516SKenneth E. Jansen {
177*59599516SKenneth E. Jansen     double psi;
178*59599516SKenneth E. Jansen     double tmp0 =1/(1-xi[2]); // xi3->xi[2]
179*59599516SKenneth E. Jansen 
180*59599516SKenneth E. Jansen     k--; m--; along--;
181*59599516SKenneth E. Jansen 
182*59599516SKenneth E. Jansen     if (along==2) { // if actually along=3
183*59599516SKenneth E. Jansen         // For edge along xi3, which bounds the triangular face
184*59599516SKenneth E. Jansen         psi =0.125*(xi[2]*xi[2]-1)*(1+sign[k]*(2*xi[k]*tmp0))*(1+sign[m]*(2*xi[m]*tmp0));
185*59599516SKenneth E. Jansen     } else {        // if actually along=k=1 or 2
186*59599516SKenneth E. Jansen         // For edge along xik, k=1, 2, m=2, 1 which bounds the quadrilater face
187*59599516SKenneth E. Jansen         double tmp1 =2*xi[k]*tmp0;
188*59599516SKenneth E. Jansen         psi =0.125*(tmp1*tmp1-1)*(1+sign[m]*(2*xi[m]*tmp0))*(1-xi[2]);
189*59599516SKenneth E. Jansen     }
190*59599516SKenneth E. Jansen     return psi;
191*59599516SKenneth E. Jansen }
192*59599516SKenneth E. Jansen 
193*59599516SKenneth E. Jansen double dPeBdxi(double xi[3], int sign[3], int k, int m, int along, int byWhich)
194*59599516SKenneth E. Jansen {
195*59599516SKenneth E. Jansen     double dPsidxi;
196*59599516SKenneth E. Jansen     double tmp0 =1/(1-xi[2]); // xi3->xi[2]
197*59599516SKenneth E. Jansen 
198*59599516SKenneth E. Jansen     // byWhich was decreased by 1.  When it comes in as j it is 0 initially
199*59599516SKenneth E. Jansen     // then it becomes -1, wrong.  Do not decrease byWhich.
200*59599516SKenneth E. Jansen     k--; m--; along--;
201*59599516SKenneth E. Jansen     if (along==2) {  // for edges along xi3
202*59599516SKenneth E. Jansen         if (byWhich==k)
203*59599516SKenneth E. Jansen             dPsidxi =-0.25*(1+xi[2])*sign[k]*(1+sign[m]*(2*xi[m]*tmp0));
204*59599516SKenneth E. Jansen         else if (byWhich==m)
205*59599516SKenneth E. Jansen             dPsidxi =-0.25*(1+xi[2])*sign[m]*(1+sign[k]*(2*xi[k]*tmp0));
206*59599516SKenneth E. Jansen         else if (byWhich==2)        // actually byWhich =2
207*59599516SKenneth E. Jansen             dPsidxi =0.25*(xi[2]*(1+sign[k]*2*xi[k]*tmp0)*(1+sign[m]*2*xi[m]*tmp0)-
208*59599516SKenneth E. Jansen                            (1+xi[2])*tmp0*(sign[k]*xi[k]*(1+sign[m]*2*xi[m]*tmp0)+
209*59599516SKenneth E. Jansen                                            sign[m]*xi[m]*(1+sign[k]*2*xi[k]*tmp0)));
210*59599516SKenneth E. Jansen     } else {         // for edges along xik with k=1 or 2
211*59599516SKenneth E. Jansen         double tmp1 =2*xi[k]*tmp0;
212*59599516SKenneth E. Jansen         if (byWhich==k)
213*59599516SKenneth E. Jansen             dPsidxi =0.5*tmp1*(1+sign[m]*(2*xi[m]*tmp0));
214*59599516SKenneth E. Jansen         else if (byWhich==m)
215*59599516SKenneth E. Jansen             dPsidxi =0.25*(tmp1*tmp1-1)*sign[m];
216*59599516SKenneth E. Jansen         else if (byWhich==2)       // actually byWhich =2
217*59599516SKenneth E. Jansen             dPsidxi =0.25*(tmp1*tmp1)*(1+sign[m]*(2*xi[m]*tmp0))-0.125*(tmp1*tmp1-1);
218*59599516SKenneth E. Jansen     }
219*59599516SKenneth E. Jansen     return dPsidxi;
220*59599516SKenneth E. Jansen }
221*59599516SKenneth E. Jansen 
222*59599516SKenneth E. Jansen /* The pyramid element face blend and its derivatives */
223*59599516SKenneth E. Jansen /* Needs to be corrected as we did for the edge blend */
224*59599516SKenneth E. Jansen double Pyr_fB (double xi[3], int sign[3], int k, int m, int faceType)
225*59599516SKenneth E. Jansen {
226*59599516SKenneth E. Jansen     double tmp0 =1/(1-xi[1]); // xi2->xi[1]
227*59599516SKenneth E. Jansen     double psi;
228*59599516SKenneth E. Jansen 
229*59599516SKenneth E. Jansen     if (faceType==4) {
230*59599516SKenneth E. Jansen         // for the quadrilater face
231*59599516SKenneth E. Jansen         double tmp1 =2*xi[0]*tmp0;
232*59599516SKenneth E. Jansen         double tmp2 =2*xi[2]*tmp0;
233*59599516SKenneth E. Jansen 
234*59599516SKenneth E. Jansen         psi =0.125*(1-tmp1*tmp1)*(1-tmp2*tmp2)*(1-xi[1]);
235*59599516SKenneth E. Jansen     } else {
236*59599516SKenneth E. Jansen         // for the triangular faces with k=1, 3 and m=3, 1
237*59599516SKenneth E. Jansen         k--; m--;
238*59599516SKenneth E. Jansen         double tmp1 =2*xi[m]*tmp0;
239*59599516SKenneth E. Jansen 
240*59599516SKenneth E. Jansen         psi =0.125*(1+sign[k]*2*xi[k]*tmp0)*(1-tmp1*tmp1)*(1-xi[1]*xi[1]);
241*59599516SKenneth E. Jansen     }
242*59599516SKenneth E. Jansen     return psi;
243*59599516SKenneth E. Jansen }
244*59599516SKenneth E. Jansen 
245*59599516SKenneth E. Jansen double dPfBdxi(double xi[3], int sign[3], int k, int m, int faceType, int byWhich)
246*59599516SKenneth E. Jansen {
247*59599516SKenneth E. Jansen     double dPsidxi;
248*59599516SKenneth E. Jansen     double tmp0 =1/(1-xi[2]); // xi3->xi[2]
249*59599516SKenneth E. Jansen 
250*59599516SKenneth E. Jansen     if (faceType==4) {
251*59599516SKenneth E. Jansen         // for the quadrilater face
252*59599516SKenneth E. Jansen         double tmp1 =2*xi[0]*tmp0;
253*59599516SKenneth E. Jansen         double tmp2 =2*xi[2]*tmp0;
254*59599516SKenneth E. Jansen 
255*59599516SKenneth E. Jansen         switch (byWhich) {
256*59599516SKenneth E. Jansen         case 1:
257*59599516SKenneth E. Jansen             dPsidxi =-0.5*tmp1*(1-tmp2*tmp2);
258*59599516SKenneth E. Jansen             break;
259*59599516SKenneth E. Jansen         case 2:
260*59599516SKenneth E. Jansen             dPsidxi = -0.125* (1+tmp1*tmp1+tmp2*tmp2-3*tmp1*tmp1*tmp2*tmp2);
261*59599516SKenneth E. Jansen             break;
262*59599516SKenneth E. Jansen         case 3:
263*59599516SKenneth E. Jansen             dPsidxi =-0.5*(1-tmp1*tmp1)*tmp2;
264*59599516SKenneth E. Jansen             break;
265*59599516SKenneth E. Jansen         }
266*59599516SKenneth E. Jansen     } else {         // for the triangular face with k=1,3 and m=3,1
267*59599516SKenneth E. Jansen         k--; m--; byWhich--;
268*59599516SKenneth E. Jansen         if (byWhich==k) {
269*59599516SKenneth E. Jansen             double tmp1 =2*xi[m]*tmp0;
270*59599516SKenneth E. Jansen             dPsidxi =0.25*sign[k]*(1-tmp1*tmp1)*(1+xi[1]);
271*59599516SKenneth E. Jansen         }
272*59599516SKenneth E. Jansen         else if (byWhich==m)
273*59599516SKenneth E. Jansen             dPsidxi =-(1+sign[k]*2*xi[k]*tmp0)*(xi[m]*tmp0)*(1+xi[1]);
274*59599516SKenneth E. Jansen         else if (byWhich==1) {      // actually byWhich =2
275*59599516SKenneth E. Jansen             double tmp1 =xi[k]*tmp0;
276*59599516SKenneth E. Jansen             double tmp2 =xi[m]*tmp0;
277*59599516SKenneth E. Jansen             dPsidxi =(1+xi[1])*(0.25*sign[k]*tmp1*(1-4*tmp2*tmp2)-
278*59599516SKenneth E. Jansen                                 (1+2*sign[k]*tmp1)*tmp2*tmp2)-
279*59599516SKenneth E. Jansen                 0.25*(1+2*sign[k]*tmp1)*(1-4*tmp2*tmp2)*xi[1];
280*59599516SKenneth E. Jansen         }
281*59599516SKenneth E. Jansen     }
282*59599516SKenneth E. Jansen     return dPsidxi;
283*59599516SKenneth E. Jansen }
284*59599516SKenneth E. Jansen 
285*59599516SKenneth E. Jansen 
286*59599516SKenneth E. Jansen /* Add further Blending functions and their derivatives before this line */
287*59599516SKenneth E. Jansen /*******************************************************************/
288*59599516SKenneth E. Jansen 
289*59599516SKenneth E. Jansen /* Entity level functions  phi(....) */
290*59599516SKenneth E. Jansen 
291*59599516SKenneth E. Jansen 
292*59599516SKenneth E. Jansen int mesh_edge(double xi1, int gOrd[3], int p,double* entfn,double** edrv)
293*59599516SKenneth E. Jansen {
294*59599516SKenneth E. Jansen     int nem = p-1;
295*59599516SKenneth E. Jansen //    double leb = Line_eB(xi1);
296*59599516SKenneth E. Jansen //    double dlebdxi1 = dLEBdxi1(xi1);
297*59599516SKenneth E. Jansen 
298*59599516SKenneth E. Jansen     if(nem > 0){
299*59599516SKenneth E. Jansen 
300*59599516SKenneth E. Jansen         //      entfn = new double [nem];
301*59599516SKenneth E. Jansen         //      edrv = new double* [nem];
302*59599516SKenneth E. Jansen 
303*59599516SKenneth E. Jansen         for(int i =0; i< nem; i++) {
304*59599516SKenneth E. Jansen 
305*59599516SKenneth E. Jansen             // edrv[i] = new double [3];
306*59599516SKenneth E. Jansen 
307*59599516SKenneth E. Jansen //        entfn[i] = phi(i+2, xi1)/leb;
308*59599516SKenneth E. Jansen //        edrv[i][gOrd[0]] = (leb*phiDrv(i+2,xi1)-phi(i+2,xi1)*dlebdxi1)/leb*leb;
309*59599516SKenneth E. Jansen //        edrv[i][gOrd[1]] = 0.0;
310*59599516SKenneth E. Jansen //        edrv[i][gOrd[2]] = 0.0;
311*59599516SKenneth E. Jansen 
312*59599516SKenneth E. Jansen             entfn[i] = phi(i+2, xi1);
313*59599516SKenneth E. Jansen             edrv[i][gOrd[0]] = phiDrv(i+2,xi1);
314*59599516SKenneth E. Jansen             edrv[i][gOrd[1]] = 0.0;
315*59599516SKenneth E. Jansen             edrv[i][gOrd[2]] = 0.0;
316*59599516SKenneth E. Jansen 
317*59599516SKenneth E. Jansen         }
318*59599516SKenneth E. Jansen     }
319*59599516SKenneth E. Jansen 
320*59599516SKenneth E. Jansen     return nem;
321*59599516SKenneth E. Jansen }
322*59599516SKenneth E. Jansen 
323*59599516SKenneth E. Jansen int quad_face(double xi[3], int gOrd[3], int p, double* entfn, double** edrv)
324*59599516SKenneth E. Jansen {
325*59599516SKenneth E. Jansen     int nfm;
326*59599516SKenneth E. Jansen     int a1, a2;
327*59599516SKenneth E. Jansen     int mc=0; /* mode counter*/
328*59599516SKenneth E. Jansen //    double temp1, temp2;
329*59599516SKenneth E. Jansen 
330*59599516SKenneth E. Jansen     double xi1 = xi[0];
331*59599516SKenneth E. Jansen     double xi2 = xi[1];
332*59599516SKenneth E. Jansen 
333*59599516SKenneth E. Jansen //    double qfb = Quad_fB(xi1,xi2);
334*59599516SKenneth E. Jansen //    double dqfbdxi1 = dQFBdxi1(xi1,xi2);
335*59599516SKenneth E. Jansen //    double dqfbdxi2 = dQFBdxi2(xi1,xi2);
336*59599516SKenneth E. Jansen 
337*59599516SKenneth E. Jansen     if(p > 3){
338*59599516SKenneth E. Jansen 
339*59599516SKenneth E. Jansen         nfm = (p-2)*(p-3)/2;
340*59599516SKenneth E. Jansen         //      entfn = new double [nfm];
341*59599516SKenneth E. Jansen         //      edrv = new double* [nfm];
342*59599516SKenneth E. Jansen         //      for(int i=0; i< nfm; i++){
343*59599516SKenneth E. Jansen         //        edrv[i]=new double [3];
344*59599516SKenneth E. Jansen         //      }
345*59599516SKenneth E. Jansen 
346*59599516SKenneth E. Jansen         for(int ip =3; ip <p+1; ip++){     /* for each p */
347*59599516SKenneth E. Jansen 
348*59599516SKenneth E. Jansen             for(a1 = 2; a1 < ip-1; a1++){    /* a1,a2 = 2....p-2 */
349*59599516SKenneth E. Jansen                 for(a2 = 2; a2 < ip-1; a2++){  /* a1+a2 = p        */
350*59599516SKenneth E. Jansen                     if( a1+a1 == ip ){
351*59599516SKenneth E. Jansen 
352*59599516SKenneth E. Jansen //  	    entfn[mc] = phi(a1,xi1)*phi(a2,xi2)/qfb;
353*59599516SKenneth E. Jansen 
354*59599516SKenneth E. Jansen //  	    temp1 = (phi(a2,xi2)/qfb*qfb);
355*59599516SKenneth E. Jansen //  	    temp2 = (qfb*phiDrv(a1,xi1)- dqfbdxi1*phi(a1,xi1));
356*59599516SKenneth E. Jansen //  	    edrv[mc][gOrd[0]]= temp1*temp2;
357*59599516SKenneth E. Jansen 
358*59599516SKenneth E. Jansen //  	    temp1 = (phi(a1,xi1)/qfb*qfb);
359*59599516SKenneth E. Jansen //  	    temp2 = (qfb*phiDrv(a2,xi2)- dqfbdxi2*phi(a2,xi2));
360*59599516SKenneth E. Jansen //  	    edrv[mc][gOrd[1]]= temp1*temp2;
361*59599516SKenneth E. Jansen 
362*59599516SKenneth E. Jansen //  	    edrv[mc++][gOrd[2]]=0.0;
363*59599516SKenneth E. Jansen 
364*59599516SKenneth E. Jansen                         entfn[mc] = phi(a1,xi1)*phi(a2,xi2);
365*59599516SKenneth E. Jansen                         edrv[mc][gOrd[0]] = phiDrv(a1, xi1)*phi(a2, xi2);
366*59599516SKenneth E. Jansen                         edrv[mc][gOrd[1]] = phi(a1, xi1)*phiDrv(a2, xi2);
367*59599516SKenneth E. Jansen                         edrv[mc++][gOrd[2]]=0.0;
368*59599516SKenneth E. Jansen 
369*59599516SKenneth E. Jansen                     }
370*59599516SKenneth E. Jansen                 }
371*59599516SKenneth E. Jansen             }
372*59599516SKenneth E. Jansen         }
373*59599516SKenneth E. Jansen     } else nfm =0;
374*59599516SKenneth E. Jansen     return nfm;
375*59599516SKenneth E. Jansen }
376*59599516SKenneth E. Jansen 
377*59599516SKenneth E. Jansen int hex_regn(double xi[3],int p, double* entfn, double** edrv)
378*59599516SKenneth E. Jansen {
379*59599516SKenneth E. Jansen     int a1, a2, a3;
380*59599516SKenneth E. Jansen     int nrm, mc=0;
381*59599516SKenneth E. Jansen 
382*59599516SKenneth E. Jansen     double xi1 = xi[0];
383*59599516SKenneth E. Jansen     double xi2 = xi[1];
384*59599516SKenneth E. Jansen     double xi3 = xi[2];
385*59599516SKenneth E. Jansen 
386*59599516SKenneth E. Jansen     if( p > 5){
387*59599516SKenneth E. Jansen 
388*59599516SKenneth E. Jansen         nrm = (p-3)*(p-4)*(p-5)/6;
389*59599516SKenneth E. Jansen         //      entfn = new double [nrm];
390*59599516SKenneth E. Jansen         //      edrv = new double* [nrm];
391*59599516SKenneth E. Jansen         //      for(int i=0; i< nrm; i++){
392*59599516SKenneth E. Jansen         //        edrv[i]=new double [3];
393*59599516SKenneth E. Jansen         //      }
394*59599516SKenneth E. Jansen 
395*59599516SKenneth E. Jansen         for(int ip =6; ip< p+1; ip++){
396*59599516SKenneth E. Jansen 
397*59599516SKenneth E. Jansen             for(a1=2; a1 < ip-3; a1++){
398*59599516SKenneth E. Jansen                 for(a2=2; a2 < ip-3; a2++){
399*59599516SKenneth E. Jansen                     for(a3=2; a3 < ip-3; a3++){
400*59599516SKenneth E. Jansen                         if(a1+a2+a3 == ip){
401*59599516SKenneth E. Jansen                             entfn[mc]=phi(a1,xi1)*phi(a2,xi2)*phi(a3,xi3);
402*59599516SKenneth E. Jansen 
403*59599516SKenneth E. Jansen                             edrv[mc][0]=phiDrv(a1,xi1)*phi(a2,xi2)*phi(a3,xi3);
404*59599516SKenneth E. Jansen 
405*59599516SKenneth E. Jansen                             edrv[mc][1]=phi(a1,xi1)*phiDrv(a2,xi2)*phi(a3,xi3);
406*59599516SKenneth E. Jansen 
407*59599516SKenneth E. Jansen                             edrv[mc++][2]=phi(a1,xi1)*phi(a2,xi2)*phiDrv(a3,xi3);
408*59599516SKenneth E. Jansen                         }
409*59599516SKenneth E. Jansen                     }
410*59599516SKenneth E. Jansen                 }
411*59599516SKenneth E. Jansen             }
412*59599516SKenneth E. Jansen         }
413*59599516SKenneth E. Jansen     }else nrm =0;
414*59599516SKenneth E. Jansen     return nrm;
415*59599516SKenneth E. Jansen }
416*59599516SKenneth E. Jansen 
417*59599516SKenneth E. Jansen 
418*59599516SKenneth E. Jansen 
419*59599516SKenneth E. Jansen /* hex hierarchic shape function */
420*59599516SKenneth E. Jansen int HexShapeAndDrv(int p,double par[3],double N[],double dN[][3])
421*59599516SKenneth E. Jansen {
422*59599516SKenneth E. Jansen     int nshp = 0;
423*59599516SKenneth E. Jansen     int tmp1[4];
424*59599516SKenneth E. Jansen     int a,b;
425*59599516SKenneth E. Jansen     double EdgeBlend,dEBdxi,dEBdeta,dEBdzeta;
426*59599516SKenneth E. Jansen     double arg[3];
427*59599516SKenneth E. Jansen     int arg2[3];
428*59599516SKenneth E. Jansen     double* entfn;
429*59599516SKenneth E. Jansen     double** endrv;
430*59599516SKenneth E. Jansen     int num_e_modes, num_f_modes, num_r_modes;
431*59599516SKenneth E. Jansen 
432*59599516SKenneth E. Jansen     int** edge[12];
433*59599516SKenneth E. Jansen     int n[8][3]={{-1,-1,-1},{1,-1,-1},{1,1,-1},{-1,1,-1},
434*59599516SKenneth E. Jansen                  {-1,-1,1},{1,-1,1},{1,1,1},{-1,1,1}};
435*59599516SKenneth E. Jansen 
436*59599516SKenneth E. Jansen     int face[6][4] = {{0,3,2,1},{0,1,5,4},{1,2,6,5},
437*59599516SKenneth E. Jansen                       {0,4,7,3},{2,3,7,6},{4,5,6,7}};
438*59599516SKenneth E. Jansen     int vrt[4], z;
439*59599516SKenneth E. Jansen     int normal,sign;
440*59599516SKenneth E. Jansen     double FaceBlend, dFBdxi, dFBdeta, dFBdzeta;
441*59599516SKenneth E. Jansen 
442*59599516SKenneth E. Jansen     if(p<1) return nshp;
443*59599516SKenneth E. Jansen 
444*59599516SKenneth E. Jansen     double xi = par[0];
445*59599516SKenneth E. Jansen     double eta = par[1];
446*59599516SKenneth E. Jansen     double zeta = par[2];
447*59599516SKenneth E. Jansen 
448*59599516SKenneth E. Jansen     double xim=1-xi;
449*59599516SKenneth E. Jansen     double etam=1-eta;
450*59599516SKenneth E. Jansen     double zetam=1-zeta;
451*59599516SKenneth E. Jansen 
452*59599516SKenneth E. Jansen     double xip=1+xi;
453*59599516SKenneth E. Jansen     double etap=1+eta;
454*59599516SKenneth E. Jansen     double zetap=1+zeta;
455*59599516SKenneth E. Jansen 
456*59599516SKenneth E. Jansen     /* Shape functions for the Nodes.
457*59599516SKenneth E. Jansen      *  There are eight nodal shapefunctions. These are same as the
458*59599516SKenneth E. Jansen      *  standard shape functions used in the eight-noded hexahedral
459*59599516SKenneth E. Jansen      *  elements
460*59599516SKenneth E. Jansen      */
461*59599516SKenneth E. Jansen 
462*59599516SKenneth E. Jansen     N[0]= 0.125* xim * etam * zetam ;
463*59599516SKenneth E. Jansen     N[1]= 0.125* xip * etam * zetam ;
464*59599516SKenneth E. Jansen     N[2]= 0.125* xip * etap * zetam ;
465*59599516SKenneth E. Jansen     N[3]= 0.125* xim * etap * zetam ;
466*59599516SKenneth E. Jansen     N[4]= 0.125* xim * etam * zetap ;
467*59599516SKenneth E. Jansen     N[5]= 0.125* xip * etam * zetap ;
468*59599516SKenneth E. Jansen     N[6]= 0.125* xip * etap * zetap ;
469*59599516SKenneth E. Jansen     N[7]= 0.125* xim * etap * zetap ;
470*59599516SKenneth E. Jansen 
471*59599516SKenneth E. Jansen     /* Derivative of the above Shape Functions */
472*59599516SKenneth E. Jansen 
473*59599516SKenneth E. Jansen     dN[0][0]=-0.125*etam*zetam;
474*59599516SKenneth E. Jansen     dN[0][1]=-0.125*xim*zetam;
475*59599516SKenneth E. Jansen     dN[0][2]=-0.125*xim*etam;
476*59599516SKenneth E. Jansen 
477*59599516SKenneth E. Jansen     dN[1][0]=0.125 * etam * zetam;
478*59599516SKenneth E. Jansen     dN[1][1]=-0.125 * xip * zetam;
479*59599516SKenneth E. Jansen     dN[1][2]=-0.125 * xip * etam;
480*59599516SKenneth E. Jansen 
481*59599516SKenneth E. Jansen     dN[2][0]= 0.125 * etap * zetam;
482*59599516SKenneth E. Jansen     dN[2][1] = 0.125 * xip * zetam;
483*59599516SKenneth E. Jansen     dN[2][2] = -0.125 * xip * etap;
484*59599516SKenneth E. Jansen 
485*59599516SKenneth E. Jansen     dN[3][0] = -0.125 * etap * zetam;
486*59599516SKenneth E. Jansen     dN[3][1] = 0.125 * xim * zetam;
487*59599516SKenneth E. Jansen     dN[3][2] =-0.125 * xim * etap;
488*59599516SKenneth E. Jansen 
489*59599516SKenneth E. Jansen     dN[4][0] = -0.125 * etam * zetap;
490*59599516SKenneth E. Jansen     dN[4][1] = -0.125 * xim * zetap;
491*59599516SKenneth E. Jansen     dN[4][2] = 0.125 * xim * etam;
492*59599516SKenneth E. Jansen 
493*59599516SKenneth E. Jansen 
494*59599516SKenneth E. Jansen     dN[5][0] = 0.125 * etam * zetap;
495*59599516SKenneth E. Jansen     dN[5][1] =-0.125 * xip * zetap;
496*59599516SKenneth E. Jansen     dN[5][2] = 0.125 * xip * etam;
497*59599516SKenneth E. Jansen 
498*59599516SKenneth E. Jansen     dN[6][0] = 0.125 * etap * zetap;
499*59599516SKenneth E. Jansen     dN[6][1] = 0.125 * xip * zetap;
500*59599516SKenneth E. Jansen     dN[6][2] = 0.125 * xip * etap;
501*59599516SKenneth E. Jansen 
502*59599516SKenneth E. Jansen     dN[7][0] = -0.125 * etap * zetap ;
503*59599516SKenneth E. Jansen     dN[7][1] = 0.125 * xim * zetap;
504*59599516SKenneth E. Jansen     dN[7][2] = 0.125 * xim * etap;
505*59599516SKenneth E. Jansen 
506*59599516SKenneth E. Jansen     nshp = 8;
507*59599516SKenneth E. Jansen 
508*59599516SKenneth E. Jansen     if( p > 1) {
509*59599516SKenneth E. Jansen 
510*59599516SKenneth E. Jansen         /* Generate Shape Functions for Edge Modes.
511*59599516SKenneth E. Jansen          * For a polynomial Order of p there will be 12*(p-1)
512*59599516SKenneth E. Jansen          * edge modes for the entire element.
513*59599516SKenneth E. Jansen          */
514*59599516SKenneth E. Jansen 
515*59599516SKenneth E. Jansen         /*
516*59599516SKenneth E. Jansen          * edge order description;
517*59599516SKenneth E. Jansen          */
518*59599516SKenneth E. Jansen 
519*59599516SKenneth E. Jansen         for(int y=0;y<12;y++)
520*59599516SKenneth E. Jansen         {
521*59599516SKenneth E. Jansen             edge[y]=new int * [2];
522*59599516SKenneth E. Jansen         }
523*59599516SKenneth E. Jansen 
524*59599516SKenneth E. Jansen         edge[0][0]=n[0];edge[0][1]=n[1];
525*59599516SKenneth E. Jansen         edge[1][0]=n[1];edge[1][1]=n[2];
526*59599516SKenneth E. Jansen         edge[2][0]=n[2];edge[2][1]=n[3];
527*59599516SKenneth E. Jansen         edge[3][0]=n[3];edge[3][1]=n[0];
528*59599516SKenneth E. Jansen         edge[4][0]=n[4];edge[4][1]=n[5];
529*59599516SKenneth E. Jansen         edge[5][0]=n[5];edge[5][1]=n[6];
530*59599516SKenneth E. Jansen         edge[6][0]=n[6];edge[6][1]=n[7];
531*59599516SKenneth E. Jansen         edge[7][0]=n[7];edge[7][1]=n[4];
532*59599516SKenneth E. Jansen         edge[8][0]=n[0];edge[8][1]=n[4];
533*59599516SKenneth E. Jansen         edge[9][0]=n[1];edge[9][1]=n[5];
534*59599516SKenneth E. Jansen         edge[10][0]=n[2];edge[10][1]=n[6];
535*59599516SKenneth E. Jansen         edge[11][0]=n[3];edge[11][1]=n[7];
536*59599516SKenneth E. Jansen 
537*59599516SKenneth E. Jansen 
538*59599516SKenneth E. Jansen         int nem = p-1;
539*59599516SKenneth E. Jansen 
540*59599516SKenneth E. Jansen         for(int e=0; e < 12; e++){
541*59599516SKenneth E. Jansen 
542*59599516SKenneth E. Jansen             for(z=0;z<3;z++){
543*59599516SKenneth E. Jansen                 if(!(edge[e][0][z]==edge[e][1][z]))
544*59599516SKenneth E. Jansen                     tmp1[3]=z;
545*59599516SKenneth E. Jansen                 tmp1[z]=edge[e][1][z];
546*59599516SKenneth E. Jansen             }
547*59599516SKenneth E. Jansen 
548*59599516SKenneth E. Jansen             if((arg2[0] = tmp1[3]) == 0) { arg2[1]=1;arg2[2]=2 ;}
549*59599516SKenneth E. Jansen             else if(tmp1[3]==1) { arg2[1]=2;arg2[2]=0;}
550*59599516SKenneth E. Jansen             else { arg2[1]=0;arg2[2]=1;}
551*59599516SKenneth E. Jansen 
552*59599516SKenneth E. Jansen             /* arg[0]=par[arg2[0]]*tmp1[arg2[0]]; */
553*59599516SKenneth E. Jansen             arg[0]=par[arg2[0]];
554*59599516SKenneth E. Jansen             arg[1]=par[arg2[1]];
555*59599516SKenneth E. Jansen             arg[2]=par[arg2[2]];
556*59599516SKenneth E. Jansen 
557*59599516SKenneth E. Jansen             a = arg2[1];
558*59599516SKenneth E. Jansen             b = arg2[2];
559*59599516SKenneth E. Jansen 
560*59599516SKenneth E. Jansen             EdgeBlend = Hex_eB(arg,tmp1[a],tmp1[b]);
561*59599516SKenneth E. Jansen 
562*59599516SKenneth E. Jansen             if( tmp1[3] == 0){
563*59599516SKenneth E. Jansen                 dEBdxi    = dHEBdxi1(arg,tmp1[a],tmp1[b]);
564*59599516SKenneth E. Jansen                 dEBdeta   = dHEBdxi2(arg,tmp1[a],tmp1[b]);
565*59599516SKenneth E. Jansen                 dEBdzeta  = dHEBdxi3(arg,tmp1[a],tmp1[b]);
566*59599516SKenneth E. Jansen             } else if( tmp1[3] == 1 ){
567*59599516SKenneth E. Jansen                 dEBdeta   = dHEBdxi1(arg,tmp1[a],tmp1[b]);
568*59599516SKenneth E. Jansen                 dEBdzeta  = dHEBdxi2(arg,tmp1[a],tmp1[b]);
569*59599516SKenneth E. Jansen                 dEBdxi    = dHEBdxi3(arg,tmp1[a],tmp1[b]);
570*59599516SKenneth E. Jansen             } else {
571*59599516SKenneth E. Jansen                 dEBdzeta  = dHEBdxi1(arg,tmp1[a],tmp1[b]);
572*59599516SKenneth E. Jansen                 dEBdxi    = dHEBdxi2(arg,tmp1[a],tmp1[b]);
573*59599516SKenneth E. Jansen                 dEBdeta   = dHEBdxi3(arg,tmp1[a],tmp1[b]);
574*59599516SKenneth E. Jansen             }
575*59599516SKenneth E. Jansen 
576*59599516SKenneth E. Jansen             entfn = new double [nem];
577*59599516SKenneth E. Jansen             endrv = new double* [nem];
578*59599516SKenneth E. Jansen             for(z =0; z < nem ; z++){
579*59599516SKenneth E. Jansen                 endrv[z]=new double [3];
580*59599516SKenneth E. Jansen             }
581*59599516SKenneth E. Jansen 
582*59599516SKenneth E. Jansen             num_e_modes = mesh_edge(arg[0],arg2,p,entfn,endrv);
583*59599516SKenneth E. Jansen 
584*59599516SKenneth E. Jansen             for(int nm=0; nm < num_e_modes; nm++){
585*59599516SKenneth E. Jansen 
586*59599516SKenneth E. Jansen                 N[nshp]= EdgeBlend * entfn[nm];
587*59599516SKenneth E. Jansen                 dN[nshp][0]= EdgeBlend * endrv[nm][0] + dEBdxi * entfn[nm];
588*59599516SKenneth E. Jansen                 dN[nshp][1]= EdgeBlend * endrv[nm][1] + dEBdeta * entfn[nm];
589*59599516SKenneth E. Jansen                 dN[nshp][2]= EdgeBlend * endrv[nm][2] + dEBdzeta * entfn[nm];
590*59599516SKenneth E. Jansen 
591*59599516SKenneth E. Jansen                 nshp++;
592*59599516SKenneth E. Jansen             }
593*59599516SKenneth E. Jansen 
594*59599516SKenneth E. Jansen             delete [] entfn;
595*59599516SKenneth E. Jansen             for(z=0; z< num_e_modes; z++){
596*59599516SKenneth E. Jansen                 delete [] endrv[z]; }
597*59599516SKenneth E. Jansen             delete [] endrv;
598*59599516SKenneth E. Jansen 
599*59599516SKenneth E. Jansen         }
600*59599516SKenneth E. Jansen     }
601*59599516SKenneth E. Jansen 
602*59599516SKenneth E. Jansen     if( p > 3 ) {
603*59599516SKenneth E. Jansen 
604*59599516SKenneth E. Jansen         /* Generating Shape functions for the face modes .
605*59599516SKenneth E. Jansen          * For a Hexahedral Element there are 3*(p-2)*(p-3) shape
606*59599516SKenneth E. Jansen          * functions associated with the face modes [ p>=4]
607*59599516SKenneth E. Jansen          */
608*59599516SKenneth E. Jansen 
609*59599516SKenneth E. Jansen         int nfm = (p-2)*(p-3)/2;
610*59599516SKenneth E. Jansen 
611*59599516SKenneth E. Jansen         for(int f=0; f< 6; f++) {
612*59599516SKenneth E. Jansen             /* Identitfying the normal to the face */
613*59599516SKenneth E. Jansen 
614*59599516SKenneth E. Jansen             for(int u=0;u<4;u++){
615*59599516SKenneth E. Jansen                 vrt[u]=face[f][u];
616*59599516SKenneth E. Jansen             }
617*59599516SKenneth E. Jansen             for(int v=0;v<3;v++)
618*59599516SKenneth E. Jansen             {
619*59599516SKenneth E. Jansen                 if((n[vrt[0]][v]==n[vrt[1]][v])&&(n[vrt[1]][v]==n[vrt[2]][v]))
620*59599516SKenneth E. Jansen                     normal=v;
621*59599516SKenneth E. Jansen                 sign=n[vrt[0]][v];
622*59599516SKenneth E. Jansen             }
623*59599516SKenneth E. Jansen 
624*59599516SKenneth E. Jansen 
625*59599516SKenneth E. Jansen             arg2[2] = normal;
626*59599516SKenneth E. Jansen 
627*59599516SKenneth E. Jansen             if( normal==0) { arg2[0]=1;arg2[1]=2 ;}
628*59599516SKenneth E. Jansen             else if(normal==1) { arg2[0]=2;arg2[1]=0;}
629*59599516SKenneth E. Jansen             else { arg2[0]=0;arg2[1]=1;}
630*59599516SKenneth E. Jansen 
631*59599516SKenneth E. Jansen             arg[0] = par[arg2[0]];
632*59599516SKenneth E. Jansen             arg[1] = par[arg2[1]];
633*59599516SKenneth E. Jansen             arg[2] = par[arg2[2]];
634*59599516SKenneth E. Jansen 
635*59599516SKenneth E. Jansen             FaceBlend = Hex_fB(arg,sign);
636*59599516SKenneth E. Jansen 
637*59599516SKenneth E. Jansen             if( normal == 0){
638*59599516SKenneth E. Jansen                 dFBdxi    = dHFBdxi3(arg,sign);
639*59599516SKenneth E. Jansen                 dFBdeta   = dHFBdxi1(arg,sign);
640*59599516SKenneth E. Jansen                 dFBdzeta  = dHFBdxi2(arg,sign);
641*59599516SKenneth E. Jansen             } else if( normal == 1 ){
642*59599516SKenneth E. Jansen                 dFBdeta   = dHFBdxi3(arg,sign);
643*59599516SKenneth E. Jansen                 dFBdzeta  = dHFBdxi1(arg,sign);
644*59599516SKenneth E. Jansen                 dFBdxi    = dHFBdxi2(arg,sign);
645*59599516SKenneth E. Jansen             } else {
646*59599516SKenneth E. Jansen                 dFBdzeta  = dHFBdxi3(arg,sign);
647*59599516SKenneth E. Jansen                 dFBdxi    = dHFBdxi1(arg,sign);
648*59599516SKenneth E. Jansen                 dFBdeta   = dHFBdxi2(arg,sign);
649*59599516SKenneth E. Jansen             }
650*59599516SKenneth E. Jansen 
651*59599516SKenneth E. Jansen             entfn = new double [nfm];
652*59599516SKenneth E. Jansen             endrv = new double* [nfm];
653*59599516SKenneth E. Jansen             for(z=0; z < nfm ; z++){
654*59599516SKenneth E. Jansen                 endrv[z]=new double [3];
655*59599516SKenneth E. Jansen             }
656*59599516SKenneth E. Jansen 
657*59599516SKenneth E. Jansen             num_f_modes = quad_face(arg,arg2,p,entfn,endrv);
658*59599516SKenneth E. Jansen 
659*59599516SKenneth E. Jansen             for(int nm =0; nm < num_f_modes ; nm++){
660*59599516SKenneth E. Jansen 
661*59599516SKenneth E. Jansen                 N[nshp] =  FaceBlend * entfn[nm];
662*59599516SKenneth E. Jansen                 dN[nshp][0] = FaceBlend * endrv[nm][0] + dFBdxi * entfn[nm];
663*59599516SKenneth E. Jansen                 dN[nshp][1] = FaceBlend * endrv[nm][1] + dFBdeta * entfn[nm];
664*59599516SKenneth E. Jansen                 dN[nshp][2] = FaceBlend * endrv[nm][2] + dFBdzeta * entfn[nm];
665*59599516SKenneth E. Jansen 
666*59599516SKenneth E. Jansen                 nshp++;
667*59599516SKenneth E. Jansen             }
668*59599516SKenneth E. Jansen 
669*59599516SKenneth E. Jansen             delete [] entfn;
670*59599516SKenneth E. Jansen             for( z=0; z< num_f_modes; z++){
671*59599516SKenneth E. Jansen                 delete [] endrv[z]; }
672*59599516SKenneth E. Jansen             delete [] endrv;
673*59599516SKenneth E. Jansen         }
674*59599516SKenneth E. Jansen     }
675*59599516SKenneth E. Jansen 
676*59599516SKenneth E. Jansen     if ( p > 5 ) {
677*59599516SKenneth E. Jansen 
678*59599516SKenneth E. Jansen         int nrm = (p-3)*(p-4)*(p-5)/6;
679*59599516SKenneth E. Jansen 
680*59599516SKenneth E. Jansen         entfn = new double [nrm];
681*59599516SKenneth E. Jansen         endrv = new double* [nrm];
682*59599516SKenneth E. Jansen         for(z =0; z < nrm ; z++){
683*59599516SKenneth E. Jansen             endrv[z]=new double [3];
684*59599516SKenneth E. Jansen         }
685*59599516SKenneth E. Jansen 
686*59599516SKenneth E. Jansen         num_r_modes = hex_regn(par,p,entfn,endrv);
687*59599516SKenneth E. Jansen 
688*59599516SKenneth E. Jansen         for(int nm =0; nm < num_r_modes ; nm++){
689*59599516SKenneth E. Jansen             N[nshp] = entfn[nm];
690*59599516SKenneth E. Jansen             for(int d=0; d < 3; d++){
691*59599516SKenneth E. Jansen                 dN[nshp][d] = endrv[nm][d];
692*59599516SKenneth E. Jansen             }
693*59599516SKenneth E. Jansen             nshp++;
694*59599516SKenneth E. Jansen         }
695*59599516SKenneth E. Jansen         delete [] entfn;
696*59599516SKenneth E. Jansen         for(z=0; z< num_r_modes; z++){
697*59599516SKenneth E. Jansen             delete [] endrv[z]; }
698*59599516SKenneth E. Jansen         delete [] endrv;
699*59599516SKenneth E. Jansen 
700*59599516SKenneth E. Jansen     }
701*59599516SKenneth E. Jansen     return nshp;
702*59599516SKenneth E. Jansen }
703*59599516SKenneth E. Jansen 
704*59599516SKenneth E. Jansen /* hierarchic wedge element shape function */
705*59599516SKenneth E. Jansen 
706*59599516SKenneth E. Jansen int WedgeShapeAndDrv( int p, double Inputpar[3], double N[], double dN[][3] )
707*59599516SKenneth E. Jansen {
708*59599516SKenneth E. Jansen     int i,j;
709*59599516SKenneth E. Jansen     double FaceBlend, FaceBlendDrv[4];
710*59599516SKenneth E. Jansen     double FaceEnt; //, FaceEntDrv[2][3];
711*59599516SKenneth E. Jansen     double par[4];
712*59599516SKenneth E. Jansen     //  int sign;
713*59599516SKenneth E. Jansen     //  int temp[4]={0,0,0,0};
714*59599516SKenneth E. Jansen     double EdgeBlend[9], EdgeBlendDrv[9][3];
715*59599516SKenneth E. Jansen     //  double arg[3];
716*59599516SKenneth E. Jansen     //  double arg2[2];
717*59599516SKenneth E. Jansen     //  int ** edge[9];
718*59599516SKenneth E. Jansen     double entfn[9];
719*59599516SKenneth E. Jansen     double endrv[9][3];
720*59599516SKenneth E. Jansen     //  int num_e_modes;
721*59599516SKenneth E. Jansen     // int n[6][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
722*59599516SKenneth E. Jansen 
723*59599516SKenneth E. Jansen     int nshp = 0;
724*59599516SKenneth E. Jansen     par[0] = 1.0 - Inputpar[0]- Inputpar[1];
725*59599516SKenneth E. Jansen     par[1] = Inputpar[0];
726*59599516SKenneth E. Jansen     par[2] = Inputpar[1];
727*59599516SKenneth E. Jansen     par[3] = Inputpar[2];
728*59599516SKenneth E. Jansen 
729*59599516SKenneth E. Jansen 
730*59599516SKenneth E. Jansen     if(p<1) return nshp;
731*59599516SKenneth E. Jansen 
732*59599516SKenneth E. Jansen    /* there are six nodal shape functions same as the standard
733*59599516SKenneth E. Jansen       shape functions used in the six-noded wedge element */
734*59599516SKenneth E. Jansen 
735*59599516SKenneth E. Jansen    N[0]=0.5*par[0]*(1.0-par[3]);
736*59599516SKenneth E. Jansen    N[1]=0.5*par[1]*(1.0-par[3]);
737*59599516SKenneth E. Jansen    N[2]=0.5*par[2]*(1.0-par[3]);
738*59599516SKenneth E. Jansen    N[3]=0.5*par[0]*(1.0+par[3]);
739*59599516SKenneth E. Jansen    N[4]=0.5*par[1]*(1.0+par[3]);
740*59599516SKenneth E. Jansen    N[5]=0.5*par[2]*(1.0+par[3]);
741*59599516SKenneth E. Jansen 
742*59599516SKenneth E. Jansen    /* Derivative of the above Shape functions */
743*59599516SKenneth E. Jansen    dN[0][0]=-0.25*(1.0-par[3]);
744*59599516SKenneth E. Jansen    dN[0][1]=-0.25*(1.0-par[3]);
745*59599516SKenneth E. Jansen    dN[0][2]=-0.5*par[0];
746*59599516SKenneth E. Jansen 
747*59599516SKenneth E. Jansen    dN[1][0]=0.25*(1.0-par[3]);
748*59599516SKenneth E. Jansen    dN[1][1]=0.0;
749*59599516SKenneth E. Jansen    dN[1][2]=-0.5*par[1];
750*59599516SKenneth E. Jansen 
751*59599516SKenneth E. Jansen    dN[2][0]=0.0;
752*59599516SKenneth E. Jansen    dN[2][1]=0.25*(1.0-par[3]);
753*59599516SKenneth E. Jansen    dN[2][2]=-0.5*par[2];
754*59599516SKenneth E. Jansen 
755*59599516SKenneth E. Jansen    dN[3][0]=-0.25*(1.0+par[3]);
756*59599516SKenneth E. Jansen    dN[3][1]=-0.25*(1.0+par[3]);
757*59599516SKenneth E. Jansen    dN[3][2]=0.5*par[0];
758*59599516SKenneth E. Jansen 
759*59599516SKenneth E. Jansen    dN[4][0]=0.25*(1.0+par[3]);
760*59599516SKenneth E. Jansen    dN[4][1]=0.0;
761*59599516SKenneth E. Jansen    dN[4][2]=0.5*par[1];
762*59599516SKenneth E. Jansen 
763*59599516SKenneth E. Jansen    dN[5][0]=0.0;
764*59599516SKenneth E. Jansen    dN[5][1]=0.25*(1.0+par[3]);
765*59599516SKenneth E. Jansen    dN[5][2]=0.5*par[2];
766*59599516SKenneth E. Jansen 
767*59599516SKenneth E. Jansen 
768*59599516SKenneth E. Jansen    nshp = 6;
769*59599516SKenneth E. Jansen 
770*59599516SKenneth E. Jansen //   if( p > 1 ){
771*59599516SKenneth E. Jansen 
772*59599516SKenneth E. Jansen //     /* calculate the blending shape functions and their drivitative */
773*59599516SKenneth E. Jansen //      EdgeBlend[0] = -par[0]*par[1]*(1.0-par[3]);
774*59599516SKenneth E. Jansen //      EdgeBlendDrv[0][0] = -0.5*(par[0]-par[1])*(1.0-par[3]);
775*59599516SKenneth E. Jansen //      EdgeBlendDrv[0][1] = 0.5*par[1]*(1.0-par[3]);
776*59599516SKenneth E. Jansen //      EdgeBlendDrv[0][2] = par[0]*par[1];
777*59599516SKenneth E. Jansen 
778*59599516SKenneth E. Jansen //      EdgeBlend[1] = -par[1]*par[2]*(1.0-par[3]);
779*59599516SKenneth E. Jansen //      EdgeBlendDrv[1][0] = -0.5*par[2]*(1.0-par[3]);
780*59599516SKenneth E. Jansen //      EdgeBlendDrv[1][1] = -0.5*par[1]*(1.0-par[3]);
781*59599516SKenneth E. Jansen //      EdgeBlendDrv[1][2] = par[1]*par[2];
782*59599516SKenneth E. Jansen 
783*59599516SKenneth E. Jansen //      EdgeBlend[2] = -par[0]*par[2]*(1.0-par[3]);
784*59599516SKenneth E. Jansen //      EdgeBlendDrv[2][0] = 0.5*par[2]*(1.0-par[3]);
785*59599516SKenneth E. Jansen //      EdgeBlendDrv[2][1] = -0.5*(par[0]-par[2])*(1.0-par[3]);
786*59599516SKenneth E. Jansen //      EdgeBlendDrv[2][2] = par[0]*par[2];
787*59599516SKenneth E. Jansen 
788*59599516SKenneth E. Jansen //      EdgeBlend[3] = -par[0]*par[1]*(1.0+par[3]);
789*59599516SKenneth E. Jansen //      EdgeBlendDrv[3][0] = -0.5*(par[0]-par[1])*(1.0+par[3]);
790*59599516SKenneth E. Jansen //      EdgeBlendDrv[3][1] = 0.5*par[1]*(1.0+par[3]);
791*59599516SKenneth E. Jansen //      EdgeBlendDrv[3][2] = -par[0]*par[1];
792*59599516SKenneth E. Jansen 
793*59599516SKenneth E. Jansen //      EdgeBlend[4] = -par[1]*par[2]*(1.0+par[3]);
794*59599516SKenneth E. Jansen //      EdgeBlendDrv[4][0] = -0.5*par[2]*(1.0+par[3]);
795*59599516SKenneth E. Jansen //      EdgeBlendDrv[4][1] = -0.5*par[1]*(1.0+par[3]);
796*59599516SKenneth E. Jansen //      EdgeBlendDrv[4][2] = -par[1]*par[2];
797*59599516SKenneth E. Jansen 
798*59599516SKenneth E. Jansen //      EdgeBlend[5] = -par[0]*par[2]*(1.0+par[3]);
799*59599516SKenneth E. Jansen //      EdgeBlendDrv[5][0] = 0.5*par[2]*(1.0+par[3]);
800*59599516SKenneth E. Jansen //      EdgeBlendDrv[5][1] = -0.5*(par[0]-par[2])*(1.0+par[3]);
801*59599516SKenneth E. Jansen //      EdgeBlendDrv[5][2] = -par[0]*par[2];
802*59599516SKenneth E. Jansen 
803*59599516SKenneth E. Jansen //      EdgeBlend[6] = 0.5*par[0]*(par[3]*par[3]-1.0);
804*59599516SKenneth E. Jansen //      EdgeBlendDrv[6][0] = -0.25*(par[3]*par[3] - 1.0);
805*59599516SKenneth E. Jansen //      EdgeBlendDrv[6][1] = -0.25*(par[3]*par[3] - 1.0);
806*59599516SKenneth E. Jansen //      EdgeBlendDrv[6][2] = par[0]*par[3];
807*59599516SKenneth E. Jansen 
808*59599516SKenneth E. Jansen //      EdgeBlend[7] = 0.5*par[1]*(par[3]*par[3]-1.0);
809*59599516SKenneth E. Jansen //      EdgeBlendDrv[7][0] = 0.25*(par[3]*par[3] - 1.0);
810*59599516SKenneth E. Jansen //      EdgeBlendDrv[7][1] = 0.0;
811*59599516SKenneth E. Jansen //      EdgeBlendDrv[7][2] = par[1]*par[3];
812*59599516SKenneth E. Jansen 
813*59599516SKenneth E. Jansen //      EdgeBlend[8] = 0.5*par[2]*(par[3]*par[3]-1.0);
814*59599516SKenneth E. Jansen //      EdgeBlendDrv[8][0] = 0.0;
815*59599516SKenneth E. Jansen //      EdgeBlendDrv[8][1] = 0.25*(par[3]*par[3] - 1.0);
816*59599516SKenneth E. Jansen //      EdgeBlendDrv[8][2] = par[2]*par[3];
817*59599516SKenneth E. Jansen 
818*59599516SKenneth E. Jansen //       /* calculate the mesh entity shape function */
819*59599516SKenneth E. Jansen 
820*59599516SKenneth E. Jansen //      /* for the edge in the two triangle faces */
821*59599516SKenneth E. Jansen //      for(j=0; j<9; j++){
822*59599516SKenneth E. Jansen //        /* this is where I think the change in phi is for wedges */
823*59599516SKenneth E. Jansen //        entfn[j] = 1.0;
824*59599516SKenneth E. Jansen // 	 /*    entfn[j] = sqrt(1.5); */
825*59599516SKenneth E. Jansen //        for(i=0; i<3; i++)
826*59599516SKenneth E. Jansen // 	 endrv[j][i] = 0.0;
827*59599516SKenneth E. Jansen //      }
828*59599516SKenneth E. Jansen 
829*59599516SKenneth E. Jansen // //       /* for the edge in the perpendicular to triangle faces */
830*59599516SKenneth E. Jansen // //       for(j=6; j<9; j++){
831*59599516SKenneth E. Jansen // //         entfn[j] = phi(2, par[3]);
832*59599516SKenneth E. Jansen // //         for(i=0; i<3; i++)
833*59599516SKenneth E. Jansen // //  	 endrv[j][i] = 0.0;
834*59599516SKenneth E. Jansen // //       }
835*59599516SKenneth E. Jansen 
836*59599516SKenneth E. Jansen //      for(j=0; j<9; j++){
837*59599516SKenneth E. Jansen //        N[nshp] = EdgeBlend[j]*entfn[j];
838*59599516SKenneth E. Jansen //        dN[nshp][0] = EdgeBlend[j]*endrv[j][0] + EdgeBlendDrv[j][0]*entfn[j];
839*59599516SKenneth E. Jansen //        dN[nshp][1] = EdgeBlend[j]*endrv[j][1] + EdgeBlendDrv[j][1]*entfn[j];
840*59599516SKenneth E. Jansen //        dN[nshp][2] = EdgeBlend[j]*endrv[j][2] + EdgeBlendDrv[j][2]*entfn[j];
841*59599516SKenneth E. Jansen 
842*59599516SKenneth E. Jansen //        ++nshp;
843*59599516SKenneth E. Jansen //      }
844*59599516SKenneth E. Jansen 
845*59599516SKenneth E. Jansen //   }
846*59599516SKenneth E. Jansen 
847*59599516SKenneth E. Jansen //   /* generate the tri face shape fuction */
848*59599516SKenneth E. Jansen //   if( p > 2 ){
849*59599516SKenneth E. Jansen //     for(i=0;i<11;i++){
850*59599516SKenneth E. Jansen //       /* get the face blending functions */
851*59599516SKenneth E. Jansen //       if(par[3]>0){
852*59599516SKenneth E. Jansen // 	FaceBlend = 0.5*par[0]*par[1]*par[2]*(1.0-par[3]);
853*59599516SKenneth E. Jansen 
854*59599516SKenneth E. Jansen // 	/* derivate the face blending functions */
855*59599516SKenneth E. Jansen // 	FaceBlendDrv[0]= 0.5*par[1]*par[2]*(1.0-par[3]);
856*59599516SKenneth E. Jansen // 	FaceBlendDrv[1]= 0.5*par[0]*par[2]*(1.0-par[3]);
857*59599516SKenneth E. Jansen // 	FaceBlendDrv[2]= 0.5*par[0]*par[1]*(1.0-par[3]);
858*59599516SKenneth E. Jansen // 	FaceBlendDrv[3]=-0.5*par[0]*par[1]*par[2];
859*59599516SKenneth E. Jansen //       }
860*59599516SKenneth E. Jansen //       else{
861*59599516SKenneth E. Jansen // 	FaceBlend = 0.5*par[0]*par[1]*par[2]*(1.0+par[3]);
862*59599516SKenneth E. Jansen 
863*59599516SKenneth E. Jansen // 	/* derivate the face blending functions */
864*59599516SKenneth E. Jansen // 	FaceBlendDrv[0]= 0.5*par[1]*par[2]*(1.0+par[3]);
865*59599516SKenneth E. Jansen // 	FaceBlendDrv[1]= 0.5*par[0]*par[2]*(1.0+par[3]);
866*59599516SKenneth E. Jansen // 	FaceBlendDrv[2]= 0.5*par[0]*par[1]*(1.0+par[3]);
867*59599516SKenneth E. Jansen // 	FaceBlendDrv[3]= 0.5*par[0]*par[1]*par[2];
868*59599516SKenneth E. Jansen //       }
869*59599516SKenneth E. Jansen 
870*59599516SKenneth E. Jansen //       /*calculate the mesh entity function for cubic triangular face */
871*59599516SKenneth E. Jansen //       FaceEnt = 1.0;
872*59599516SKenneth E. Jansen 
873*59599516SKenneth E. Jansen //       /*calculate the shape functions*/
874*59599516SKenneth E. Jansen //       N[nshp] = FaceBlend*FaceEnt;
875*59599516SKenneth E. Jansen //       dN[nshp][0]=FaceBlendDrv[0];
876*59599516SKenneth E. Jansen //       dN[nshp][1]=FaceBlendDrv[1];
877*59599516SKenneth E. Jansen //       dN[nshp][2]=FaceBlendDrv[2];
878*59599516SKenneth E. Jansen //       dN[nshp][3]=FaceBlendDrv[3];
879*59599516SKenneth E. Jansen 
880*59599516SKenneth E. Jansen //       nshp++;
881*59599516SKenneth E. Jansen //     }
882*59599516SKenneth E. Jansen //   }
883*59599516SKenneth E. Jansen 
884*59599516SKenneth E. Jansen     return nshp;
885*59599516SKenneth E. Jansen }
886*59599516SKenneth E. Jansen 
887*59599516SKenneth E. Jansen /* Pyramid hierarchic shape function up to order 3*/
888*59599516SKenneth E. Jansen int PyrShapeAndDrv(int p,double par[3],double N[],double dN[][3])
889*59599516SKenneth E. Jansen {
890*59599516SKenneth E. Jansen     int i;
891*59599516SKenneth E. Jansen     double EdgeBlend, EdgeBlendDrv[3];
892*59599516SKenneth E. Jansen     double EdgeEntity[2], EdgeEntityDrv[2][3];
893*59599516SKenneth E. Jansen     double FaceBlend, FaceBlendDrv[3];
894*59599516SKenneth E. Jansen     double FaceEntity[2], FaceEntityDrv[2][3];
895*59599516SKenneth E. Jansen 
896*59599516SKenneth E. Jansen     //dEBdxi,dEBdeta,dEBdzeta;
897*59599516SKenneth E. Jansen     //  double arg[3];
898*59599516SKenneth E. Jansen     // int arg2[3];
899*59599516SKenneth E. Jansen     // double* entfn;
900*59599516SKenneth E. Jansen     //  double** endrv;
901*59599516SKenneth E. Jansen     // int num_e_modes, num_f_modes, num_r_modes;
902*59599516SKenneth E. Jansen 
903*59599516SKenneth E. Jansen     int** edge[8];  // total 8 edges
904*59599516SKenneth E. Jansen     int n[5][3]={{-1,-1, -1},{1,-1,-1},{1,1,-1},{-1,1, -1}, {0, 0, 1}}; // vertex coordinates
905*59599516SKenneth E. Jansen 
906*59599516SKenneth E. Jansen //    int n[5][3]={{-1,-1, 1},{-1,-1,-1},{1,-1,-1},{1,-1, 1}, {0, 1, 0}}; // vertex coordinates
907*59599516SKenneth E. Jansen 
908*59599516SKenneth E. Jansen     //  int face[5][4] = {{0,3,2,1},{0,1,4, -1},{1,2,4, -1},{2,3,4,-1},{3,0,4,-1}}; // face vertices
909*59599516SKenneth E. Jansen     //  int face[5][4] = {{0,1,2,3},{1,0,4, -1},{0,3,4, -1},{3,2,4,-1},{2,1,4,-1}}; // face vertices
910*59599516SKenneth E. Jansen     //  int vrt[4];
911*59599516SKenneth E. Jansen     //  int normal;
912*59599516SKenneth E. Jansen     int sign[3];
913*59599516SKenneth E. Jansen 
914*59599516SKenneth E. Jansen     if(p<1) return nshp;
915*59599516SKenneth E. Jansen 
916*59599516SKenneth E. Jansen 
917*59599516SKenneth E. Jansen     // when p=1, there are only nodal shapefunctions
918*59599516SKenneth E. Jansen     double zeta = par[2];
919*59599516SKenneth E. Jansen     double xi = par[0];
920*59599516SKenneth E. Jansen     double eta = par[1];
921*59599516SKenneth E. Jansen 
922*59599516SKenneth E. Jansen     //  double xim=1-xi;
923*59599516SKenneth E. Jansen     //  double etam=1-eta;
924*59599516SKenneth E. Jansen     double zetam=1-zeta;
925*59599516SKenneth E. Jansen 
926*59599516SKenneth E. Jansen     double zetamap=2.0/zetam;
927*59599516SKenneth E. Jansen 
928*59599516SKenneth E. Jansen     //  double xip=1+xi;
929*59599516SKenneth E. Jansen     // double etap=1+eta;
930*59599516SKenneth E. Jansen     double zetap=1+zeta;
931*59599516SKenneth E. Jansen 
932*59599516SKenneth E. Jansen     double xipp=1+xi*zetamap;
933*59599516SKenneth E. Jansen     double etapp=1+eta*zetamap;
934*59599516SKenneth E. Jansen 
935*59599516SKenneth E. Jansen     double ximp=1-xi*zetamap;
936*59599516SKenneth E. Jansen     double etamp=1-eta*zetamap;
937*59599516SKenneth E. Jansen 
938*59599516SKenneth E. Jansen     // Shape functions for the Nodes.
939*59599516SKenneth E. Jansen     // There are five nodal shapefunctions.
940*59599516SKenneth E. Jansen 
941*59599516SKenneth E. Jansen     N[0]= 0.125* ximp * etamp * zetam ;
942*59599516SKenneth E. Jansen     N[1]= 0.125* xipp * etamp * zetam ;
943*59599516SKenneth E. Jansen     N[2]= 0.125* xipp * etapp * zetam ;
944*59599516SKenneth E. Jansen     N[3]= 0.125* ximp * etapp * zetam ;
945*59599516SKenneth E. Jansen     N[4]= 0.5* zetap;
946*59599516SKenneth E. Jansen 
947*59599516SKenneth E. Jansen     // Derivative of the above Shape Functions
948*59599516SKenneth E. Jansen     dN[0][0] =-0.25 *  etamp;
949*59599516SKenneth E. Jansen     dN[0][1] =-0.25 *  ximp;
950*59599516SKenneth E. Jansen     dN[0][2] = 0.125 * (xi*eta*zetamap*zetamap-1);
951*59599516SKenneth E. Jansen 
952*59599516SKenneth E. Jansen     dN[1][0] = 0.25 * etamp;
953*59599516SKenneth E. Jansen     dN[1][1] =-0.25 * xipp;
954*59599516SKenneth E. Jansen     dN[1][2] =-0.125 * (xi*eta*zetamap*zetamap+1);
955*59599516SKenneth E. Jansen 
956*59599516SKenneth E. Jansen     dN[2][0] = 0.25 * etapp;
957*59599516SKenneth E. Jansen     dN[2][1] = 0.25 * xipp;
958*59599516SKenneth E. Jansen     dN[2][2] = dN[0][2];
959*59599516SKenneth E. Jansen 
960*59599516SKenneth E. Jansen     dN[3][0] =-0.25 * etapp;
961*59599516SKenneth E. Jansen     dN[3][1] = 0.25 * ximp;
962*59599516SKenneth E. Jansen     dN[3][2] = dN[1][2];
963*59599516SKenneth E. Jansen 
964*59599516SKenneth E. Jansen     dN[4][0] = 0;
965*59599516SKenneth E. Jansen     dN[4][1] = 0;
966*59599516SKenneth E. Jansen     dN[4][2] = 0.5;
967*59599516SKenneth E. Jansen 
968*59599516SKenneth E. Jansen     nshp = 5;
969*59599516SKenneth E. Jansen 
970*59599516SKenneth E. Jansen     if( p>1) {
971*59599516SKenneth E. Jansen 
972*59599516SKenneth E. Jansen         // Generate Shape Functions for Edges.
973*59599516SKenneth E. Jansen         // For a polynomial Order of p there are 8*(p-1)
974*59599516SKenneth E. Jansen         // edge modes for the entire element.
975*59599516SKenneth E. Jansen 
976*59599516SKenneth E. Jansen         // allocate spaces for edge order description
977*59599516SKenneth E. Jansen         for(i=0; i<8; i++)
978*59599516SKenneth E. Jansen             edge[i]=new int * [2];
979*59599516SKenneth E. Jansen 
980*59599516SKenneth E. Jansen         // for the edges on the quadrilateral face
981*59599516SKenneth E. Jansen         edge[0][0]=n[0]; edge[0][1]=n[1];
982*59599516SKenneth E. Jansen         edge[1][0]=n[1]; edge[1][1]=n[2];
983*59599516SKenneth E. Jansen         edge[2][0]=n[2]; edge[2][1]=n[3];
984*59599516SKenneth E. Jansen         edge[3][0]=n[3]; edge[3][1]=n[0];
985*59599516SKenneth E. Jansen 
986*59599516SKenneth E. Jansen         // for other edges on triangular faces
987*59599516SKenneth E. Jansen         edge[4][0]=n[0]; edge[4][1]=n[4];
988*59599516SKenneth E. Jansen         edge[5][0]=n[1]; edge[5][1]=n[4];
989*59599516SKenneth E. Jansen         edge[6][0]=n[2]; edge[6][1]=n[4];
990*59599516SKenneth E. Jansen         edge[7][0]=n[3]; edge[7][1]=n[4];
991*59599516SKenneth E. Jansen 
992*59599516SKenneth E. Jansen 
993*59599516SKenneth E. Jansen         // calculate the edge blending functions and their derivatives
994*59599516SKenneth E. Jansen         for(i=0; i < 8; i++) {
995*59599516SKenneth E. Jansen             int k, m, along, j;
996*59599516SKenneth E. Jansen             switch (i) {
997*59599516SKenneth E. Jansen                 // first four are on quadrilateral face
998*59599516SKenneth E. Jansen 
999*59599516SKenneth E. Jansen                 // P.N anil fix this
1000*59599516SKenneth E. Jansen             case 0:
1001*59599516SKenneth E. Jansen                 k =1;	m =2;   sign[m-1] =-1;  along =k;
1002*59599516SKenneth E. Jansen                 break;
1003*59599516SKenneth E. Jansen             case 1:
1004*59599516SKenneth E. Jansen                 k =2;   m =1;   sign[m-1] =1;   along =k;
1005*59599516SKenneth E. Jansen                 break;
1006*59599516SKenneth E. Jansen             case 2:
1007*59599516SKenneth E. Jansen                 k =1;   m =2;   sign[m-1] =1;   along =k;
1008*59599516SKenneth E. Jansen                 break;
1009*59599516SKenneth E. Jansen             case 3:
1010*59599516SKenneth E. Jansen                 k =2;   m =1;   sign[m-1] =-1;  along =k;
1011*59599516SKenneth E. Jansen                 break;
1012*59599516SKenneth E. Jansen                 // next four are on triangular faces
1013*59599516SKenneth E. Jansen             case 4:
1014*59599516SKenneth E. Jansen                 k =1;   m =2;   sign[k-1] =-1;    sign[m-1] =-1;  along =3;
1015*59599516SKenneth E. Jansen                 break;
1016*59599516SKenneth E. Jansen             case 5:
1017*59599516SKenneth E. Jansen                 k =2;   m =1;   sign[k-1] =-1;    sign[m-1] =1; along =3;
1018*59599516SKenneth E. Jansen                 break;
1019*59599516SKenneth E. Jansen             case 6:
1020*59599516SKenneth E. Jansen                 k =1;   m =2;   sign[k-1] =1;     sign[m-1] =1; along =3;
1021*59599516SKenneth E. Jansen                 break;
1022*59599516SKenneth E. Jansen             case 7:
1023*59599516SKenneth E. Jansen                 k =2;   m =1;   sign[k-1] =1;     sign[m-1] =-1; along =3;
1024*59599516SKenneth E. Jansen             }
1025*59599516SKenneth E. Jansen             EdgeBlend =Pyr_eB (par, sign, k, m, along);
1026*59599516SKenneth E. Jansen             for (j=0; j<3; j++)
1027*59599516SKenneth E. Jansen                 EdgeBlendDrv[j] =dPeBdxi(par, sign, k, m, along, j);
1028*59599516SKenneth E. Jansen 
1029*59599516SKenneth E. Jansen             // calculate the mesh entity shape function
1030*59599516SKenneth E. Jansen 
1031*59599516SKenneth E. Jansen             // calculate the edge entity function for p=2
1032*59599516SKenneth E. Jansen             EdgeEntity[0] =1;
1033*59599516SKenneth E. Jansen             EdgeEntityDrv[0][0] =EdgeEntityDrv[0][1] =EdgeEntityDrv[0][2] =0;
1034*59599516SKenneth E. Jansen 
1035*59599516SKenneth E. Jansen             if (p>2) {
1036*59599516SKenneth E. Jansen                 // calculate the edge entity function for p=3
1037*59599516SKenneth E. Jansen                 if (i<4) {
1038*59599516SKenneth E. Jansen                     // for the edges of the quadrilateral face with parameterization I
1039*59599516SKenneth E. Jansen                     // equation (33)
1040*59599516SKenneth E. Jansen                     EdgeEntity[1] =par[k-1];
1041*59599516SKenneth E. Jansen                     for (j=0; j<3; j++)
1042*59599516SKenneth E. Jansen                         EdgeEntityDrv[1][j] =(int)(k-1==j);
1043*59599516SKenneth E. Jansen                 } else {
1044*59599516SKenneth E. Jansen                     // for the edges of the triangular faces with parameterization II
1045*59599516SKenneth E. Jansen                     // First of all, we need to represent these edges use xi's
1046*59599516SKenneth E. Jansen                     // In our definition, u[0] points to the quadrilateral base
1047*59599516SKenneth E. Jansen                     //                    u[1] points to the top
1048*59599516SKenneth E. Jansen                     // then, we get	u[0] =(1-xi[1])/2;	  u[1] =(1+xi[1])/2;
1049*59599516SKenneth E. Jansen                     //                    EdgeEntity[1] =u[1]-u[0] =xi[1];
1050*59599516SKenneth E. Jansen                     EdgeEntity[1] =par[1];
1051*59599516SKenneth E. Jansen                     EdgeEntityDrv[1][1] =1; EdgeEntityDrv[1][0]=EdgeEntityDrv[1][2]=0;
1052*59599516SKenneth E. Jansen                 }
1053*59599516SKenneth E. Jansen             }
1054*59599516SKenneth E. Jansen 
1055*59599516SKenneth E. Jansen             for(j=0; j < p-1; j++){
1056*59599516SKenneth E. Jansen 
1057*59599516SKenneth E. Jansen                 N[nshp]= EdgeBlend * EdgeEntity[j];
1058*59599516SKenneth E. Jansen                 dN[nshp][0]= EdgeBlend * EdgeEntityDrv[j][0] + EdgeBlendDrv[0] * EdgeEntity[j];
1059*59599516SKenneth E. Jansen                 dN[nshp][1]= EdgeBlend * EdgeEntityDrv[j][1] + EdgeBlendDrv[1] * EdgeEntity[j];
1060*59599516SKenneth E. Jansen                 dN[nshp][2]= EdgeBlend * EdgeEntityDrv[j][2] + EdgeBlendDrv[2] * EdgeEntity[j];
1061*59599516SKenneth E. Jansen                 nshp++;
1062*59599516SKenneth E. Jansen             }
1063*59599516SKenneth E. Jansen         }
1064*59599516SKenneth E. Jansen 
1065*59599516SKenneth E. Jansen         // calculate the shape function for triangular faces
1066*59599516SKenneth E. Jansen         if (p==3) {
1067*59599516SKenneth E. Jansen             for (i=1; i<5; i++) {
1068*59599516SKenneth E. Jansen                 // calculate the face blending functions
1069*59599516SKenneth E. Jansen                 int k, m, j;
1070*59599516SKenneth E. Jansen                 switch (i) {
1071*59599516SKenneth E. Jansen                 case 1:
1072*59599516SKenneth E. Jansen                     k =1;   m =3;   sign[k-1] =-1;
1073*59599516SKenneth E. Jansen                     break;
1074*59599516SKenneth E. Jansen                 case 2:
1075*59599516SKenneth E. Jansen                     k =3;   m =1;   sign[k-1] =-1;
1076*59599516SKenneth E. Jansen                     break;
1077*59599516SKenneth E. Jansen                 case 3:
1078*59599516SKenneth E. Jansen                     k =1;   m =3;   sign[k-1] =1;
1079*59599516SKenneth E. Jansen                     break;
1080*59599516SKenneth E. Jansen                 case 4:
1081*59599516SKenneth E. Jansen                     k =3;   m =1;   sign[k-1] =1;
1082*59599516SKenneth E. Jansen                     break;
1083*59599516SKenneth E. Jansen                 }
1084*59599516SKenneth E. Jansen                 FaceBlend =Pyr_fB (par, sign, k, m, 3);
1085*59599516SKenneth E. Jansen                 for (j=0; j<3; j++)
1086*59599516SKenneth E. Jansen                     FaceBlendDrv[j] =dPfBdxi(par, sign, k, m, 3, j);
1087*59599516SKenneth E. Jansen 
1088*59599516SKenneth E. Jansen                 // for p=3
1089*59599516SKenneth E. Jansen                 FaceEntity[0] =1;
1090*59599516SKenneth E. Jansen                 FaceEntityDrv[0][0] =FaceEntityDrv[0][1] =FaceEntityDrv[0][2] =0;
1091*59599516SKenneth E. Jansen 
1092*59599516SKenneth E. Jansen                 for(j=0; j < p-2; j++){
1093*59599516SKenneth E. Jansen 
1094*59599516SKenneth E. Jansen                     N[nshp]= FaceBlend * EdgeEntity[j];
1095*59599516SKenneth E. Jansen                     dN[nshp][0]= FaceBlend * FaceEntityDrv[j][0] + FaceBlendDrv[0] * FaceEntity[j];
1096*59599516SKenneth E. Jansen                     dN[nshp][1]= FaceBlend * FaceEntityDrv[j][1] + FaceBlendDrv[1] * FaceEntity[j];
1097*59599516SKenneth E. Jansen                     dN[nshp][2]= FaceBlend * FaceEntityDrv[j][2] + FaceBlendDrv[2] * FaceEntity[j];
1098*59599516SKenneth E. Jansen                     nshp++;
1099*59599516SKenneth E. Jansen                 }
1100*59599516SKenneth E. Jansen             }
1101*59599516SKenneth E. Jansen         }
1102*59599516SKenneth E. Jansen     }
1103*59599516SKenneth E. Jansen 
1104*59599516SKenneth E. Jansen     return nshp;
1105*59599516SKenneth E. Jansen }
1106*59599516SKenneth E. Jansen 
1107*59599516SKenneth E. Jansen 
1108*59599516SKenneth E. Jansen 
1109*59599516SKenneth E. Jansen 
1110