xref: /phasta/shapeFunction/src/modeShape.c (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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