xref: /phasta/phSolver/common/newshape.cc (revision 8746ab438bbda91291f8cdd62b94f8385f2d26f1)
159599516SKenneth E. Jansen /* This file contains the routines which generate hierarchic shape
259599516SKenneth E. Jansen    functions for a any (right now hexahedral) element, using the
359599516SKenneth E. Jansen    concept of Blend functions and entity level shapefunctions.
459599516SKenneth E. Jansen 
559599516SKenneth E. Jansen    The shapefunction for a mesh entity Mj^dj is defined as
659599516SKenneth E. Jansen 
759599516SKenneth E. Jansen               N = psi(Mj^di,Me^de)*phi(Mj^dj)
859599516SKenneth E. Jansen 
959599516SKenneth E. Jansen    where psi(...) is the blending function and phi(..) is the entity
1059599516SKenneth E. Jansen    level function which takes care of the polynomial order .
1159599516SKenneth E. Jansen */
1259599516SKenneth E. Jansen 
1359599516SKenneth E. Jansen 
1459599516SKenneth E. Jansen 
1559599516SKenneth E. Jansen #include <math.h>
1659599516SKenneth E. Jansen 
1759599516SKenneth E. Jansen #include "topo_shapedefs.h"
1859599516SKenneth E. Jansen 
1959599516SKenneth E. Jansen int nshp =0;
LP(int j,double x)2059599516SKenneth E. Jansen double LP(int j, double x)
2159599516SKenneth E. Jansen {
2259599516SKenneth E. Jansen     /* Bonnet's recursion formula for Legendre Polynomials */
2359599516SKenneth E. Jansen     if( j==0) return 1;
2459599516SKenneth E. Jansen     if( j==1) return x;
2559599516SKenneth E. Jansen 
2659599516SKenneth E. Jansen     double ply;
2759599516SKenneth E. Jansen     ply = ((2*j-1)*x*LP(j-1,x)-(j-1)*LP(j-2,x))/j;
2859599516SKenneth E. Jansen     return ply;
2959599516SKenneth E. Jansen 
3059599516SKenneth E. Jansen }
3159599516SKenneth E. Jansen /***************************************************************************/
LPdrv(int j,double x)3259599516SKenneth E. Jansen double LPdrv(int j, double x)
3359599516SKenneth E. Jansen {
3459599516SKenneth E. Jansen     if(j == 0) return 0;
3559599516SKenneth E. Jansen     if(j == 1) return 1;
3659599516SKenneth E. Jansen 
3759599516SKenneth E. Jansen     double plydrv;
3859599516SKenneth E. Jansen     plydrv = (2*j -1)*LP(j-1,x)+LPdrv(j-2,x);
3959599516SKenneth E. Jansen     return plydrv;
4059599516SKenneth E. Jansen }
4159599516SKenneth E. Jansen 
4259599516SKenneth E. Jansen /***************************************************************************/
phi(int p,double x)4359599516SKenneth E. Jansen double phi(int p, double x)
4459599516SKenneth E. Jansen {
4559599516SKenneth E. Jansen     double PHI;
4659599516SKenneth E. Jansen 
4759599516SKenneth E. Jansen     PHI = LP(p,x)-LP(p-2,x);
4859599516SKenneth E. Jansen     PHI = PHI / (2*p-1);
4959599516SKenneth E. Jansen     /*  PHI = PHI/sqrt(2*(2*p-1)); */
5059599516SKenneth E. Jansen     return PHI;
5159599516SKenneth E. Jansen }
5259599516SKenneth E. Jansen 
phiDrv(int p,double x)5359599516SKenneth E. Jansen double phiDrv(int p, double x)
5459599516SKenneth E. Jansen {
5559599516SKenneth E. Jansen     double Phidrv;
5659599516SKenneth E. Jansen     Phidrv = LP(p-1,x);
5759599516SKenneth E. Jansen     /*  Phidrv = sqrt(0.5*(2*p-1))*LP(p-1,x); */
5859599516SKenneth E. Jansen     return Phidrv;
5959599516SKenneth E. Jansen }
6059599516SKenneth E. Jansen 
6159599516SKenneth E. Jansen 
6259599516SKenneth E. Jansen /*******************************************************************/
6359599516SKenneth E. Jansen /* Construction of Blending functions */
6459599516SKenneth E. Jansen 
6559599516SKenneth E. Jansen /* Line element edge blend and its derivatives */
6659599516SKenneth E. Jansen 
Line_eB(double xi1)6759599516SKenneth E. Jansen double Line_eB(double xi1)
6859599516SKenneth E. Jansen {
6959599516SKenneth E. Jansen     /* edge parameterization I defined in Saikat's thesis */
7059599516SKenneth E. Jansen     return 0.5*(xi1*xi1 - 1);
7159599516SKenneth E. Jansen }
7259599516SKenneth E. Jansen 
dLEBdxi1(double xi1)7359599516SKenneth E. Jansen double dLEBdxi1(double xi1){  return xi1; }
dLEBdxi2(double xi1)7459599516SKenneth E. Jansen double dLEBdxi2(double xi1){return 0;}
dLEBdxi3(double xi1)7559599516SKenneth E. Jansen double dLEBdxi3(double xi1){return 0;}
7659599516SKenneth E. Jansen 
7759599516SKenneth E. Jansen /* Quadrilateral edge blend and its derivatives */
7859599516SKenneth E. Jansen 
7959599516SKenneth E. Jansen 
Quad_eB(double xi1,double xi2,int sign)8059599516SKenneth E. Jansen double Quad_eB(double xi1, double xi2, int sign)
8159599516SKenneth E. Jansen {
8259599516SKenneth E. Jansen     /* Quad element edge blend, for edge along xi1 */
8359599516SKenneth E. Jansen     return 0.25*(xi1*xi1 - 1)*(1+sign*xi2);
8459599516SKenneth E. Jansen }
8559599516SKenneth E. Jansen 
dQEBdxi1(double xi1,double xi2,int sign)8659599516SKenneth E. Jansen double dQEBdxi1(double xi1, double xi2, int sign)
8759599516SKenneth E. Jansen { return 0.5*xi1*(1+sign*xi2); }
8859599516SKenneth E. Jansen 
dQEBdxi2(double xi1,double xi2,int sign)8959599516SKenneth E. Jansen double dQEBdxi2(double xi1, double xi2, int sign)
9059599516SKenneth E. Jansen { return 0.25*sign*(xi1*xi1 - 1); }
9159599516SKenneth E. Jansen 
dQEBdxi3(double xi1,double xi2,int sign)9259599516SKenneth E. Jansen double dQEBdxi3(double xi1, double xi2, int sign)
9359599516SKenneth E. Jansen { return 0; }
9459599516SKenneth E. Jansen 
9559599516SKenneth E. Jansen 
9659599516SKenneth E. Jansen /* Quadrilateral face blend and its derivatives */
9759599516SKenneth E. Jansen 
Quad_fB(double xi1,double xi2)9859599516SKenneth E. Jansen double Quad_fB(double xi1, double xi2)
9959599516SKenneth E. Jansen {
10059599516SKenneth E. Jansen     return 0.25*(xi1*xi1 - 1)*(xi2*xi2 - 1);
10159599516SKenneth E. Jansen }
10259599516SKenneth E. Jansen 
dQFBdxi1(double xi1,double xi2)10359599516SKenneth E. Jansen double dQFBdxi1(double xi1, double xi2)
10459599516SKenneth E. Jansen { return 0.5*xi1*(xi2*xi2 - 1); }
10559599516SKenneth E. Jansen 
dQFBdxi2(double xi1,double xi2)10659599516SKenneth E. Jansen double dQFBdxi2(double xi1, double xi2)
10759599516SKenneth E. Jansen { return 0.5*xi2*(xi1*xi1 - 1); }
10859599516SKenneth E. Jansen 
dQFBdxi3(double xi1,double xi2)10959599516SKenneth E. Jansen double dQFBdxi3(double xi1, double xi2)
11059599516SKenneth E. Jansen { return 0.0 ; }
11159599516SKenneth E. Jansen 
11259599516SKenneth E. Jansen 
11359599516SKenneth E. Jansen /* The hexahedral element edge blend and its derivatives */
11459599516SKenneth E. Jansen 
Hex_eB(double xi[3],int sign2,int sign3)11559599516SKenneth E. Jansen double Hex_eB(double xi[3], int sign2, int sign3)
11659599516SKenneth E. Jansen {
11759599516SKenneth E. Jansen     /* For edge along xi1 */
11859599516SKenneth E. Jansen 
11959599516SKenneth E. Jansen     //  return 0.125*(xi[0]*xi[0] - 1)*(1+sign2*xi[1])*(1+sign3*xi[2]);
12059599516SKenneth E. Jansen     return 0.25*(1+sign2*xi[1])*(1+sign3*xi[2]);
12159599516SKenneth E. Jansen }
12259599516SKenneth E. Jansen 
dHEBdxi1(double xi[3],int sign2,int sign3)12359599516SKenneth E. Jansen double dHEBdxi1(double xi[3], int sign2, int sign3)
12459599516SKenneth E. Jansen {
12559599516SKenneth E. Jansen     /* For edge along xi1 */
12659599516SKenneth E. Jansen 
12759599516SKenneth E. Jansen     //  return 0.25*xi[0]*(1+sign2*xi[1])*(1+sign3*xi[2]);
12859599516SKenneth E. Jansen     return 0;
12959599516SKenneth E. Jansen }
13059599516SKenneth E. Jansen 
dHEBdxi2(double xi[3],int sign2,int sign3)13159599516SKenneth E. Jansen double dHEBdxi2(double xi[3], int sign2, int sign3)
13259599516SKenneth E. Jansen {
13359599516SKenneth E. Jansen 
13459599516SKenneth E. Jansen     /* For edge along xi1 */
13559599516SKenneth E. Jansen 
13659599516SKenneth E. Jansen     //  return 0.125*sign2*(xi[0]*xi[0] - 1)*(1+sign3*xi[2]);
13759599516SKenneth E. Jansen 
13859599516SKenneth E. Jansen     return 0.25*sign2*(1+sign3*xi[2]);
13959599516SKenneth E. Jansen }
14059599516SKenneth E. Jansen 
dHEBdxi3(double xi[3],int sign2,int sign3)14159599516SKenneth E. Jansen double dHEBdxi3(double xi[3], int sign2, int sign3)
14259599516SKenneth E. Jansen {
14359599516SKenneth E. Jansen     /* For edge along xi1 */
14459599516SKenneth E. Jansen 
14559599516SKenneth E. Jansen     return 0.25*sign3*(1+sign2*xi[1]);
14659599516SKenneth E. Jansen }
14759599516SKenneth E. Jansen 
14859599516SKenneth E. Jansen 
14959599516SKenneth E. Jansen /* The hexahedral face blend and its derivatives */
15059599516SKenneth E. Jansen 
Hex_fB(double xi[3],int sign3)15159599516SKenneth E. Jansen double Hex_fB(double xi[3], int  sign3)
15259599516SKenneth E. Jansen {
15359599516SKenneth E. Jansen     /* for face perpendicular to xi3 */
15459599516SKenneth E. Jansen 
15559599516SKenneth E. Jansen     return 0.5*(1+sign3*xi[2]);
15659599516SKenneth E. Jansen     //  return 0.125*(xi[0]*xi[0] - 1)*(xi[1]*xi[1] - 1)*(1+sign3*xi[2]);
15759599516SKenneth E. Jansen }
15859599516SKenneth E. Jansen 
dHFBdxi1(double xi[3],int sign3)15959599516SKenneth E. Jansen double dHFBdxi1(double xi[3], int sign3)
16059599516SKenneth E. Jansen     //{ return 0.25*xi[0]*(xi[1]*xi[1] - 1)*(1+sign3*xi[2]);}
16159599516SKenneth E. Jansen { return 0;}
16259599516SKenneth E. Jansen 
dHFBdxi2(double xi[3],int sign3)16359599516SKenneth E. Jansen double dHFBdxi2(double xi[3], int sign3)
16459599516SKenneth E. Jansen     //{ return 0.25*xi[1]*(xi[0]*xi[0] - 1)*(1+sign3*xi[2]);}
16559599516SKenneth E. Jansen { return 0; }
16659599516SKenneth E. Jansen 
dHFBdxi3(double xi[3],int sign3)16759599516SKenneth E. Jansen double dHFBdxi3(double xi[3], int sign3)
16859599516SKenneth E. Jansen     //{ return 0.125*(xi[0]*xi[0] - 1)*(xi[1]*xi[1] - 1)*sign3; }
16959599516SKenneth E. Jansen { return 0.5*sign3; }
17059599516SKenneth E. Jansen 
17159599516SKenneth E. Jansen 
17259599516SKenneth E. Jansen // The Construction of higher-order blending functions for edge and face of pyramid */
17359599516SKenneth E. Jansen 
17459599516SKenneth E. Jansen /* The pyramid element edge blend and its derivatives */
Pyr_eB(double xi[3],int sign[3],int k,int m,int along)17559599516SKenneth E. Jansen double Pyr_eB(double xi[3], int sign[3], int k, int m, int along)
17659599516SKenneth E. Jansen {
17759599516SKenneth E. Jansen     double psi;
17859599516SKenneth E. Jansen     double tmp0 =1/(1-xi[2]); // xi3->xi[2]
17959599516SKenneth E. Jansen 
18059599516SKenneth E. Jansen     k--; m--; along--;
18159599516SKenneth E. Jansen 
18259599516SKenneth E. Jansen     if (along==2) { // if actually along=3
18359599516SKenneth E. Jansen         // For edge along xi3, which bounds the triangular face
18459599516SKenneth E. Jansen         psi =0.125*(xi[2]*xi[2]-1)*(1+sign[k]*(2*xi[k]*tmp0))*(1+sign[m]*(2*xi[m]*tmp0));
18559599516SKenneth E. Jansen     } else {        // if actually along=k=1 or 2
18659599516SKenneth E. Jansen         // For edge along xik, k=1, 2, m=2, 1 which bounds the quadrilater face
18759599516SKenneth E. Jansen         double tmp1 =2*xi[k]*tmp0;
18859599516SKenneth E. Jansen         psi =0.125*(tmp1*tmp1-1)*(1+sign[m]*(2*xi[m]*tmp0))*(1-xi[2]);
18959599516SKenneth E. Jansen     }
19059599516SKenneth E. Jansen     return psi;
19159599516SKenneth E. Jansen }
19259599516SKenneth E. Jansen 
dPeBdxi(double xi[3],int sign[3],int k,int m,int along,int byWhich)19359599516SKenneth E. Jansen double dPeBdxi(double xi[3], int sign[3], int k, int m, int along, int byWhich)
19459599516SKenneth E. Jansen {
195*7a6b4026SCameron Smith     double dPsidxi = 0;
19659599516SKenneth E. Jansen     double tmp0 =1/(1-xi[2]); // xi3->xi[2]
19759599516SKenneth E. Jansen 
19859599516SKenneth E. Jansen     // byWhich was decreased by 1.  When it comes in as j it is 0 initially
19959599516SKenneth E. Jansen     // then it becomes -1, wrong.  Do not decrease byWhich.
20059599516SKenneth E. Jansen     k--; m--; along--;
20159599516SKenneth E. Jansen     if (along==2) {  // for edges along xi3
20259599516SKenneth E. Jansen         if (byWhich==k)
20359599516SKenneth E. Jansen             dPsidxi =-0.25*(1+xi[2])*sign[k]*(1+sign[m]*(2*xi[m]*tmp0));
20459599516SKenneth E. Jansen         else if (byWhich==m)
20559599516SKenneth E. Jansen             dPsidxi =-0.25*(1+xi[2])*sign[m]*(1+sign[k]*(2*xi[k]*tmp0));
20659599516SKenneth E. Jansen         else if (byWhich==2)        // actually byWhich =2
20759599516SKenneth E. Jansen             dPsidxi =0.25*(xi[2]*(1+sign[k]*2*xi[k]*tmp0)*(1+sign[m]*2*xi[m]*tmp0)-
20859599516SKenneth E. Jansen                            (1+xi[2])*tmp0*(sign[k]*xi[k]*(1+sign[m]*2*xi[m]*tmp0)+
20959599516SKenneth E. Jansen                                            sign[m]*xi[m]*(1+sign[k]*2*xi[k]*tmp0)));
21059599516SKenneth E. Jansen     } else {         // for edges along xik with k=1 or 2
21159599516SKenneth E. Jansen         double tmp1 =2*xi[k]*tmp0;
21259599516SKenneth E. Jansen         if (byWhich==k)
21359599516SKenneth E. Jansen             dPsidxi =0.5*tmp1*(1+sign[m]*(2*xi[m]*tmp0));
21459599516SKenneth E. Jansen         else if (byWhich==m)
21559599516SKenneth E. Jansen             dPsidxi =0.25*(tmp1*tmp1-1)*sign[m];
21659599516SKenneth E. Jansen         else if (byWhich==2)       // actually byWhich =2
21759599516SKenneth E. Jansen             dPsidxi =0.25*(tmp1*tmp1)*(1+sign[m]*(2*xi[m]*tmp0))-0.125*(tmp1*tmp1-1);
21859599516SKenneth E. Jansen     }
21959599516SKenneth E. Jansen     return dPsidxi;
22059599516SKenneth E. Jansen }
22159599516SKenneth E. Jansen 
22259599516SKenneth E. Jansen /* The pyramid element face blend and its derivatives */
22359599516SKenneth E. Jansen /* Needs to be corrected as we did for the edge blend */
Pyr_fB(double xi[3],int sign[3],int k,int m,int faceType)22459599516SKenneth E. Jansen double Pyr_fB (double xi[3], int sign[3], int k, int m, int faceType)
22559599516SKenneth E. Jansen {
22659599516SKenneth E. Jansen     double tmp0 =1/(1-xi[1]); // xi2->xi[1]
22759599516SKenneth E. Jansen     double psi;
22859599516SKenneth E. Jansen 
22959599516SKenneth E. Jansen     if (faceType==4) {
23059599516SKenneth E. Jansen         // for the quadrilater face
23159599516SKenneth E. Jansen         double tmp1 =2*xi[0]*tmp0;
23259599516SKenneth E. Jansen         double tmp2 =2*xi[2]*tmp0;
23359599516SKenneth E. Jansen 
23459599516SKenneth E. Jansen         psi =0.125*(1-tmp1*tmp1)*(1-tmp2*tmp2)*(1-xi[1]);
23559599516SKenneth E. Jansen     } else {
23659599516SKenneth E. Jansen         // for the triangular faces with k=1, 3 and m=3, 1
23759599516SKenneth E. Jansen         k--; m--;
23859599516SKenneth E. Jansen         double tmp1 =2*xi[m]*tmp0;
23959599516SKenneth E. Jansen 
24059599516SKenneth E. Jansen         psi =0.125*(1+sign[k]*2*xi[k]*tmp0)*(1-tmp1*tmp1)*(1-xi[1]*xi[1]);
24159599516SKenneth E. Jansen     }
24259599516SKenneth E. Jansen     return psi;
24359599516SKenneth E. Jansen }
24459599516SKenneth E. Jansen 
dPfBdxi(double xi[3],int sign[3],int k,int m,int faceType,int byWhich)24559599516SKenneth E. Jansen double dPfBdxi(double xi[3], int sign[3], int k, int m, int faceType, int byWhich)
24659599516SKenneth E. Jansen {
247*7a6b4026SCameron Smith     double dPsidxi = 0;
24859599516SKenneth E. Jansen     double tmp0 =1/(1-xi[2]); // xi3->xi[2]
24959599516SKenneth E. Jansen 
25059599516SKenneth E. Jansen     if (faceType==4) {
25159599516SKenneth E. Jansen         // for the quadrilater face
25259599516SKenneth E. Jansen         double tmp1 =2*xi[0]*tmp0;
25359599516SKenneth E. Jansen         double tmp2 =2*xi[2]*tmp0;
25459599516SKenneth E. Jansen 
25559599516SKenneth E. Jansen         switch (byWhich) {
25659599516SKenneth E. Jansen         case 1:
25759599516SKenneth E. Jansen             dPsidxi =-0.5*tmp1*(1-tmp2*tmp2);
25859599516SKenneth E. Jansen             break;
25959599516SKenneth E. Jansen         case 2:
26059599516SKenneth E. Jansen             dPsidxi = -0.125* (1+tmp1*tmp1+tmp2*tmp2-3*tmp1*tmp1*tmp2*tmp2);
26159599516SKenneth E. Jansen             break;
26259599516SKenneth E. Jansen         case 3:
26359599516SKenneth E. Jansen             dPsidxi =-0.5*(1-tmp1*tmp1)*tmp2;
26459599516SKenneth E. Jansen             break;
26559599516SKenneth E. Jansen         }
26659599516SKenneth E. Jansen     } else {         // for the triangular face with k=1,3 and m=3,1
26759599516SKenneth E. Jansen         k--; m--; byWhich--;
26859599516SKenneth E. Jansen         if (byWhich==k) {
26959599516SKenneth E. Jansen             double tmp1 =2*xi[m]*tmp0;
27059599516SKenneth E. Jansen             dPsidxi =0.25*sign[k]*(1-tmp1*tmp1)*(1+xi[1]);
27159599516SKenneth E. Jansen         }
27259599516SKenneth E. Jansen         else if (byWhich==m)
27359599516SKenneth E. Jansen             dPsidxi =-(1+sign[k]*2*xi[k]*tmp0)*(xi[m]*tmp0)*(1+xi[1]);
27459599516SKenneth E. Jansen         else if (byWhich==1) {      // actually byWhich =2
27559599516SKenneth E. Jansen             double tmp1 =xi[k]*tmp0;
27659599516SKenneth E. Jansen             double tmp2 =xi[m]*tmp0;
27759599516SKenneth E. Jansen             dPsidxi =(1+xi[1])*(0.25*sign[k]*tmp1*(1-4*tmp2*tmp2)-
27859599516SKenneth E. Jansen                                 (1+2*sign[k]*tmp1)*tmp2*tmp2)-
27959599516SKenneth E. Jansen                 0.25*(1+2*sign[k]*tmp1)*(1-4*tmp2*tmp2)*xi[1];
28059599516SKenneth E. Jansen         }
28159599516SKenneth E. Jansen     }
28259599516SKenneth E. Jansen     return dPsidxi;
28359599516SKenneth E. Jansen }
28459599516SKenneth E. Jansen 
28559599516SKenneth E. Jansen 
28659599516SKenneth E. Jansen /* Add further Blending functions and their derivatives before this line */
28759599516SKenneth E. Jansen /*******************************************************************/
28859599516SKenneth E. Jansen 
28959599516SKenneth E. Jansen /* Entity level functions  phi(....) */
29059599516SKenneth E. Jansen 
29159599516SKenneth E. Jansen 
mesh_edge(double xi1,int gOrd[3],int p,double * entfn,double ** edrv)29259599516SKenneth E. Jansen int mesh_edge(double xi1, int gOrd[3], int p,double* entfn,double** edrv)
29359599516SKenneth E. Jansen {
29459599516SKenneth E. Jansen     int nem = p-1;
29559599516SKenneth E. Jansen //    double leb = Line_eB(xi1);
29659599516SKenneth E. Jansen //    double dlebdxi1 = dLEBdxi1(xi1);
29759599516SKenneth E. Jansen 
29859599516SKenneth E. Jansen     if(nem > 0){
29959599516SKenneth E. Jansen 
30059599516SKenneth E. Jansen         //      entfn = new double [nem];
30159599516SKenneth E. Jansen         //      edrv = new double* [nem];
30259599516SKenneth E. Jansen 
30359599516SKenneth E. Jansen         for(int i =0; i< nem; i++) {
30459599516SKenneth E. Jansen 
30559599516SKenneth E. Jansen             // edrv[i] = new double [3];
30659599516SKenneth E. Jansen 
30759599516SKenneth E. Jansen //        entfn[i] = phi(i+2, xi1)/leb;
30859599516SKenneth E. Jansen //        edrv[i][gOrd[0]] = (leb*phiDrv(i+2,xi1)-phi(i+2,xi1)*dlebdxi1)/leb*leb;
30959599516SKenneth E. Jansen //        edrv[i][gOrd[1]] = 0.0;
31059599516SKenneth E. Jansen //        edrv[i][gOrd[2]] = 0.0;
31159599516SKenneth E. Jansen 
31259599516SKenneth E. Jansen             entfn[i] = phi(i+2, xi1);
31359599516SKenneth E. Jansen             edrv[i][gOrd[0]] = phiDrv(i+2,xi1);
31459599516SKenneth E. Jansen             edrv[i][gOrd[1]] = 0.0;
31559599516SKenneth E. Jansen             edrv[i][gOrd[2]] = 0.0;
31659599516SKenneth E. Jansen 
31759599516SKenneth E. Jansen         }
31859599516SKenneth E. Jansen     }
31959599516SKenneth E. Jansen 
32059599516SKenneth E. Jansen     return nem;
32159599516SKenneth E. Jansen }
32259599516SKenneth E. Jansen 
quad_face(double xi[3],int gOrd[3],int p,double * entfn,double ** edrv)32359599516SKenneth E. Jansen int quad_face(double xi[3], int gOrd[3], int p, double* entfn, double** edrv)
32459599516SKenneth E. Jansen {
32559599516SKenneth E. Jansen     int nfm;
32659599516SKenneth E. Jansen     int a1, a2;
32759599516SKenneth E. Jansen     int mc=0; /* mode counter*/
32859599516SKenneth E. Jansen //    double temp1, temp2;
32959599516SKenneth E. Jansen 
33059599516SKenneth E. Jansen     double xi1 = xi[0];
33159599516SKenneth E. Jansen     double xi2 = xi[1];
33259599516SKenneth E. Jansen 
33359599516SKenneth E. Jansen //    double qfb = Quad_fB(xi1,xi2);
33459599516SKenneth E. Jansen //    double dqfbdxi1 = dQFBdxi1(xi1,xi2);
33559599516SKenneth E. Jansen //    double dqfbdxi2 = dQFBdxi2(xi1,xi2);
33659599516SKenneth E. Jansen 
33759599516SKenneth E. Jansen     if(p > 3){
33859599516SKenneth E. Jansen 
33959599516SKenneth E. Jansen         nfm = (p-2)*(p-3)/2;
34059599516SKenneth E. Jansen         //      entfn = new double [nfm];
34159599516SKenneth E. Jansen         //      edrv = new double* [nfm];
34259599516SKenneth E. Jansen         //      for(int i=0; i< nfm; i++){
34359599516SKenneth E. Jansen         //        edrv[i]=new double [3];
34459599516SKenneth E. Jansen         //      }
34559599516SKenneth E. Jansen 
34659599516SKenneth E. Jansen         for(int ip =3; ip <p+1; ip++){     /* for each p */
34759599516SKenneth E. Jansen 
34859599516SKenneth E. Jansen             for(a1 = 2; a1 < ip-1; a1++){    /* a1,a2 = 2....p-2 */
34959599516SKenneth E. Jansen                 for(a2 = 2; a2 < ip-1; a2++){  /* a1+a2 = p        */
35059599516SKenneth E. Jansen                     if( a1+a1 == ip ){
35159599516SKenneth E. Jansen 
35259599516SKenneth E. Jansen //  	    entfn[mc] = phi(a1,xi1)*phi(a2,xi2)/qfb;
35359599516SKenneth E. Jansen 
35459599516SKenneth E. Jansen //  	    temp1 = (phi(a2,xi2)/qfb*qfb);
35559599516SKenneth E. Jansen //  	    temp2 = (qfb*phiDrv(a1,xi1)- dqfbdxi1*phi(a1,xi1));
35659599516SKenneth E. Jansen //  	    edrv[mc][gOrd[0]]= temp1*temp2;
35759599516SKenneth E. Jansen 
35859599516SKenneth E. Jansen //  	    temp1 = (phi(a1,xi1)/qfb*qfb);
35959599516SKenneth E. Jansen //  	    temp2 = (qfb*phiDrv(a2,xi2)- dqfbdxi2*phi(a2,xi2));
36059599516SKenneth E. Jansen //  	    edrv[mc][gOrd[1]]= temp1*temp2;
36159599516SKenneth E. Jansen 
36259599516SKenneth E. Jansen //  	    edrv[mc++][gOrd[2]]=0.0;
36359599516SKenneth E. Jansen 
36459599516SKenneth E. Jansen                         entfn[mc] = phi(a1,xi1)*phi(a2,xi2);
36559599516SKenneth E. Jansen                         edrv[mc][gOrd[0]] = phiDrv(a1, xi1)*phi(a2, xi2);
36659599516SKenneth E. Jansen                         edrv[mc][gOrd[1]] = phi(a1, xi1)*phiDrv(a2, xi2);
36759599516SKenneth E. Jansen                         edrv[mc++][gOrd[2]]=0.0;
36859599516SKenneth E. Jansen 
36959599516SKenneth E. Jansen                     }
37059599516SKenneth E. Jansen                 }
37159599516SKenneth E. Jansen             }
37259599516SKenneth E. Jansen         }
37359599516SKenneth E. Jansen     } else nfm =0;
37459599516SKenneth E. Jansen     return nfm;
37559599516SKenneth E. Jansen }
37659599516SKenneth E. Jansen 
hex_regn(double xi[3],int p,double * entfn,double ** edrv)37759599516SKenneth E. Jansen int hex_regn(double xi[3],int p, double* entfn, double** edrv)
37859599516SKenneth E. Jansen {
37959599516SKenneth E. Jansen     int a1, a2, a3;
38059599516SKenneth E. Jansen     int nrm, mc=0;
38159599516SKenneth E. Jansen 
38259599516SKenneth E. Jansen     double xi1 = xi[0];
38359599516SKenneth E. Jansen     double xi2 = xi[1];
38459599516SKenneth E. Jansen     double xi3 = xi[2];
38559599516SKenneth E. Jansen 
38659599516SKenneth E. Jansen     if( p > 5){
38759599516SKenneth E. Jansen 
38859599516SKenneth E. Jansen         nrm = (p-3)*(p-4)*(p-5)/6;
38959599516SKenneth E. Jansen         //      entfn = new double [nrm];
39059599516SKenneth E. Jansen         //      edrv = new double* [nrm];
39159599516SKenneth E. Jansen         //      for(int i=0; i< nrm; i++){
39259599516SKenneth E. Jansen         //        edrv[i]=new double [3];
39359599516SKenneth E. Jansen         //      }
39459599516SKenneth E. Jansen 
39559599516SKenneth E. Jansen         for(int ip =6; ip< p+1; ip++){
39659599516SKenneth E. Jansen 
39759599516SKenneth E. Jansen             for(a1=2; a1 < ip-3; a1++){
39859599516SKenneth E. Jansen                 for(a2=2; a2 < ip-3; a2++){
39959599516SKenneth E. Jansen                     for(a3=2; a3 < ip-3; a3++){
40059599516SKenneth E. Jansen                         if(a1+a2+a3 == ip){
40159599516SKenneth E. Jansen                             entfn[mc]=phi(a1,xi1)*phi(a2,xi2)*phi(a3,xi3);
40259599516SKenneth E. Jansen 
40359599516SKenneth E. Jansen                             edrv[mc][0]=phiDrv(a1,xi1)*phi(a2,xi2)*phi(a3,xi3);
40459599516SKenneth E. Jansen 
40559599516SKenneth E. Jansen                             edrv[mc][1]=phi(a1,xi1)*phiDrv(a2,xi2)*phi(a3,xi3);
40659599516SKenneth E. Jansen 
40759599516SKenneth E. Jansen                             edrv[mc++][2]=phi(a1,xi1)*phi(a2,xi2)*phiDrv(a3,xi3);
40859599516SKenneth E. Jansen                         }
40959599516SKenneth E. Jansen                     }
41059599516SKenneth E. Jansen                 }
41159599516SKenneth E. Jansen             }
41259599516SKenneth E. Jansen         }
41359599516SKenneth E. Jansen     }else nrm =0;
41459599516SKenneth E. Jansen     return nrm;
41559599516SKenneth E. Jansen }
41659599516SKenneth E. Jansen 
41759599516SKenneth E. Jansen 
41859599516SKenneth E. Jansen 
41959599516SKenneth E. Jansen /* hex hierarchic shape function */
HexShapeAndDrv(int p,double par[3],double N[],double dN[][3])42059599516SKenneth E. Jansen int HexShapeAndDrv(int p,double par[3],double N[],double dN[][3])
42159599516SKenneth E. Jansen {
42259599516SKenneth E. Jansen     int nshp = 0;
42359599516SKenneth E. Jansen     int tmp1[4];
42459599516SKenneth E. Jansen     int a,b;
42559599516SKenneth E. Jansen     double EdgeBlend,dEBdxi,dEBdeta,dEBdzeta;
42659599516SKenneth E. Jansen     double arg[3];
42759599516SKenneth E. Jansen     int arg2[3];
42859599516SKenneth E. Jansen     double* entfn;
42959599516SKenneth E. Jansen     double** endrv;
43059599516SKenneth E. Jansen     int num_e_modes, num_f_modes, num_r_modes;
43159599516SKenneth E. Jansen 
43259599516SKenneth E. Jansen     int** edge[12];
43359599516SKenneth E. Jansen     int n[8][3]={{-1,-1,-1},{1,-1,-1},{1,1,-1},{-1,1,-1},
43459599516SKenneth E. Jansen                  {-1,-1,1},{1,-1,1},{1,1,1},{-1,1,1}};
43559599516SKenneth E. Jansen 
43659599516SKenneth E. Jansen     int face[6][4] = {{0,3,2,1},{0,1,5,4},{1,2,6,5},
43759599516SKenneth E. Jansen                       {0,4,7,3},{2,3,7,6},{4,5,6,7}};
43859599516SKenneth E. Jansen     int vrt[4], z;
439*7a6b4026SCameron Smith     int normal = 0,sign;
44059599516SKenneth E. Jansen     double FaceBlend, dFBdxi, dFBdeta, dFBdzeta;
44159599516SKenneth E. Jansen 
44259599516SKenneth E. Jansen     if(p<1) return nshp;
44359599516SKenneth E. Jansen 
44459599516SKenneth E. Jansen     double xi = par[0];
44559599516SKenneth E. Jansen     double eta = par[1];
44659599516SKenneth E. Jansen     double zeta = par[2];
44759599516SKenneth E. Jansen 
44859599516SKenneth E. Jansen     double xim=1-xi;
44959599516SKenneth E. Jansen     double etam=1-eta;
45059599516SKenneth E. Jansen     double zetam=1-zeta;
45159599516SKenneth E. Jansen 
45259599516SKenneth E. Jansen     double xip=1+xi;
45359599516SKenneth E. Jansen     double etap=1+eta;
45459599516SKenneth E. Jansen     double zetap=1+zeta;
45559599516SKenneth E. Jansen 
45659599516SKenneth E. Jansen     /* Shape functions for the Nodes.
45759599516SKenneth E. Jansen      *  There are eight nodal shapefunctions. These are same as the
45859599516SKenneth E. Jansen      *  standard shape functions used in the eight-noded hexahedral
45959599516SKenneth E. Jansen      *  elements
46059599516SKenneth E. Jansen      */
46159599516SKenneth E. Jansen 
46259599516SKenneth E. Jansen     N[0]= 0.125* xim * etam * zetam ;
46359599516SKenneth E. Jansen     N[1]= 0.125* xip * etam * zetam ;
46459599516SKenneth E. Jansen     N[2]= 0.125* xip * etap * zetam ;
46559599516SKenneth E. Jansen     N[3]= 0.125* xim * etap * zetam ;
46659599516SKenneth E. Jansen     N[4]= 0.125* xim * etam * zetap ;
46759599516SKenneth E. Jansen     N[5]= 0.125* xip * etam * zetap ;
46859599516SKenneth E. Jansen     N[6]= 0.125* xip * etap * zetap ;
46959599516SKenneth E. Jansen     N[7]= 0.125* xim * etap * zetap ;
47059599516SKenneth E. Jansen 
47159599516SKenneth E. Jansen     /* Derivative of the above Shape Functions */
47259599516SKenneth E. Jansen 
47359599516SKenneth E. Jansen     dN[0][0]=-0.125*etam*zetam;
47459599516SKenneth E. Jansen     dN[0][1]=-0.125*xim*zetam;
47559599516SKenneth E. Jansen     dN[0][2]=-0.125*xim*etam;
47659599516SKenneth E. Jansen 
47759599516SKenneth E. Jansen     dN[1][0]=0.125 * etam * zetam;
47859599516SKenneth E. Jansen     dN[1][1]=-0.125 * xip * zetam;
47959599516SKenneth E. Jansen     dN[1][2]=-0.125 * xip * etam;
48059599516SKenneth E. Jansen 
48159599516SKenneth E. Jansen     dN[2][0]= 0.125 * etap * zetam;
48259599516SKenneth E. Jansen     dN[2][1] = 0.125 * xip * zetam;
48359599516SKenneth E. Jansen     dN[2][2] = -0.125 * xip * etap;
48459599516SKenneth E. Jansen 
48559599516SKenneth E. Jansen     dN[3][0] = -0.125 * etap * zetam;
48659599516SKenneth E. Jansen     dN[3][1] = 0.125 * xim * zetam;
48759599516SKenneth E. Jansen     dN[3][2] =-0.125 * xim * etap;
48859599516SKenneth E. Jansen 
48959599516SKenneth E. Jansen     dN[4][0] = -0.125 * etam * zetap;
49059599516SKenneth E. Jansen     dN[4][1] = -0.125 * xim * zetap;
49159599516SKenneth E. Jansen     dN[4][2] = 0.125 * xim * etam;
49259599516SKenneth E. Jansen 
49359599516SKenneth E. Jansen 
49459599516SKenneth E. Jansen     dN[5][0] = 0.125 * etam * zetap;
49559599516SKenneth E. Jansen     dN[5][1] =-0.125 * xip * zetap;
49659599516SKenneth E. Jansen     dN[5][2] = 0.125 * xip * etam;
49759599516SKenneth E. Jansen 
49859599516SKenneth E. Jansen     dN[6][0] = 0.125 * etap * zetap;
49959599516SKenneth E. Jansen     dN[6][1] = 0.125 * xip * zetap;
50059599516SKenneth E. Jansen     dN[6][2] = 0.125 * xip * etap;
50159599516SKenneth E. Jansen 
50259599516SKenneth E. Jansen     dN[7][0] = -0.125 * etap * zetap ;
50359599516SKenneth E. Jansen     dN[7][1] = 0.125 * xim * zetap;
50459599516SKenneth E. Jansen     dN[7][2] = 0.125 * xim * etap;
50559599516SKenneth E. Jansen 
50659599516SKenneth E. Jansen     nshp = 8;
50759599516SKenneth E. Jansen 
50859599516SKenneth E. Jansen     if( p > 1) {
50959599516SKenneth E. Jansen 
51059599516SKenneth E. Jansen         /* Generate Shape Functions for Edge Modes.
51159599516SKenneth E. Jansen          * For a polynomial Order of p there will be 12*(p-1)
51259599516SKenneth E. Jansen          * edge modes for the entire element.
51359599516SKenneth E. Jansen          */
51459599516SKenneth E. Jansen 
51559599516SKenneth E. Jansen         /*
51659599516SKenneth E. Jansen          * edge order description;
51759599516SKenneth E. Jansen          */
51859599516SKenneth E. Jansen 
51959599516SKenneth E. Jansen         for(int y=0;y<12;y++)
52059599516SKenneth E. Jansen         {
52159599516SKenneth E. Jansen             edge[y]=new int * [2];
52259599516SKenneth E. Jansen         }
52359599516SKenneth E. Jansen 
52459599516SKenneth E. Jansen         edge[0][0]=n[0];edge[0][1]=n[1];
52559599516SKenneth E. Jansen         edge[1][0]=n[1];edge[1][1]=n[2];
52659599516SKenneth E. Jansen         edge[2][0]=n[2];edge[2][1]=n[3];
52759599516SKenneth E. Jansen         edge[3][0]=n[3];edge[3][1]=n[0];
52859599516SKenneth E. Jansen         edge[4][0]=n[4];edge[4][1]=n[5];
52959599516SKenneth E. Jansen         edge[5][0]=n[5];edge[5][1]=n[6];
53059599516SKenneth E. Jansen         edge[6][0]=n[6];edge[6][1]=n[7];
53159599516SKenneth E. Jansen         edge[7][0]=n[7];edge[7][1]=n[4];
53259599516SKenneth E. Jansen         edge[8][0]=n[0];edge[8][1]=n[4];
53359599516SKenneth E. Jansen         edge[9][0]=n[1];edge[9][1]=n[5];
53459599516SKenneth E. Jansen         edge[10][0]=n[2];edge[10][1]=n[6];
53559599516SKenneth E. Jansen         edge[11][0]=n[3];edge[11][1]=n[7];
53659599516SKenneth E. Jansen 
53759599516SKenneth E. Jansen 
53859599516SKenneth E. Jansen         int nem = p-1;
53959599516SKenneth E. Jansen 
54059599516SKenneth E. Jansen         for(int e=0; e < 12; e++){
54159599516SKenneth E. Jansen 
54259599516SKenneth E. Jansen             for(z=0;z<3;z++){
54359599516SKenneth E. Jansen                 if(!(edge[e][0][z]==edge[e][1][z]))
54459599516SKenneth E. Jansen                     tmp1[3]=z;
54559599516SKenneth E. Jansen                 tmp1[z]=edge[e][1][z];
54659599516SKenneth E. Jansen             }
54759599516SKenneth E. Jansen 
54859599516SKenneth E. Jansen             if((arg2[0] = tmp1[3]) == 0) { arg2[1]=1;arg2[2]=2 ;}
54959599516SKenneth E. Jansen             else if(tmp1[3]==1) { arg2[1]=2;arg2[2]=0;}
55059599516SKenneth E. Jansen             else { arg2[1]=0;arg2[2]=1;}
55159599516SKenneth E. Jansen 
55259599516SKenneth E. Jansen             /* arg[0]=par[arg2[0]]*tmp1[arg2[0]]; */
55359599516SKenneth E. Jansen             arg[0]=par[arg2[0]];
55459599516SKenneth E. Jansen             arg[1]=par[arg2[1]];
55559599516SKenneth E. Jansen             arg[2]=par[arg2[2]];
55659599516SKenneth E. Jansen 
55759599516SKenneth E. Jansen             a = arg2[1];
55859599516SKenneth E. Jansen             b = arg2[2];
55959599516SKenneth E. Jansen 
56059599516SKenneth E. Jansen             EdgeBlend = Hex_eB(arg,tmp1[a],tmp1[b]);
56159599516SKenneth E. Jansen 
56259599516SKenneth E. Jansen             if( tmp1[3] == 0){
56359599516SKenneth E. Jansen                 dEBdxi    = dHEBdxi1(arg,tmp1[a],tmp1[b]);
56459599516SKenneth E. Jansen                 dEBdeta   = dHEBdxi2(arg,tmp1[a],tmp1[b]);
56559599516SKenneth E. Jansen                 dEBdzeta  = dHEBdxi3(arg,tmp1[a],tmp1[b]);
56659599516SKenneth E. Jansen             } else if( tmp1[3] == 1 ){
56759599516SKenneth E. Jansen                 dEBdeta   = dHEBdxi1(arg,tmp1[a],tmp1[b]);
56859599516SKenneth E. Jansen                 dEBdzeta  = dHEBdxi2(arg,tmp1[a],tmp1[b]);
56959599516SKenneth E. Jansen                 dEBdxi    = dHEBdxi3(arg,tmp1[a],tmp1[b]);
57059599516SKenneth E. Jansen             } else {
57159599516SKenneth E. Jansen                 dEBdzeta  = dHEBdxi1(arg,tmp1[a],tmp1[b]);
57259599516SKenneth E. Jansen                 dEBdxi    = dHEBdxi2(arg,tmp1[a],tmp1[b]);
57359599516SKenneth E. Jansen                 dEBdeta   = dHEBdxi3(arg,tmp1[a],tmp1[b]);
57459599516SKenneth E. Jansen             }
57559599516SKenneth E. Jansen 
57659599516SKenneth E. Jansen             entfn = new double [nem];
57759599516SKenneth E. Jansen             endrv = new double* [nem];
57859599516SKenneth E. Jansen             for(z =0; z < nem ; z++){
57959599516SKenneth E. Jansen                 endrv[z]=new double [3];
58059599516SKenneth E. Jansen             }
58159599516SKenneth E. Jansen 
58259599516SKenneth E. Jansen             num_e_modes = mesh_edge(arg[0],arg2,p,entfn,endrv);
58359599516SKenneth E. Jansen 
58459599516SKenneth E. Jansen             for(int nm=0; nm < num_e_modes; nm++){
58559599516SKenneth E. Jansen 
58659599516SKenneth E. Jansen                 N[nshp]= EdgeBlend * entfn[nm];
58759599516SKenneth E. Jansen                 dN[nshp][0]= EdgeBlend * endrv[nm][0] + dEBdxi * entfn[nm];
58859599516SKenneth E. Jansen                 dN[nshp][1]= EdgeBlend * endrv[nm][1] + dEBdeta * entfn[nm];
58959599516SKenneth E. Jansen                 dN[nshp][2]= EdgeBlend * endrv[nm][2] + dEBdzeta * entfn[nm];
59059599516SKenneth E. Jansen 
59159599516SKenneth E. Jansen                 nshp++;
59259599516SKenneth E. Jansen             }
59359599516SKenneth E. Jansen 
59459599516SKenneth E. Jansen             delete [] entfn;
59559599516SKenneth E. Jansen             for(z=0; z< num_e_modes; z++){
59659599516SKenneth E. Jansen                 delete [] endrv[z]; }
59759599516SKenneth E. Jansen             delete [] endrv;
59859599516SKenneth E. Jansen 
59959599516SKenneth E. Jansen         }
60059599516SKenneth E. Jansen     }
60159599516SKenneth E. Jansen 
60259599516SKenneth E. Jansen     if( p > 3 ) {
60359599516SKenneth E. Jansen 
60459599516SKenneth E. Jansen         /* Generating Shape functions for the face modes .
60559599516SKenneth E. Jansen          * For a Hexahedral Element there are 3*(p-2)*(p-3) shape
60659599516SKenneth E. Jansen          * functions associated with the face modes [ p>=4]
60759599516SKenneth E. Jansen          */
60859599516SKenneth E. Jansen 
60959599516SKenneth E. Jansen         int nfm = (p-2)*(p-3)/2;
61059599516SKenneth E. Jansen 
61159599516SKenneth E. Jansen         for(int f=0; f< 6; f++) {
61259599516SKenneth E. Jansen             /* Identitfying the normal to the face */
61359599516SKenneth E. Jansen 
61459599516SKenneth E. Jansen             for(int u=0;u<4;u++){
61559599516SKenneth E. Jansen                 vrt[u]=face[f][u];
61659599516SKenneth E. Jansen             }
61759599516SKenneth E. Jansen             for(int v=0;v<3;v++)
61859599516SKenneth E. Jansen             {
61959599516SKenneth E. Jansen                 if((n[vrt[0]][v]==n[vrt[1]][v])&&(n[vrt[1]][v]==n[vrt[2]][v]))
62059599516SKenneth E. Jansen                     normal=v;
62159599516SKenneth E. Jansen                 sign=n[vrt[0]][v];
62259599516SKenneth E. Jansen             }
62359599516SKenneth E. Jansen 
62459599516SKenneth E. Jansen 
62559599516SKenneth E. Jansen             arg2[2] = normal;
62659599516SKenneth E. Jansen 
62759599516SKenneth E. Jansen             if( normal==0) { arg2[0]=1;arg2[1]=2 ;}
62859599516SKenneth E. Jansen             else if(normal==1) { arg2[0]=2;arg2[1]=0;}
62959599516SKenneth E. Jansen             else { arg2[0]=0;arg2[1]=1;}
63059599516SKenneth E. Jansen 
63159599516SKenneth E. Jansen             arg[0] = par[arg2[0]];
63259599516SKenneth E. Jansen             arg[1] = par[arg2[1]];
63359599516SKenneth E. Jansen             arg[2] = par[arg2[2]];
63459599516SKenneth E. Jansen 
63559599516SKenneth E. Jansen             FaceBlend = Hex_fB(arg,sign);
63659599516SKenneth E. Jansen 
63759599516SKenneth E. Jansen             if( normal == 0){
63859599516SKenneth E. Jansen                 dFBdxi    = dHFBdxi3(arg,sign);
63959599516SKenneth E. Jansen                 dFBdeta   = dHFBdxi1(arg,sign);
64059599516SKenneth E. Jansen                 dFBdzeta  = dHFBdxi2(arg,sign);
64159599516SKenneth E. Jansen             } else if( normal == 1 ){
64259599516SKenneth E. Jansen                 dFBdeta   = dHFBdxi3(arg,sign);
64359599516SKenneth E. Jansen                 dFBdzeta  = dHFBdxi1(arg,sign);
64459599516SKenneth E. Jansen                 dFBdxi    = dHFBdxi2(arg,sign);
64559599516SKenneth E. Jansen             } else {
64659599516SKenneth E. Jansen                 dFBdzeta  = dHFBdxi3(arg,sign);
64759599516SKenneth E. Jansen                 dFBdxi    = dHFBdxi1(arg,sign);
64859599516SKenneth E. Jansen                 dFBdeta   = dHFBdxi2(arg,sign);
64959599516SKenneth E. Jansen             }
65059599516SKenneth E. Jansen 
65159599516SKenneth E. Jansen             entfn = new double [nfm];
65259599516SKenneth E. Jansen             endrv = new double* [nfm];
65359599516SKenneth E. Jansen             for(z=0; z < nfm ; z++){
65459599516SKenneth E. Jansen                 endrv[z]=new double [3];
65559599516SKenneth E. Jansen             }
65659599516SKenneth E. Jansen 
65759599516SKenneth E. Jansen             num_f_modes = quad_face(arg,arg2,p,entfn,endrv);
65859599516SKenneth E. Jansen 
65959599516SKenneth E. Jansen             for(int nm =0; nm < num_f_modes ; nm++){
66059599516SKenneth E. Jansen 
66159599516SKenneth E. Jansen                 N[nshp] =  FaceBlend * entfn[nm];
66259599516SKenneth E. Jansen                 dN[nshp][0] = FaceBlend * endrv[nm][0] + dFBdxi * entfn[nm];
66359599516SKenneth E. Jansen                 dN[nshp][1] = FaceBlend * endrv[nm][1] + dFBdeta * entfn[nm];
66459599516SKenneth E. Jansen                 dN[nshp][2] = FaceBlend * endrv[nm][2] + dFBdzeta * entfn[nm];
66559599516SKenneth E. Jansen 
66659599516SKenneth E. Jansen                 nshp++;
66759599516SKenneth E. Jansen             }
66859599516SKenneth E. Jansen 
66959599516SKenneth E. Jansen             delete [] entfn;
67059599516SKenneth E. Jansen             for( z=0; z< num_f_modes; z++){
67159599516SKenneth E. Jansen                 delete [] endrv[z]; }
67259599516SKenneth E. Jansen             delete [] endrv;
67359599516SKenneth E. Jansen         }
67459599516SKenneth E. Jansen     }
67559599516SKenneth E. Jansen 
67659599516SKenneth E. Jansen     if ( p > 5 ) {
67759599516SKenneth E. Jansen 
67859599516SKenneth E. Jansen         int nrm = (p-3)*(p-4)*(p-5)/6;
67959599516SKenneth E. Jansen 
68059599516SKenneth E. Jansen         entfn = new double [nrm];
68159599516SKenneth E. Jansen         endrv = new double* [nrm];
68259599516SKenneth E. Jansen         for(z =0; z < nrm ; z++){
68359599516SKenneth E. Jansen             endrv[z]=new double [3];
68459599516SKenneth E. Jansen         }
68559599516SKenneth E. Jansen 
68659599516SKenneth E. Jansen         num_r_modes = hex_regn(par,p,entfn,endrv);
68759599516SKenneth E. Jansen 
68859599516SKenneth E. Jansen         for(int nm =0; nm < num_r_modes ; nm++){
68959599516SKenneth E. Jansen             N[nshp] = entfn[nm];
69059599516SKenneth E. Jansen             for(int d=0; d < 3; d++){
69159599516SKenneth E. Jansen                 dN[nshp][d] = endrv[nm][d];
69259599516SKenneth E. Jansen             }
69359599516SKenneth E. Jansen             nshp++;
69459599516SKenneth E. Jansen         }
69559599516SKenneth E. Jansen         delete [] entfn;
69659599516SKenneth E. Jansen         for(z=0; z< num_r_modes; z++){
69759599516SKenneth E. Jansen             delete [] endrv[z]; }
69859599516SKenneth E. Jansen         delete [] endrv;
69959599516SKenneth E. Jansen 
70059599516SKenneth E. Jansen     }
70159599516SKenneth E. Jansen     return nshp;
70259599516SKenneth E. Jansen }
70359599516SKenneth E. Jansen 
70459599516SKenneth E. Jansen /* hierarchic wedge element shape function */
70559599516SKenneth E. Jansen 
WedgeShapeAndDrv(int p,double Inputpar[3],double N[],double dN[][3])70659599516SKenneth E. Jansen int WedgeShapeAndDrv( int p, double Inputpar[3], double N[], double dN[][3] )
70759599516SKenneth E. Jansen {
70859599516SKenneth E. Jansen     int i,j;
70959599516SKenneth E. Jansen     double FaceBlend, FaceBlendDrv[4];
71059599516SKenneth E. Jansen     double FaceEnt; //, FaceEntDrv[2][3];
71159599516SKenneth E. Jansen     double par[4];
71259599516SKenneth E. Jansen     //  int sign;
71359599516SKenneth E. Jansen     //  int temp[4]={0,0,0,0};
71459599516SKenneth E. Jansen     double EdgeBlend[9], EdgeBlendDrv[9][3];
71559599516SKenneth E. Jansen     //  double arg[3];
71659599516SKenneth E. Jansen     //  double arg2[2];
71759599516SKenneth E. Jansen     //  int ** edge[9];
71859599516SKenneth E. Jansen     double entfn[9];
71959599516SKenneth E. Jansen     double endrv[9][3];
72059599516SKenneth E. Jansen     //  int num_e_modes;
72159599516SKenneth 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}};
72259599516SKenneth E. Jansen 
72359599516SKenneth E. Jansen     int nshp = 0;
72459599516SKenneth E. Jansen     par[0] = 1.0 - Inputpar[0]- Inputpar[1];
72559599516SKenneth E. Jansen     par[1] = Inputpar[0];
72659599516SKenneth E. Jansen     par[2] = Inputpar[1];
72759599516SKenneth E. Jansen     par[3] = Inputpar[2];
72859599516SKenneth E. Jansen 
72959599516SKenneth E. Jansen 
73059599516SKenneth E. Jansen     if(p<1) return nshp;
73159599516SKenneth E. Jansen 
73259599516SKenneth E. Jansen    /* there are six nodal shape functions same as the standard
73359599516SKenneth E. Jansen       shape functions used in the six-noded wedge element */
73459599516SKenneth E. Jansen 
73559599516SKenneth E. Jansen    N[0]=0.5*par[0]*(1.0-par[3]);
73659599516SKenneth E. Jansen    N[1]=0.5*par[1]*(1.0-par[3]);
73759599516SKenneth E. Jansen    N[2]=0.5*par[2]*(1.0-par[3]);
73859599516SKenneth E. Jansen    N[3]=0.5*par[0]*(1.0+par[3]);
73959599516SKenneth E. Jansen    N[4]=0.5*par[1]*(1.0+par[3]);
74059599516SKenneth E. Jansen    N[5]=0.5*par[2]*(1.0+par[3]);
74159599516SKenneth E. Jansen 
74259599516SKenneth E. Jansen    /* Derivative of the above Shape functions */
74359599516SKenneth E. Jansen    dN[0][0]=-0.25*(1.0-par[3]);
74459599516SKenneth E. Jansen    dN[0][1]=-0.25*(1.0-par[3]);
74559599516SKenneth E. Jansen    dN[0][2]=-0.5*par[0];
74659599516SKenneth E. Jansen 
74759599516SKenneth E. Jansen    dN[1][0]=0.25*(1.0-par[3]);
74859599516SKenneth E. Jansen    dN[1][1]=0.0;
74959599516SKenneth E. Jansen    dN[1][2]=-0.5*par[1];
75059599516SKenneth E. Jansen 
75159599516SKenneth E. Jansen    dN[2][0]=0.0;
75259599516SKenneth E. Jansen    dN[2][1]=0.25*(1.0-par[3]);
75359599516SKenneth E. Jansen    dN[2][2]=-0.5*par[2];
75459599516SKenneth E. Jansen 
75559599516SKenneth E. Jansen    dN[3][0]=-0.25*(1.0+par[3]);
75659599516SKenneth E. Jansen    dN[3][1]=-0.25*(1.0+par[3]);
75759599516SKenneth E. Jansen    dN[3][2]=0.5*par[0];
75859599516SKenneth E. Jansen 
75959599516SKenneth E. Jansen    dN[4][0]=0.25*(1.0+par[3]);
76059599516SKenneth E. Jansen    dN[4][1]=0.0;
76159599516SKenneth E. Jansen    dN[4][2]=0.5*par[1];
76259599516SKenneth E. Jansen 
76359599516SKenneth E. Jansen    dN[5][0]=0.0;
76459599516SKenneth E. Jansen    dN[5][1]=0.25*(1.0+par[3]);
76559599516SKenneth E. Jansen    dN[5][2]=0.5*par[2];
76659599516SKenneth E. Jansen 
76759599516SKenneth E. Jansen 
76859599516SKenneth E. Jansen    nshp = 6;
76959599516SKenneth E. Jansen 
77059599516SKenneth E. Jansen //   if( p > 1 ){
77159599516SKenneth E. Jansen 
77259599516SKenneth E. Jansen //     /* calculate the blending shape functions and their drivitative */
77359599516SKenneth E. Jansen //      EdgeBlend[0] = -par[0]*par[1]*(1.0-par[3]);
77459599516SKenneth E. Jansen //      EdgeBlendDrv[0][0] = -0.5*(par[0]-par[1])*(1.0-par[3]);
77559599516SKenneth E. Jansen //      EdgeBlendDrv[0][1] = 0.5*par[1]*(1.0-par[3]);
77659599516SKenneth E. Jansen //      EdgeBlendDrv[0][2] = par[0]*par[1];
77759599516SKenneth E. Jansen 
77859599516SKenneth E. Jansen //      EdgeBlend[1] = -par[1]*par[2]*(1.0-par[3]);
77959599516SKenneth E. Jansen //      EdgeBlendDrv[1][0] = -0.5*par[2]*(1.0-par[3]);
78059599516SKenneth E. Jansen //      EdgeBlendDrv[1][1] = -0.5*par[1]*(1.0-par[3]);
78159599516SKenneth E. Jansen //      EdgeBlendDrv[1][2] = par[1]*par[2];
78259599516SKenneth E. Jansen 
78359599516SKenneth E. Jansen //      EdgeBlend[2] = -par[0]*par[2]*(1.0-par[3]);
78459599516SKenneth E. Jansen //      EdgeBlendDrv[2][0] = 0.5*par[2]*(1.0-par[3]);
78559599516SKenneth E. Jansen //      EdgeBlendDrv[2][1] = -0.5*(par[0]-par[2])*(1.0-par[3]);
78659599516SKenneth E. Jansen //      EdgeBlendDrv[2][2] = par[0]*par[2];
78759599516SKenneth E. Jansen 
78859599516SKenneth E. Jansen //      EdgeBlend[3] = -par[0]*par[1]*(1.0+par[3]);
78959599516SKenneth E. Jansen //      EdgeBlendDrv[3][0] = -0.5*(par[0]-par[1])*(1.0+par[3]);
79059599516SKenneth E. Jansen //      EdgeBlendDrv[3][1] = 0.5*par[1]*(1.0+par[3]);
79159599516SKenneth E. Jansen //      EdgeBlendDrv[3][2] = -par[0]*par[1];
79259599516SKenneth E. Jansen 
79359599516SKenneth E. Jansen //      EdgeBlend[4] = -par[1]*par[2]*(1.0+par[3]);
79459599516SKenneth E. Jansen //      EdgeBlendDrv[4][0] = -0.5*par[2]*(1.0+par[3]);
79559599516SKenneth E. Jansen //      EdgeBlendDrv[4][1] = -0.5*par[1]*(1.0+par[3]);
79659599516SKenneth E. Jansen //      EdgeBlendDrv[4][2] = -par[1]*par[2];
79759599516SKenneth E. Jansen 
79859599516SKenneth E. Jansen //      EdgeBlend[5] = -par[0]*par[2]*(1.0+par[3]);
79959599516SKenneth E. Jansen //      EdgeBlendDrv[5][0] = 0.5*par[2]*(1.0+par[3]);
80059599516SKenneth E. Jansen //      EdgeBlendDrv[5][1] = -0.5*(par[0]-par[2])*(1.0+par[3]);
80159599516SKenneth E. Jansen //      EdgeBlendDrv[5][2] = -par[0]*par[2];
80259599516SKenneth E. Jansen 
80359599516SKenneth E. Jansen //      EdgeBlend[6] = 0.5*par[0]*(par[3]*par[3]-1.0);
80459599516SKenneth E. Jansen //      EdgeBlendDrv[6][0] = -0.25*(par[3]*par[3] - 1.0);
80559599516SKenneth E. Jansen //      EdgeBlendDrv[6][1] = -0.25*(par[3]*par[3] - 1.0);
80659599516SKenneth E. Jansen //      EdgeBlendDrv[6][2] = par[0]*par[3];
80759599516SKenneth E. Jansen 
80859599516SKenneth E. Jansen //      EdgeBlend[7] = 0.5*par[1]*(par[3]*par[3]-1.0);
80959599516SKenneth E. Jansen //      EdgeBlendDrv[7][0] = 0.25*(par[3]*par[3] - 1.0);
81059599516SKenneth E. Jansen //      EdgeBlendDrv[7][1] = 0.0;
81159599516SKenneth E. Jansen //      EdgeBlendDrv[7][2] = par[1]*par[3];
81259599516SKenneth E. Jansen 
81359599516SKenneth E. Jansen //      EdgeBlend[8] = 0.5*par[2]*(par[3]*par[3]-1.0);
81459599516SKenneth E. Jansen //      EdgeBlendDrv[8][0] = 0.0;
81559599516SKenneth E. Jansen //      EdgeBlendDrv[8][1] = 0.25*(par[3]*par[3] - 1.0);
81659599516SKenneth E. Jansen //      EdgeBlendDrv[8][2] = par[2]*par[3];
81759599516SKenneth E. Jansen 
81859599516SKenneth E. Jansen //       /* calculate the mesh entity shape function */
81959599516SKenneth E. Jansen 
82059599516SKenneth E. Jansen //      /* for the edge in the two triangle faces */
82159599516SKenneth E. Jansen //      for(j=0; j<9; j++){
82259599516SKenneth E. Jansen //        /* this is where I think the change in phi is for wedges */
82359599516SKenneth E. Jansen //        entfn[j] = 1.0;
82459599516SKenneth E. Jansen // 	 /*    entfn[j] = sqrt(1.5); */
82559599516SKenneth E. Jansen //        for(i=0; i<3; i++)
82659599516SKenneth E. Jansen // 	 endrv[j][i] = 0.0;
82759599516SKenneth E. Jansen //      }
82859599516SKenneth E. Jansen 
82959599516SKenneth E. Jansen // //       /* for the edge in the perpendicular to triangle faces */
83059599516SKenneth E. Jansen // //       for(j=6; j<9; j++){
83159599516SKenneth E. Jansen // //         entfn[j] = phi(2, par[3]);
83259599516SKenneth E. Jansen // //         for(i=0; i<3; i++)
83359599516SKenneth E. Jansen // //  	 endrv[j][i] = 0.0;
83459599516SKenneth E. Jansen // //       }
83559599516SKenneth E. Jansen 
83659599516SKenneth E. Jansen //      for(j=0; j<9; j++){
83759599516SKenneth E. Jansen //        N[nshp] = EdgeBlend[j]*entfn[j];
83859599516SKenneth E. Jansen //        dN[nshp][0] = EdgeBlend[j]*endrv[j][0] + EdgeBlendDrv[j][0]*entfn[j];
83959599516SKenneth E. Jansen //        dN[nshp][1] = EdgeBlend[j]*endrv[j][1] + EdgeBlendDrv[j][1]*entfn[j];
84059599516SKenneth E. Jansen //        dN[nshp][2] = EdgeBlend[j]*endrv[j][2] + EdgeBlendDrv[j][2]*entfn[j];
84159599516SKenneth E. Jansen 
84259599516SKenneth E. Jansen //        ++nshp;
84359599516SKenneth E. Jansen //      }
84459599516SKenneth E. Jansen 
84559599516SKenneth E. Jansen //   }
84659599516SKenneth E. Jansen 
84759599516SKenneth E. Jansen //   /* generate the tri face shape fuction */
84859599516SKenneth E. Jansen //   if( p > 2 ){
84959599516SKenneth E. Jansen //     for(i=0;i<11;i++){
85059599516SKenneth E. Jansen //       /* get the face blending functions */
85159599516SKenneth E. Jansen //       if(par[3]>0){
85259599516SKenneth E. Jansen // 	FaceBlend = 0.5*par[0]*par[1]*par[2]*(1.0-par[3]);
85359599516SKenneth E. Jansen 
85459599516SKenneth E. Jansen // 	/* derivate the face blending functions */
85559599516SKenneth E. Jansen // 	FaceBlendDrv[0]= 0.5*par[1]*par[2]*(1.0-par[3]);
85659599516SKenneth E. Jansen // 	FaceBlendDrv[1]= 0.5*par[0]*par[2]*(1.0-par[3]);
85759599516SKenneth E. Jansen // 	FaceBlendDrv[2]= 0.5*par[0]*par[1]*(1.0-par[3]);
85859599516SKenneth E. Jansen // 	FaceBlendDrv[3]=-0.5*par[0]*par[1]*par[2];
85959599516SKenneth E. Jansen //       }
86059599516SKenneth E. Jansen //       else{
86159599516SKenneth E. Jansen // 	FaceBlend = 0.5*par[0]*par[1]*par[2]*(1.0+par[3]);
86259599516SKenneth E. Jansen 
86359599516SKenneth E. Jansen // 	/* derivate the face blending functions */
86459599516SKenneth E. Jansen // 	FaceBlendDrv[0]= 0.5*par[1]*par[2]*(1.0+par[3]);
86559599516SKenneth E. Jansen // 	FaceBlendDrv[1]= 0.5*par[0]*par[2]*(1.0+par[3]);
86659599516SKenneth E. Jansen // 	FaceBlendDrv[2]= 0.5*par[0]*par[1]*(1.0+par[3]);
86759599516SKenneth E. Jansen // 	FaceBlendDrv[3]= 0.5*par[0]*par[1]*par[2];
86859599516SKenneth E. Jansen //       }
86959599516SKenneth E. Jansen 
87059599516SKenneth E. Jansen //       /*calculate the mesh entity function for cubic triangular face */
87159599516SKenneth E. Jansen //       FaceEnt = 1.0;
87259599516SKenneth E. Jansen 
87359599516SKenneth E. Jansen //       /*calculate the shape functions*/
87459599516SKenneth E. Jansen //       N[nshp] = FaceBlend*FaceEnt;
87559599516SKenneth E. Jansen //       dN[nshp][0]=FaceBlendDrv[0];
87659599516SKenneth E. Jansen //       dN[nshp][1]=FaceBlendDrv[1];
87759599516SKenneth E. Jansen //       dN[nshp][2]=FaceBlendDrv[2];
87859599516SKenneth E. Jansen //       dN[nshp][3]=FaceBlendDrv[3];
87959599516SKenneth E. Jansen 
88059599516SKenneth E. Jansen //       nshp++;
88159599516SKenneth E. Jansen //     }
88259599516SKenneth E. Jansen //   }
88359599516SKenneth E. Jansen 
88459599516SKenneth E. Jansen     return nshp;
88559599516SKenneth E. Jansen }
88659599516SKenneth E. Jansen 
88759599516SKenneth E. Jansen /* Pyramid hierarchic shape function up to order 3*/
PyrShapeAndDrv(int p,double par[3],double N[],double dN[][3])88859599516SKenneth E. Jansen int PyrShapeAndDrv(int p,double par[3],double N[],double dN[][3])
88959599516SKenneth E. Jansen {
89059599516SKenneth E. Jansen     int i;
89159599516SKenneth E. Jansen     double EdgeBlend, EdgeBlendDrv[3];
89259599516SKenneth E. Jansen     double EdgeEntity[2], EdgeEntityDrv[2][3];
89359599516SKenneth E. Jansen     double FaceBlend, FaceBlendDrv[3];
89459599516SKenneth E. Jansen     double FaceEntity[2], FaceEntityDrv[2][3];
89559599516SKenneth E. Jansen 
89659599516SKenneth E. Jansen     //dEBdxi,dEBdeta,dEBdzeta;
89759599516SKenneth E. Jansen     //  double arg[3];
89859599516SKenneth E. Jansen     // int arg2[3];
89959599516SKenneth E. Jansen     // double* entfn;
90059599516SKenneth E. Jansen     //  double** endrv;
90159599516SKenneth E. Jansen     // int num_e_modes, num_f_modes, num_r_modes;
90259599516SKenneth E. Jansen 
90359599516SKenneth E. Jansen     int** edge[8];  // total 8 edges
90459599516SKenneth E. Jansen     int n[5][3]={{-1,-1, -1},{1,-1,-1},{1,1,-1},{-1,1, -1}, {0, 0, 1}}; // vertex coordinates
90559599516SKenneth E. Jansen 
90659599516SKenneth E. Jansen //    int n[5][3]={{-1,-1, 1},{-1,-1,-1},{1,-1,-1},{1,-1, 1}, {0, 1, 0}}; // vertex coordinates
90759599516SKenneth E. Jansen 
90859599516SKenneth 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
90959599516SKenneth 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
91059599516SKenneth E. Jansen     //  int vrt[4];
91159599516SKenneth E. Jansen     //  int normal;
91259599516SKenneth E. Jansen     int sign[3];
91359599516SKenneth E. Jansen 
91459599516SKenneth E. Jansen     if(p<1) return nshp;
91559599516SKenneth E. Jansen 
91659599516SKenneth E. Jansen 
91759599516SKenneth E. Jansen     // when p=1, there are only nodal shapefunctions
91859599516SKenneth E. Jansen     double zeta = par[2];
91959599516SKenneth E. Jansen     double xi = par[0];
92059599516SKenneth E. Jansen     double eta = par[1];
92159599516SKenneth E. Jansen 
92259599516SKenneth E. Jansen     //  double xim=1-xi;
92359599516SKenneth E. Jansen     //  double etam=1-eta;
92459599516SKenneth E. Jansen     double zetam=1-zeta;
92559599516SKenneth E. Jansen 
92659599516SKenneth E. Jansen     double zetamap=2.0/zetam;
92759599516SKenneth E. Jansen 
92859599516SKenneth E. Jansen     //  double xip=1+xi;
92959599516SKenneth E. Jansen     // double etap=1+eta;
93059599516SKenneth E. Jansen     double zetap=1+zeta;
93159599516SKenneth E. Jansen 
93259599516SKenneth E. Jansen     double xipp=1+xi*zetamap;
93359599516SKenneth E. Jansen     double etapp=1+eta*zetamap;
93459599516SKenneth E. Jansen 
93559599516SKenneth E. Jansen     double ximp=1-xi*zetamap;
93659599516SKenneth E. Jansen     double etamp=1-eta*zetamap;
93759599516SKenneth E. Jansen 
93859599516SKenneth E. Jansen     // Shape functions for the Nodes.
93959599516SKenneth E. Jansen     // There are five nodal shapefunctions.
94059599516SKenneth E. Jansen 
94159599516SKenneth E. Jansen     N[0]= 0.125* ximp * etamp * zetam ;
94259599516SKenneth E. Jansen     N[1]= 0.125* xipp * etamp * zetam ;
94359599516SKenneth E. Jansen     N[2]= 0.125* xipp * etapp * zetam ;
94459599516SKenneth E. Jansen     N[3]= 0.125* ximp * etapp * zetam ;
94559599516SKenneth E. Jansen     N[4]= 0.5* zetap;
94659599516SKenneth E. Jansen 
94759599516SKenneth E. Jansen     // Derivative of the above Shape Functions
94859599516SKenneth E. Jansen     dN[0][0] =-0.25 *  etamp;
94959599516SKenneth E. Jansen     dN[0][1] =-0.25 *  ximp;
95059599516SKenneth E. Jansen     dN[0][2] = 0.125 * (xi*eta*zetamap*zetamap-1);
95159599516SKenneth E. Jansen 
95259599516SKenneth E. Jansen     dN[1][0] = 0.25 * etamp;
95359599516SKenneth E. Jansen     dN[1][1] =-0.25 * xipp;
95459599516SKenneth E. Jansen     dN[1][2] =-0.125 * (xi*eta*zetamap*zetamap+1);
95559599516SKenneth E. Jansen 
95659599516SKenneth E. Jansen     dN[2][0] = 0.25 * etapp;
95759599516SKenneth E. Jansen     dN[2][1] = 0.25 * xipp;
95859599516SKenneth E. Jansen     dN[2][2] = dN[0][2];
95959599516SKenneth E. Jansen 
96059599516SKenneth E. Jansen     dN[3][0] =-0.25 * etapp;
96159599516SKenneth E. Jansen     dN[3][1] = 0.25 * ximp;
96259599516SKenneth E. Jansen     dN[3][2] = dN[1][2];
96359599516SKenneth E. Jansen 
96459599516SKenneth E. Jansen     dN[4][0] = 0;
96559599516SKenneth E. Jansen     dN[4][1] = 0;
96659599516SKenneth E. Jansen     dN[4][2] = 0.5;
96759599516SKenneth E. Jansen 
96859599516SKenneth E. Jansen     nshp = 5;
96959599516SKenneth E. Jansen 
97059599516SKenneth E. Jansen     if( p>1) {
97159599516SKenneth E. Jansen 
97259599516SKenneth E. Jansen         // Generate Shape Functions for Edges.
97359599516SKenneth E. Jansen         // For a polynomial Order of p there are 8*(p-1)
97459599516SKenneth E. Jansen         // edge modes for the entire element.
97559599516SKenneth E. Jansen 
97659599516SKenneth E. Jansen         // allocate spaces for edge order description
97759599516SKenneth E. Jansen         for(i=0; i<8; i++)
97859599516SKenneth E. Jansen             edge[i]=new int * [2];
97959599516SKenneth E. Jansen 
98059599516SKenneth E. Jansen         // for the edges on the quadrilateral face
98159599516SKenneth E. Jansen         edge[0][0]=n[0]; edge[0][1]=n[1];
98259599516SKenneth E. Jansen         edge[1][0]=n[1]; edge[1][1]=n[2];
98359599516SKenneth E. Jansen         edge[2][0]=n[2]; edge[2][1]=n[3];
98459599516SKenneth E. Jansen         edge[3][0]=n[3]; edge[3][1]=n[0];
98559599516SKenneth E. Jansen 
98659599516SKenneth E. Jansen         // for other edges on triangular faces
98759599516SKenneth E. Jansen         edge[4][0]=n[0]; edge[4][1]=n[4];
98859599516SKenneth E. Jansen         edge[5][0]=n[1]; edge[5][1]=n[4];
98959599516SKenneth E. Jansen         edge[6][0]=n[2]; edge[6][1]=n[4];
99059599516SKenneth E. Jansen         edge[7][0]=n[3]; edge[7][1]=n[4];
99159599516SKenneth E. Jansen 
99259599516SKenneth E. Jansen 
99359599516SKenneth E. Jansen         // calculate the edge blending functions and their derivatives
99459599516SKenneth E. Jansen         for(i=0; i < 8; i++) {
99559599516SKenneth E. Jansen             int k, m, along, j;
99659599516SKenneth E. Jansen             switch (i) {
99759599516SKenneth E. Jansen                 // first four are on quadrilateral face
99859599516SKenneth E. Jansen 
99959599516SKenneth E. Jansen                 // P.N anil fix this
100059599516SKenneth E. Jansen             case 0:
100159599516SKenneth E. Jansen                 k =1;	m =2;   sign[m-1] =-1;  along =k;
100259599516SKenneth E. Jansen                 break;
100359599516SKenneth E. Jansen             case 1:
100459599516SKenneth E. Jansen                 k =2;   m =1;   sign[m-1] =1;   along =k;
100559599516SKenneth E. Jansen                 break;
100659599516SKenneth E. Jansen             case 2:
100759599516SKenneth E. Jansen                 k =1;   m =2;   sign[m-1] =1;   along =k;
100859599516SKenneth E. Jansen                 break;
100959599516SKenneth E. Jansen             case 3:
101059599516SKenneth E. Jansen                 k =2;   m =1;   sign[m-1] =-1;  along =k;
101159599516SKenneth E. Jansen                 break;
101259599516SKenneth E. Jansen                 // next four are on triangular faces
101359599516SKenneth E. Jansen             case 4:
101459599516SKenneth E. Jansen                 k =1;   m =2;   sign[k-1] =-1;    sign[m-1] =-1;  along =3;
101559599516SKenneth E. Jansen                 break;
101659599516SKenneth E. Jansen             case 5:
101759599516SKenneth E. Jansen                 k =2;   m =1;   sign[k-1] =-1;    sign[m-1] =1; along =3;
101859599516SKenneth E. Jansen                 break;
101959599516SKenneth E. Jansen             case 6:
102059599516SKenneth E. Jansen                 k =1;   m =2;   sign[k-1] =1;     sign[m-1] =1; along =3;
102159599516SKenneth E. Jansen                 break;
102259599516SKenneth E. Jansen             case 7:
102359599516SKenneth E. Jansen                 k =2;   m =1;   sign[k-1] =1;     sign[m-1] =-1; along =3;
102459599516SKenneth E. Jansen             }
102559599516SKenneth E. Jansen             EdgeBlend =Pyr_eB (par, sign, k, m, along);
102659599516SKenneth E. Jansen             for (j=0; j<3; j++)
102759599516SKenneth E. Jansen                 EdgeBlendDrv[j] =dPeBdxi(par, sign, k, m, along, j);
102859599516SKenneth E. Jansen 
102959599516SKenneth E. Jansen             // calculate the mesh entity shape function
103059599516SKenneth E. Jansen 
103159599516SKenneth E. Jansen             // calculate the edge entity function for p=2
103259599516SKenneth E. Jansen             EdgeEntity[0] =1;
103359599516SKenneth E. Jansen             EdgeEntityDrv[0][0] =EdgeEntityDrv[0][1] =EdgeEntityDrv[0][2] =0;
103459599516SKenneth E. Jansen 
103559599516SKenneth E. Jansen             if (p>2) {
103659599516SKenneth E. Jansen                 // calculate the edge entity function for p=3
103759599516SKenneth E. Jansen                 if (i<4) {
103859599516SKenneth E. Jansen                     // for the edges of the quadrilateral face with parameterization I
103959599516SKenneth E. Jansen                     // equation (33)
104059599516SKenneth E. Jansen                     EdgeEntity[1] =par[k-1];
104159599516SKenneth E. Jansen                     for (j=0; j<3; j++)
104259599516SKenneth E. Jansen                         EdgeEntityDrv[1][j] =(int)(k-1==j);
104359599516SKenneth E. Jansen                 } else {
104459599516SKenneth E. Jansen                     // for the edges of the triangular faces with parameterization II
104559599516SKenneth E. Jansen                     // First of all, we need to represent these edges use xi's
104659599516SKenneth E. Jansen                     // In our definition, u[0] points to the quadrilateral base
104759599516SKenneth E. Jansen                     //                    u[1] points to the top
104859599516SKenneth E. Jansen                     // then, we get	u[0] =(1-xi[1])/2;	  u[1] =(1+xi[1])/2;
104959599516SKenneth E. Jansen                     //                    EdgeEntity[1] =u[1]-u[0] =xi[1];
105059599516SKenneth E. Jansen                     EdgeEntity[1] =par[1];
105159599516SKenneth E. Jansen                     EdgeEntityDrv[1][1] =1; EdgeEntityDrv[1][0]=EdgeEntityDrv[1][2]=0;
105259599516SKenneth E. Jansen                 }
105359599516SKenneth E. Jansen             }
105459599516SKenneth E. Jansen 
105559599516SKenneth E. Jansen             for(j=0; j < p-1; j++){
105659599516SKenneth E. Jansen 
105759599516SKenneth E. Jansen                 N[nshp]= EdgeBlend * EdgeEntity[j];
105859599516SKenneth E. Jansen                 dN[nshp][0]= EdgeBlend * EdgeEntityDrv[j][0] + EdgeBlendDrv[0] * EdgeEntity[j];
105959599516SKenneth E. Jansen                 dN[nshp][1]= EdgeBlend * EdgeEntityDrv[j][1] + EdgeBlendDrv[1] * EdgeEntity[j];
106059599516SKenneth E. Jansen                 dN[nshp][2]= EdgeBlend * EdgeEntityDrv[j][2] + EdgeBlendDrv[2] * EdgeEntity[j];
106159599516SKenneth E. Jansen                 nshp++;
106259599516SKenneth E. Jansen             }
106359599516SKenneth E. Jansen         }
106459599516SKenneth E. Jansen 
106559599516SKenneth E. Jansen         // calculate the shape function for triangular faces
106659599516SKenneth E. Jansen         if (p==3) {
106759599516SKenneth E. Jansen             for (i=1; i<5; i++) {
106859599516SKenneth E. Jansen                 // calculate the face blending functions
106959599516SKenneth E. Jansen                 int k, m, j;
107059599516SKenneth E. Jansen                 switch (i) {
107159599516SKenneth E. Jansen                 case 1:
107259599516SKenneth E. Jansen                     k =1;   m =3;   sign[k-1] =-1;
107359599516SKenneth E. Jansen                     break;
107459599516SKenneth E. Jansen                 case 2:
107559599516SKenneth E. Jansen                     k =3;   m =1;   sign[k-1] =-1;
107659599516SKenneth E. Jansen                     break;
107759599516SKenneth E. Jansen                 case 3:
107859599516SKenneth E. Jansen                     k =1;   m =3;   sign[k-1] =1;
107959599516SKenneth E. Jansen                     break;
108059599516SKenneth E. Jansen                 case 4:
108159599516SKenneth E. Jansen                     k =3;   m =1;   sign[k-1] =1;
108259599516SKenneth E. Jansen                     break;
108359599516SKenneth E. Jansen                 }
108459599516SKenneth E. Jansen                 FaceBlend =Pyr_fB (par, sign, k, m, 3);
108559599516SKenneth E. Jansen                 for (j=0; j<3; j++)
108659599516SKenneth E. Jansen                     FaceBlendDrv[j] =dPfBdxi(par, sign, k, m, 3, j);
108759599516SKenneth E. Jansen 
108859599516SKenneth E. Jansen                 // for p=3
108959599516SKenneth E. Jansen                 FaceEntity[0] =1;
109059599516SKenneth E. Jansen                 FaceEntityDrv[0][0] =FaceEntityDrv[0][1] =FaceEntityDrv[0][2] =0;
109159599516SKenneth E. Jansen 
109259599516SKenneth E. Jansen                 for(j=0; j < p-2; j++){
109359599516SKenneth E. Jansen 
109459599516SKenneth E. Jansen                     N[nshp]= FaceBlend * EdgeEntity[j];
109559599516SKenneth E. Jansen                     dN[nshp][0]= FaceBlend * FaceEntityDrv[j][0] + FaceBlendDrv[0] * FaceEntity[j];
109659599516SKenneth E. Jansen                     dN[nshp][1]= FaceBlend * FaceEntityDrv[j][1] + FaceBlendDrv[1] * FaceEntity[j];
109759599516SKenneth E. Jansen                     dN[nshp][2]= FaceBlend * FaceEntityDrv[j][2] + FaceBlendDrv[2] * FaceEntity[j];
109859599516SKenneth E. Jansen                     nshp++;
109959599516SKenneth E. Jansen                 }
110059599516SKenneth E. Jansen             }
110159599516SKenneth E. Jansen         }
110259599516SKenneth E. Jansen     }
110359599516SKenneth E. Jansen 
110459599516SKenneth E. Jansen     return nshp;
110559599516SKenneth E. Jansen }
110659599516SKenneth E. Jansen 
110759599516SKenneth E. Jansen 
110859599516SKenneth E. Jansen 
110959599516SKenneth E. Jansen 
1110