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 evaluate derivatives of entity blend functions over other
11*59599516SKenneth E. Jansen entities.
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
V_blendOnEntityDrv(int index,int etype,double * L,double mdrv[3])21*59599516SKenneth E. Jansen int V_blendOnEntityDrv(int index, int etype, double *L, double mdrv[3]) {
22*59599516SKenneth E. Jansen /* derivative of blend a vertex mode on a mesh entity */
23*59599516SKenneth E. Jansen if( etype == Sedge ) {
24*59599516SKenneth E. Jansen if(index == 0) /* N = 0.5(1-zi) */
25*59599516SKenneth E. Jansen mdrv[0] = -0.5;
26*59599516SKenneth E. Jansen else /* N = 0.5(1+zi) */
27*59599516SKenneth E. Jansen mdrv[0] = +0.5;
28*59599516SKenneth E. Jansen return 1 ;
29*59599516SKenneth E. Jansen } else if( etype == Stri ) {
30*59599516SKenneth E. Jansen mdrv[0] = mdrv[1] = 0.0;
31*59599516SKenneth E. Jansen if( index == 2 )
32*59599516SKenneth E. Jansen mdrv[0] = mdrv[1] = -1.0;
33*59599516SKenneth E. Jansen else
34*59599516SKenneth E. Jansen mdrv[index] = 1.0;
35*59599516SKenneth E. Jansen return 1 ;
36*59599516SKenneth E. Jansen } else if ( etype == Stet ) {
37*59599516SKenneth E. Jansen mdrv[0] = mdrv[1] = mdrv[2] = 0.0;
38*59599516SKenneth E. Jansen if( index == 3 )
39*59599516SKenneth E. Jansen mdrv[0] = mdrv[1] = mdrv[2] = -1.0;
40*59599516SKenneth E. Jansen else
41*59599516SKenneth E. Jansen mdrv[index] = 1.0;
42*59599516SKenneth E. Jansen return 1;
43*59599516SKenneth E. Jansen } else
44*59599516SKenneth E. Jansen return 0;
45*59599516SKenneth E. Jansen }
46*59599516SKenneth E. Jansen
E_blendOnFaceDrv(int index[],int etype,double * L,double bdrv[2])47*59599516SKenneth E. Jansen int E_blendOnFaceDrv(int index[], int etype, double *L, double bdrv[2]) {
48*59599516SKenneth E. Jansen if( etype == Stri )
49*59599516SKenneth E. Jansen return F_edgeBlendTriDrv(index, L, bdrv);
50*59599516SKenneth E. Jansen else
51*59599516SKenneth E. Jansen return 0;
52*59599516SKenneth E. Jansen }
53*59599516SKenneth E. Jansen
F_edgeBlendTriDrv(int index[2],double * L,double drv[])54*59599516SKenneth E. Jansen int F_edgeBlendTriDrv(int index[2], double *L, double drv[]) {
55*59599516SKenneth E. Jansen double r,s;
56*59599516SKenneth E. Jansen
57*59599516SKenneth E. Jansen drv[0] = drv[1] = 0.0;
58*59599516SKenneth E. Jansen r = L[0] ; s = L[1] ;
59*59599516SKenneth E. Jansen
60*59599516SKenneth E. Jansen /* figure out which edge we are dealing with */
61*59599516SKenneth E. Jansen /* v0=0, V1=1 */
62*59599516SKenneth E. Jansen if( (index[0]==0 && index[1]==1) || (index[0]==1 && index[1]==0) ) {
63*59599516SKenneth E. Jansen drv[0] = -2.0*s;
64*59599516SKenneth E. Jansen drv[1] = -2.0*r;
65*59599516SKenneth E. Jansen /* v0=1, V1=2 */
66*59599516SKenneth E. Jansen } else if( (index[0]==1 && index[1]==2) || (index[0]==2 && index[1]==1) ) {
67*59599516SKenneth E. Jansen drv[0] = 2.0*s;
68*59599516SKenneth E. Jansen drv[1] = -2.0+2.0*r+4.0*s;
69*59599516SKenneth E. Jansen /* v0=2, V1=0 */
70*59599516SKenneth E. Jansen } else if( (index[0]==2 && index[1]==0) || (index[0]==0 && index[1]==2) ) {
71*59599516SKenneth E. Jansen drv[0] = 4.0*r-2.0+2.0*s;
72*59599516SKenneth E. Jansen drv[1] = 2.0*r;
73*59599516SKenneth E. Jansen } else
74*59599516SKenneth E. Jansen return 0;
75*59599516SKenneth E. Jansen
76*59599516SKenneth E. Jansen return 1 ;
77*59599516SKenneth E. Jansen }
78*59599516SKenneth E. Jansen
E_blendOnRegionDrv(int index[],int etype,double * L,double bdrv[3])79*59599516SKenneth E. Jansen int E_blendOnRegionDrv(int index[], int etype, double *L, double bdrv[3]) {
80*59599516SKenneth E. Jansen if( etype == 4 )
81*59599516SKenneth E. Jansen return R_edgeBlendTetDrv(index, L, bdrv);
82*59599516SKenneth E. Jansen else
83*59599516SKenneth E. Jansen return 0;
84*59599516SKenneth E. Jansen }
85*59599516SKenneth E. Jansen
F_blendOnRegionDrv(int index[],int etype,double * L,double drv[3])86*59599516SKenneth E. Jansen int F_blendOnRegionDrv(int index[], int etype, double *L, double drv[3]) {
87*59599516SKenneth E. Jansen /* blend a face mode on a region */
88*59599516SKenneth E. Jansen drv[0] = drv[1] = drv[2] = 0.0;
89*59599516SKenneth E. Jansen if(etype==Stet )
90*59599516SKenneth E. Jansen return 1;
91*59599516SKenneth E. Jansen else
92*59599516SKenneth E. Jansen return 0;
93*59599516SKenneth E. Jansen }
94*59599516SKenneth E. Jansen
R_edgeBlendTetDrv(int * index,double * L,double drv[])95*59599516SKenneth E. Jansen int R_edgeBlendTetDrv(int *index, double *L, double drv[]) {
96*59599516SKenneth E. Jansen double r=L[0],s=L[1],t=L[2];
97*59599516SKenneth E. Jansen
98*59599516SKenneth E. Jansen /* the blend is given by -2*L[i]*L[j] */
99*59599516SKenneth E. Jansen /* v0=0, V1=1 */
100*59599516SKenneth E. Jansen if( (index[0]==0 && index[1]==1) || (index[0]==1 && index[1]==0) ) {
101*59599516SKenneth E. Jansen drv[0] = -2.0*s;
102*59599516SKenneth E. Jansen drv[1] = -2.0*r;
103*59599516SKenneth E. Jansen drv[2] = 0.0;
104*59599516SKenneth E. Jansen /* v0=0, V1=3 */
105*59599516SKenneth E. Jansen } else if( (index[0]==0 && index[1]==3) || (index[0]==3 && index[1]==0) ) {
106*59599516SKenneth E. Jansen drv[0] = -2.0+4.0*r+2.0*s+2.0*t;
107*59599516SKenneth E. Jansen drv[1] = 2.0*r;
108*59599516SKenneth E. Jansen drv[2] = 2.0*r;
109*59599516SKenneth E. Jansen /* v0=1, V1=2 */
110*59599516SKenneth E. Jansen } else if( (index[0]==1 && index[1]==2) || (index[0]==2 && index[1]==1) ) {
111*59599516SKenneth E. Jansen drv[0] = 0.0;
112*59599516SKenneth E. Jansen drv[1] = -2.0*t;
113*59599516SKenneth E. Jansen drv[2] = -2.0*s;
114*59599516SKenneth E. Jansen /* v0=1, V1=3 */
115*59599516SKenneth E. Jansen } else if( (index[0]==1 && index[1]==3) || (index[0]==3 && index[1]==1) ) {
116*59599516SKenneth E. Jansen drv[0] = 2.0*s;
117*59599516SKenneth E. Jansen drv[1] = -2.0+2.0*r+4.0*s+2.0*t;
118*59599516SKenneth E. Jansen drv[2] = 2.0*s;
119*59599516SKenneth E. Jansen /* v0=2, V1=0 */
120*59599516SKenneth E. Jansen } else if( (index[0]==2 && index[1]==0) || (index[0]==0 && index[1]==2) ) {
121*59599516SKenneth E. Jansen drv[0] = -2.0*t;
122*59599516SKenneth E. Jansen drv[1] = 0.0;
123*59599516SKenneth E. Jansen drv[2] = -2.0*r;
124*59599516SKenneth E. Jansen /* v0=2, V1=3 */
125*59599516SKenneth E. Jansen } else if( (index[0]==2 && index[1]==3) || (index[0]==3 && index[1]==2) ) {
126*59599516SKenneth E. Jansen drv[0] = 2.0*t;
127*59599516SKenneth E. Jansen drv[1] = 2.0*t;
128*59599516SKenneth E. Jansen drv[2] = -2.0+2.0*r+2.0*s+4.0*t;
129*59599516SKenneth E. Jansen } else
130*59599516SKenneth E. Jansen return 0;
131*59599516SKenneth E. Jansen
132*59599516SKenneth E. Jansen return 1;
133*59599516SKenneth E. Jansen }
134*59599516SKenneth E. Jansen
R_faceBlendTetDrv(int * index,double * L,double drv[])135*59599516SKenneth E. Jansen int R_faceBlendTetDrv(int *index, double *L, double drv[]) {
136*59599516SKenneth E. Jansen int isum = index[0]+index[1]+index[2];
137*59599516SKenneth E. Jansen
138*59599516SKenneth E. Jansen drv[0]=drv[1]=drv[2]=0;
139*59599516SKenneth E. Jansen if( isum == 3) /* r*s*t */ {
140*59599516SKenneth E. Jansen drv[0] = L[1]*L[2] ;
141*59599516SKenneth E. Jansen drv[1] = L[0]*L[2] ;
142*59599516SKenneth E. Jansen drv[2] = L[1]*L[0] ;
143*59599516SKenneth E. Jansen } else if( isum == 5) /* r*t*(1-r-s-t) */ {
144*59599516SKenneth E. Jansen drv[0] = L[2]*(1.0-2.0*L[0]-L[1]-L[2]);
145*59599516SKenneth E. Jansen drv[1] = -L[0]*L[2] ;
146*59599516SKenneth E. Jansen drv[2] = L[0]*(1.0-L[0]-L[1]-2.0*L[2]);
147*59599516SKenneth E. Jansen } else if( isum == 4) /* r*s*(1-r-s-t) */ {
148*59599516SKenneth E. Jansen drv[0] = L[1]*(1.0-2.0*L[0]-L[1]-L[2]);
149*59599516SKenneth E. Jansen drv[1] = L[0]*(1.0-L[0]-2.0*L[1]-L[2]);
150*59599516SKenneth E. Jansen drv[2] = -L[0]*L[1] ;
151*59599516SKenneth E. Jansen } else if( isum == 6) /* s*t*(1-r-s-t) */ {
152*59599516SKenneth E. Jansen drv[0] = -L[1]*L[2] ;
153*59599516SKenneth E. Jansen drv[1] = L[2]*(1.0-L[0]-2.0*L[1]-L[2]);
154*59599516SKenneth E. Jansen drv[2] = L[1]*(1.0-L[0]-L[1]-2.0*L[2]);
155*59599516SKenneth E. Jansen } else
156*59599516SKenneth E. Jansen return 0;
157*59599516SKenneth E. Jansen return 1;
158*59599516SKenneth E. Jansen }
159*59599516SKenneth E. Jansen #ifdef __cplusplus
160*59599516SKenneth E. Jansen }
161*59599516SKenneth E. Jansen #endif
162