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