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