1*59599516SKenneth E. Jansen /*-------------------------------------------------------------------------
2*59599516SKenneth E. Jansen Scientific Computation Research Center, RPI, Troy NY
3*59599516SKenneth E. Jansen (C) Copyright 1995, RPI-SCOREC
4*59599516SKenneth E. Jansen
5*59599516SKenneth E. Jansen Project : shapeFuntions
6*59599516SKenneth E. Jansen Author(s): Saikat Dey
7*59599516SKenneth E. Jansen Creation : Oct., 95
8*59599516SKenneth E. Jansen Modifi. :
9*59599516SKenneth E. Jansen Function :
10*59599516SKenneth E. Jansen return hierarchic mode shapes associated with a given mesh
11*59599516SKenneth E. Jansen entity of a specified polynomial order.
12*59599516SKenneth E. Jansen -------------------------------------------------------------------------*/
13*59599516SKenneth E. Jansen
14*59599516SKenneth E. Jansen #include <math.h>
15*59599516SKenneth E. Jansen #include "shapeFuncInternals.h"
16*59599516SKenneth E. Jansen
17*59599516SKenneth E. Jansen #ifdef __cplusplus
18*59599516SKenneth E. Jansen extern "C" {
19*59599516SKenneth E. Jansen #endif
20*59599516SKenneth E. Jansen
E_modeShape(int p,double * L)21*59599516SKenneth E. Jansen double E_modeShape(int p, double *L) {
22*59599516SKenneth E. Jansen /* Return edge mode shape function evaluated along an edge at a point (Li,Lj)
23*59599516SKenneth E. Jansen for polynomial order p, note returned mode is of polynomial order p-2 */
24*59599516SKenneth E. Jansen if( p < 2 )
25*59599516SKenneth E. Jansen return 0.0;
26*59599516SKenneth E. Jansen else
27*59599516SKenneth E. Jansen return En(p-2,L[0],L[1]);
28*59599516SKenneth E. Jansen }
29*59599516SKenneth E. Jansen
F_modeShapeTri(int p,int i,double * L)30*59599516SKenneth E. Jansen double F_modeShapeTri(int p, int i, double *L) {
31*59599516SKenneth E. Jansen int alpha,beta,found,count,nskip;
32*59599516SKenneth E. Jansen /* return i-th triangular face mode of polynomial order p
33*59599516SKenneth E. Jansen note: there are p-2 modes with polynomial order p */
34*59599516SKenneth E. Jansen
35*59599516SKenneth E. Jansen if( p < 3 || i < 0 || i > p-3 )
36*59599516SKenneth E. Jansen return 0.0 ;
37*59599516SKenneth E. Jansen
38*59599516SKenneth E. Jansen count = found = 0;
39*59599516SKenneth E. Jansen for(alpha=0; alpha <= p-3; alpha++) {
40*59599516SKenneth E. Jansen for(beta=0; beta <= p-3; beta++) {
41*59599516SKenneth E. Jansen if( alpha+beta == p-3 ) {
42*59599516SKenneth E. Jansen if( count == i )
43*59599516SKenneth E. Jansen found=1;
44*59599516SKenneth E. Jansen else
45*59599516SKenneth E. Jansen count++;
46*59599516SKenneth E. Jansen }
47*59599516SKenneth E. Jansen if( found )
48*59599516SKenneth E. Jansen break;
49*59599516SKenneth E. Jansen }
50*59599516SKenneth E. Jansen if( found )
51*59599516SKenneth E. Jansen break;
52*59599516SKenneth E. Jansen }
53*59599516SKenneth E. Jansen if( found )
54*59599516SKenneth E. Jansen return Fn(alpha, beta, L[0], L[1]);
55*59599516SKenneth E. Jansen else
56*59599516SKenneth E. Jansen return 0.0;
57*59599516SKenneth E. Jansen }
58*59599516SKenneth E. Jansen
F_modeShapeQuad(int p,int i,double * L)59*59599516SKenneth E. Jansen double F_modeShapeQuad(int p, int i, double *L) {
60*59599516SKenneth E. Jansen /* return ith p-order quad face mode evaluated at L */
61*59599516SKenneth E. Jansen return 0.0;
62*59599516SKenneth E. Jansen }
63*59599516SKenneth E. Jansen
R_modeShapeTet(int p,int i,double * L)64*59599516SKenneth E. Jansen double R_modeShapeTet(int p, int i, double *L) {
65*59599516SKenneth E. Jansen int alpha,beta,gamma,count,found;
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansen /* return the i-th mode shape of polynomial order p for this region , there are
68*59599516SKenneth E. Jansen (p-2)*(p-3)/2 mode shapes of polynomial order p */
69*59599516SKenneth E. Jansen if( p < 4 || i < 0 || i > (((p-2)*(p-3)/2)-1) )
70*59599516SKenneth E. Jansen return 0.0;
71*59599516SKenneth E. Jansen
72*59599516SKenneth E. Jansen count = 0;
73*59599516SKenneth E. Jansen found = 0;
74*59599516SKenneth E. Jansen for( alpha=0; alpha <= p-4; alpha++) {
75*59599516SKenneth E. Jansen for( beta=0; beta <= p-4; beta++) {
76*59599516SKenneth E. Jansen for( gamma=0; gamma <= p-4; gamma++) {
77*59599516SKenneth E. Jansen if( alpha+beta+gamma == p-4 ) {
78*59599516SKenneth E. Jansen if( count == i )
79*59599516SKenneth E. Jansen found = 1;
80*59599516SKenneth E. Jansen else
81*59599516SKenneth E. Jansen count++;
82*59599516SKenneth E. Jansen }
83*59599516SKenneth E. Jansen if( found )
84*59599516SKenneth E. Jansen break ;
85*59599516SKenneth E. Jansen }
86*59599516SKenneth E. Jansen if( found )
87*59599516SKenneth E. Jansen break ;
88*59599516SKenneth E. Jansen }
89*59599516SKenneth E. Jansen if( found )
90*59599516SKenneth E. Jansen break ;
91*59599516SKenneth E. Jansen }
92*59599516SKenneth E. Jansen if( found )
93*59599516SKenneth E. Jansen return Bn(alpha,beta,gamma,L[0],L[1],L[2]);
94*59599516SKenneth E. Jansen else
95*59599516SKenneth E. Jansen return 0.0;
96*59599516SKenneth E. Jansen }
97*59599516SKenneth E. Jansen
R_modeShapeHex(int p,int i,double * L)98*59599516SKenneth E. Jansen double R_modeShapeHex(int p, int i, double *L) {
99*59599516SKenneth E. Jansen /* ith p-order mode shape for a hex element */
100*59599516SKenneth E. Jansen return 0.0;
101*59599516SKenneth E. Jansen }
102*59599516SKenneth E. Jansen
103*59599516SKenneth E. Jansen #ifdef __cplusplus
104*59599516SKenneth E. Jansen }
105*59599516SKenneth E. Jansen #endif
106*59599516SKenneth E. Jansen
107*59599516SKenneth E. Jansen
108*59599516SKenneth E. Jansen
109*59599516SKenneth E. Jansen
110*59599516SKenneth E. Jansen
111*59599516SKenneth E. Jansen
112