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; 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 /***************************************************************************/ 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 /***************************************************************************/ 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 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 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 7359599516SKenneth E. Jansen double dLEBdxi1(double xi1){ return xi1; } 7459599516SKenneth E. Jansen double dLEBdxi2(double xi1){return 0;} 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 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 8659599516SKenneth E. Jansen double dQEBdxi1(double xi1, double xi2, int sign) 8759599516SKenneth E. Jansen { return 0.5*xi1*(1+sign*xi2); } 8859599516SKenneth E. Jansen 8959599516SKenneth E. Jansen double dQEBdxi2(double xi1, double xi2, int sign) 9059599516SKenneth E. Jansen { return 0.25*sign*(xi1*xi1 - 1); } 9159599516SKenneth E. Jansen 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 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 10359599516SKenneth E. Jansen double dQFBdxi1(double xi1, double xi2) 10459599516SKenneth E. Jansen { return 0.5*xi1*(xi2*xi2 - 1); } 10559599516SKenneth E. Jansen 10659599516SKenneth E. Jansen double dQFBdxi2(double xi1, double xi2) 10759599516SKenneth E. Jansen { return 0.5*xi2*(xi1*xi1 - 1); } 10859599516SKenneth E. Jansen 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 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 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 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 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 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 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 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 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 */ 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 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 */ 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 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 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 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 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 */ 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 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*/ 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