xref: /phasta/phSolver/incompressible/e3stab.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine e3stab (rho,          u1,       u2,
2*59599516SKenneth E. Jansen     &                   u3,           dxidx,    rLui,
3*59599516SKenneth E. Jansen     &                   rmu,          tauC,     tauM,
4*59599516SKenneth E. Jansen     &                   tauBar,       uBar )
5*59599516SKenneth E. Jansenc
6*59599516SKenneth E. Jansenc----------------------------------------------------------------------
7*59599516SKenneth E. Jansenc
8*59599516SKenneth E. Jansenc This routine computes the diagonal Tau for least-squares operator.
9*59599516SKenneth E. Jansenc Diagonal tau proposed by Shakib.
10*59599516SKenneth E. Jansenc
11*59599516SKenneth E. Jansenc input:
12*59599516SKenneth E. Jansenc  u1     (npro)           : x1-velocity component
13*59599516SKenneth E. Jansenc  u2     (npro)           : x2-velocity component
14*59599516SKenneth E. Jansenc  u3     (npro)           : x3-velocity component
15*59599516SKenneth E. Jansenc  dxidx  (npro,nsd,nsd)   : inverse of deformation gradient
16*59599516SKenneth E. Jansenc  rLui   (npro,nsd)      : least-squares residual vector
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansenc output:
19*59599516SKenneth E. Jansenc  tauC    (npro)          : continuity tau
20*59599516SKenneth E. Jansenc  tauM    (npro)          : momentum tau
21*59599516SKenneth E. Jansenc  tauBar  (npro)          : additional tau
22*59599516SKenneth E. Jansenc  uBar    (npro,nsd)      : modified velocity
23*59599516SKenneth E. Jansenc
24*59599516SKenneth E. Jansenc Zdenek Johan, Summer 1990.  (Modified from e2tau.f)
25*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.  (Fortran 90)
26*59599516SKenneth E. Jansenc----------------------------------------------------------------------
27*59599516SKenneth E. Jansenc
28*59599516SKenneth E. Jansen        include "common.h"
29*59599516SKenneth E. Jansenc
30*59599516SKenneth E. Jansen        dimension rho(npro),                 u1(npro),
31*59599516SKenneth E. Jansen     &            u2(npro),                  u3(npro),
32*59599516SKenneth E. Jansen     &            dxidx(npro,nsd,nsd),
33*59599516SKenneth E. Jansen     &            rLui(npro,nsd),
34*59599516SKenneth E. Jansen     &            tauC(npro),    tauM(npro), tauBar(npro),
35*59599516SKenneth E. Jansen     &            rmu(npro),     uBar(npro,3), unorm(npro)
36*59599516SKenneth E. Jansen
37*59599516SKenneth E. Jansenc
38*59599516SKenneth E. Jansen        dimension gijd(npro,6),       fact(npro), rnu(npro),
39*59599516SKenneth E. Jansen     &       rhoinv(npro)
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansenc
42*59599516SKenneth E. Jansenc.... get the metric tensor
43*59599516SKenneth E. Jansenc
44*59599516SKenneth E. Jansen      call e3gijd( dxidx, gijd )
45*59599516SKenneth E. Jansenc
46*59599516SKenneth E. Jansenc... higher order element diffusive correction
47*59599516SKenneth E. Jansenc
48*59599516SKenneth E. Jansen      if (ipord == 1) then
49*59599516SKenneth E. Jansen         fff = 36.0d0
50*59599516SKenneth E. Jansen      else if (ipord == 2) then
51*59599516SKenneth E. Jansen         fff = 60.0d0
52*59599516SKenneth E. Jansenc     fff = 36.0d0
53*59599516SKenneth E. Jansen      else if (ipord == 3) then
54*59599516SKenneth E. Jansen         fff = 128.0d0
55*59599516SKenneth E. Jansenc     fff = 144.0d0
56*59599516SKenneth E. Jansen      endif
57*59599516SKenneth E. Jansen
58*59599516SKenneth E. Jansen      omegasq=zero
59*59599516SKenneth E. Jansen      if(matflg(6,1).eq.1) omegasq = datmat(1,6,1)**2
60*59599516SKenneth E. Jansen     .                              +datmat(2,6,1)**2
61*59599516SKenneth E. Jansen     .                              +datmat(3,6,1)**2
62*59599516SKenneth E. Jansen      rhoinv=one/rho
63*59599516SKenneth E. Jansen      rnu=rmu*rhoinv
64*59599516SKenneth E. Jansen
65*59599516SKenneth E. Jansen      if(itau.eq.0)  then  ! original tau
66*59599516SKenneth E. Jansenc
67*59599516SKenneth E. Jansenc...  momentum tau
68*59599516SKenneth E. Jansenc
69*59599516SKenneth E. Jansen
70*59599516SKenneth E. Jansen!MR CHANGE
71*59599516SKenneth E. Jansen         dts=  Dtgl*dtsfct ! Dtgl = (time step)^-1
72*59599516SKenneth E. Jansen!         dts=  min(Dtgl,28800.0d0)*dtsfct      ! Dtgl = (time step)^-1 !28800 = 1600*180 / 10
73*59599516SKenneth E. Jansen!         dts=  min(Dtgl,2880.0d0)*dtsfct      ! Dtgl = (time step)^-1 !2880 = 1600*180 / 100
74*59599516SKenneth E. Jansen!         dts=  min(Dtgl,288.0d0)*dtsfct      ! Dtgl = (time step)^-1 !288 = 1600*180 / 1000
75*59599516SKenneth E. Jansen!MR CHANGE
76*59599516SKenneth E. Jansen
77*59599516SKenneth E. Jansen         tauM = ( (two*dts)**2
78*59599516SKenneth E. Jansen     3        + ( u1 * ( gijd(:,1) * u1
79*59599516SKenneth E. Jansen     4                       + gijd(:,4) * u2
80*59599516SKenneth E. Jansen     5                       + gijd(:,6) * u3 )
81*59599516SKenneth E. Jansen     6          + u2 * ( gijd(:,4) * u1
82*59599516SKenneth E. Jansen     7                       + gijd(:,2) * u2
83*59599516SKenneth E. Jansen     8			             + gijd(:,5) * u3 )
84*59599516SKenneth E. Jansen     9		        + u3 * ( gijd(:,6) * u1
85*59599516SKenneth E. Jansen     a			             + gijd(:,5) * u2
86*59599516SKenneth E. Jansen     1			             + gijd(:,3) * u3 ) ) )
87*59599516SKenneth E. Jansen     2		    + fff * rnu** 2
88*59599516SKenneth E. Jansen     3		    * ( gijd(:,1) ** 2
89*59599516SKenneth E. Jansen     4		      + gijd(:,2) ** 2
90*59599516SKenneth E. Jansen     5		      + gijd(:,3) ** 2
91*59599516SKenneth E. Jansen     6		      + 2.
92*59599516SKenneth E. Jansen     7		      * ( gijd(:,4) ** 2
93*59599516SKenneth E. Jansen     8		        + gijd(:,5) ** 2
94*59599516SKenneth E. Jansen     9		        + gijd(:,6) ** 2 )
95*59599516SKenneth E. Jansen     b              +omegasq)
96*59599516SKenneth E. Jansen
97*59599516SKenneth E. Jansen         fact = sqrt(tauM)
98*59599516SKenneth E. Jansen         dtsi=one/dts
99*59599516SKenneth E. Jansen         ff=taucfct/dtsfct
100*59599516SKenneth E. Jansen         tauC =rho* pt125*fact/(gijd(:,1)+gijd(:,2)+gijd(:,3))*ff
101*59599516SKenneth E. Jansen         tauM = one/fact
102*59599516SKenneth E. Jansen      else if(itau.eq.1)  then  ! new tau
103*59599516SKenneth E. Jansen
104*59599516SKenneth E. Jansenc
105*59599516SKenneth E. Jansenc  determinant of gijd
106*59599516SKenneth E. Jansenc
107*59599516SKenneth E. Jansen         fact = gijd(:,1) * gijd(:,2) * gijd(:,3)
108*59599516SKenneth E. Jansen     &        - gijd(:,2) * gijd(:,6) * gijd(:,6)
109*59599516SKenneth E. Jansen     &        - gijd(:,1) * gijd(:,5) * gijd(:,5)
110*59599516SKenneth E. Jansen     &        - gijd(:,3) * gijd(:,4) * gijd(:,4)
111*59599516SKenneth E. Jansen     &        + gijd(:,6) * gijd(:,4) * gijd(:,5) * two
112*59599516SKenneth E. Jansen
113*59599516SKenneth E. Jansenc
114*59599516SKenneth E. Jansenc put 1/2u*h1 = sqrt(u_i g^{ij} u_j) into tau_M  note inverse is calculated
115*59599516SKenneth E. Jansenc on the fly here from cofactors over the determinent dotted from left and
116*59599516SKenneth E. Jansenc right with u
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansen
119*59599516SKenneth E. Jansen         tauM =
120*59599516SKenneth E. Jansen     1       u1 * ( (gijd(:,2)*gijd(:,3)-gijd(:,5)*gijd(:,5))  * u1
121*59599516SKenneth E. Jansen     2     +  two * (gijd(:,5)*gijd(:,6)-gijd(:,4)*gijd(:,3))  * u2
122*59599516SKenneth E. Jansen     3     +  two * (gijd(:,4)*gijd(:,5)-gijd(:,6)*gijd(:,2))  * u3)
123*59599516SKenneth E. Jansen     1     + u2 * ( (gijd(:,1)*gijd(:,3)-gijd(:,6)*gijd(:,6))  * u2
124*59599516SKenneth E. Jansen     3     +  two * (gijd(:,4)*gijd(:,6)-gijd(:,1)*gijd(:,5))  * u3)
125*59599516SKenneth E. Jansen     1     + u3 * ( (gijd(:,1)*gijd(:,2)-gijd(:,4)*gijd(:,4))  * u3)
126*59599516SKenneth E. Jansen         tauM=fact/taum  ! here we have (u_i g^{ij} u^j)^{-1} approx 4/u^2h^2
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansenc  we can calculate tauC more efficiently now
129*59599516SKenneth E. Jansenc
130*59599516SKenneth E. Jansen         tauC=tauM*(one+tauM*rmu*rmu)
131*59599516SKenneth E. Jansen         tauC=one/tauC
132*59599516SKenneth E. Jansen         tauC=taucfct*sqrt(tauC)
133*59599516SKenneth E. Jansenc
134*59599516SKenneth E. Jansenc
135*59599516SKenneth E. Jansenc...  momentum tau
136*59599516SKenneth E. Jansenc
137*59599516SKenneth E. Jansenc
138*59599516SKenneth E. Jansenc     this tau needs a u/h instead of a u*h so we contract with g_{ij} as
139*59599516SKenneth E. Jansenc     follows  (i.e. u_i g_{ij} u_j approx u^2/(h^2)/4)
140*59599516SKenneth E. Jansenc
141*59599516SKenneth E. Jansen         fact =
142*59599516SKenneth E. Jansen     3          u1 * ( gijd(:,1) * u1
143*59599516SKenneth E. Jansen     4               + gijd(:,4) * u2
144*59599516SKenneth E. Jansen     5               + gijd(:,6) * u3 )
145*59599516SKenneth E. Jansen     6        + u2 * ( gijd(:,4) * u1
146*59599516SKenneth E. Jansen     7               + gijd(:,2) * u2
147*59599516SKenneth E. Jansen     8               + gijd(:,5) * u3 )
148*59599516SKenneth E. Jansen     9        + u3 * ( gijd(:,6) * u1
149*59599516SKenneth E. Jansen     a               + gijd(:,5) * u2
150*59599516SKenneth E. Jansen     1               + gijd(:,3) * u3 )
151*59599516SKenneth E. Jansenc
152*59599516SKenneth E. Jansenc first limit dt effect on tau from causing trouble if user drops CFL below
153*59599516SKenneth E. Jansenc .05 (this could cause loss of spatial stability)
154*59599516SKenneth E. Jansenc
155*59599516SKenneth E. Jansen         velsq=vel*vel
156*59599516SKenneth E. Jansen         unorm = (u1*u1+u2*u2+u3*u3)/velsq
157*59599516SKenneth E. Jansen         dtsfsq=dtsfct*dtsfct
158*59599516SKenneth E. Jansen         dt=one/Dtgl
159*59599516SKenneth E. Jansen         taubar=  dtsfsq/( dt*dt + .01*unorm/fact)  ! never gets above (C_1 20*u_inf/h)^2
160*59599516SKenneth E. Jansenc
161*59599516SKenneth E. Jansenc  this means tau will never get below h/(20*C_1*u) no matter what time step
162*59599516SKenneth E. Jansenc  you choose.  The 0.01 constant comes from minCFL=.05=> .05*.05*4 (where the
163*59599516SKenneth E. Jansenc  4 comes from the bi-unit mapping). If you want to limit sooner the formula
164*59599516SKenneth E. Jansenc  would be  ".01-factor"=minCFL^2*4
165*59599516SKenneth E. Jansenc
166*59599516SKenneth E. Jansen
167*59599516SKenneth E. Jansen         tauM = rho ** 2
168*59599516SKenneth E. Jansen     1		    * ( four*taubar + fact
169*59599516SKenneth E. Jansen     2		    + fff * rmu** 2
170*59599516SKenneth E. Jansen     3		    * ( gijd(:,1) ** 2
171*59599516SKenneth E. Jansen     4		      + gijd(:,2) ** 2
172*59599516SKenneth E. Jansen     5		      + gijd(:,3) ** 2
173*59599516SKenneth E. Jansen     6		      + 2.
174*59599516SKenneth E. Jansen     7		      * ( gijd(:,4) ** 2
175*59599516SKenneth E. Jansen     8		        + gijd(:,5) ** 2
176*59599516SKenneth E. Jansen     9		        + gijd(:,6) ** 2 ) )
177*59599516SKenneth E. Jansen     b              +omegasq)
178*59599516SKenneth E. Jansen         fact=sqrt(tauM)
179*59599516SKenneth E. Jansencdebugcheck         tauBar = pt125*fact/(gijd(:,1)+gijd(:,2)+gijd(:,3)) !*dtsi
180*59599516SKenneth E. Jansen
181*59599516SKenneth E. Jansen        tauM=one/fact           ! turn it right side up.
182*59599516SKenneth E. Jansen      else if(itau.eq.2)  then  ! new tau different continuity h
183*59599516SKenneth E. Jansen
184*59599516SKenneth E. Jansen         unorm = (u1*u1+u2*u2+u3*u3)
185*59599516SKenneth E. Jansen
186*59599516SKenneth E. Jansen         tauM=(gijd(:,1)+gijd(:,2)+gijd(:,3))/unorm ! here we have  4/u^2h^2
187*59599516SKenneth E. Jansenc
188*59599516SKenneth E. Jansenc  we can calculate tauC more efficiently now
189*59599516SKenneth E. Jansenc
190*59599516SKenneth E. Jansen         tauC=tauM*(one+tauM*rmu*rmu)
191*59599516SKenneth E. Jansen         tauC=one/tauC
192*59599516SKenneth E. Jansen         tauC=sqrt(tauC)*taucfct
193*59599516SKenneth E. Jansenc
194*59599516SKenneth E. Jansenc
195*59599516SKenneth E. Jansenc...  momentum tau
196*59599516SKenneth E. Jansenc
197*59599516SKenneth E. Jansenc
198*59599516SKenneth E. Jansenc     this tau needs a u/h instead of a u*h so we contract with g_{ij} as
199*59599516SKenneth E. Jansenc     follows  (i.e. u_i g_{ij} u_j approx u^2/(h^2)/4)
200*59599516SKenneth E. Jansenc
201*59599516SKenneth E. Jansen         fact =
202*59599516SKenneth E. Jansen     3          u1 * ( gijd(:,1) * u1
203*59599516SKenneth E. Jansen     4               + gijd(:,4) * u2
204*59599516SKenneth E. Jansen     5               + gijd(:,6) * u3 )
205*59599516SKenneth E. Jansen     6        + u2 * ( gijd(:,4) * u1
206*59599516SKenneth E. Jansen     7               + gijd(:,2) * u2
207*59599516SKenneth E. Jansen     8               + gijd(:,5) * u3 )
208*59599516SKenneth E. Jansen     9        + u3 * ( gijd(:,6) * u1
209*59599516SKenneth E. Jansen     a               + gijd(:,5) * u2
210*59599516SKenneth E. Jansen     1               + gijd(:,3) * u3 )
211*59599516SKenneth E. Jansenc
212*59599516SKenneth E. Jansenc first limit dt effect on tau from causing trouble if user drops CFL below
213*59599516SKenneth E. Jansenc .05 (this could cause loss of spatial stability)
214*59599516SKenneth E. Jansenc
215*59599516SKenneth E. Jansen         velsq=vel*vel
216*59599516SKenneth E. Jansen         dtsfsq=dtsfct*dtsfct
217*59599516SKenneth E. Jansen         dt=one/Dtgl
218*59599516SKenneth E. Jansen         unorm=unorm/velsq
219*59599516SKenneth E. Jansen         taubar=  dtsfsq/( dt*dt + .01*unorm/fact)  ! never gets above (C_1 20*u_inf/h)^2
220*59599516SKenneth E. Jansenc
221*59599516SKenneth E. Jansenc  this means tau will never get below h/(20*C_1*u) no matter what time step
222*59599516SKenneth E. Jansenc  you choose.  The 0.01 constant comes from minCFL=.05=> .05*.05*4 (where the
223*59599516SKenneth E. Jansenc  4 comes from the bi-unit mapping). If you want to limit sooner the formula
224*59599516SKenneth E. Jansenc  would be  ".01-factor"=minCFL^2*4
225*59599516SKenneth E. Jansenc
226*59599516SKenneth E. Jansen
227*59599516SKenneth E. Jansen         tauM = rho ** 2
228*59599516SKenneth E. Jansen     1		    * ( four*taubar + fact
229*59599516SKenneth E. Jansen     2		    + fff * rmu** 2
230*59599516SKenneth E. Jansen     3		    * ( gijd(:,1) ** 2
231*59599516SKenneth E. Jansen     4		      + gijd(:,2) ** 2
232*59599516SKenneth E. Jansen     5		      + gijd(:,3) ** 2
233*59599516SKenneth E. Jansen     6		      + 2.
234*59599516SKenneth E. Jansen     7		      * ( gijd(:,4) ** 2
235*59599516SKenneth E. Jansen     8		        + gijd(:,5) ** 2
236*59599516SKenneth E. Jansen     9		        + gijd(:,6) ** 2 ) )
237*59599516SKenneth E. Jansen     b              +omegasq)
238*59599516SKenneth E. Jansen         fact=sqrt(tauM)
239*59599516SKenneth E. Jansenc         tauBar = pt125*fact/(gijd(:,1)+gijd(:,2)+gijd(:,3)) !*dtsi
240*59599516SKenneth E. Jansen
241*59599516SKenneth E. Jansen        tauM=one/fact           ! turn it right side up.
242*59599516SKenneth E. Jansen      else if(itau.eq.3)  then  ! compressible tau
243*59599516SKenneth E. Jansen
244*59599516SKenneth E. Jansenc
245*59599516SKenneth E. Jansenc  determinant of gijd
246*59599516SKenneth E. Jansenc
247*59599516SKenneth E. Jansen         fact = gijd(:,1) * gijd(:,2) * gijd(:,3)
248*59599516SKenneth E. Jansen     &        - gijd(:,2) * gijd(:,6) * gijd(:,6)
249*59599516SKenneth E. Jansen     &        - gijd(:,1) * gijd(:,5) * gijd(:,5)
250*59599516SKenneth E. Jansen     &        - gijd(:,3) * gijd(:,4) * gijd(:,4)
251*59599516SKenneth E. Jansen     &        + gijd(:,6) * gijd(:,4) * gijd(:,5) * two
252*59599516SKenneth E. Jansen
253*59599516SKenneth E. Jansenc
254*59599516SKenneth E. Jansenc put 1/2u*h1 = sqrt(u_i g^{ij} u_j) into tau_M  note inverse is calculated
255*59599516SKenneth E. Jansenc on the fly here from cofactors over the determinent dotted from left and
256*59599516SKenneth E. Jansenc right with u
257*59599516SKenneth E. Jansenc
258*59599516SKenneth E. Jansen
259*59599516SKenneth E. Jansen         tauM =
260*59599516SKenneth E. Jansen     1       u1 * ( (gijd(:,2)*gijd(:,3)-gijd(:,5)*gijd(:,5))  * u1
261*59599516SKenneth E. Jansen     2     +  two * (gijd(:,5)*gijd(:,6)-gijd(:,4)*gijd(:,3))  * u2
262*59599516SKenneth E. Jansen     3     +  two * (gijd(:,4)*gijd(:,5)-gijd(:,6)*gijd(:,2))  * u3)
263*59599516SKenneth E. Jansen     1     + u2 * ( (gijd(:,1)*gijd(:,3)-gijd(:,6)*gijd(:,6))  * u2
264*59599516SKenneth E. Jansen     3     +  two * (gijd(:,4)*gijd(:,6)-gijd(:,1)*gijd(:,5))  * u3)
265*59599516SKenneth E. Jansen     1     + u3 * ( (gijd(:,1)*gijd(:,2)-gijd(:,4)*gijd(:,4))  * u3)
266*59599516SKenneth E. Jansenc
267*59599516SKenneth E. Jansenc  we can calculate tauC more efficiently now
268*59599516SKenneth E. Jansenc
269*59599516SKenneth E. Jansen         tauM=sqrt(tauM/fact)*two
270*59599516SKenneth E. Jansen         tauC=pt5*tauM*min(one,pt5*tauM/rmu)*taucfct
271*59599516SKenneth E. Jansenc
272*59599516SKenneth E. Jansenc
273*59599516SKenneth E. Jansenc...  momentum tau
274*59599516SKenneth E. Jansenc
275*59599516SKenneth E. Jansenc
276*59599516SKenneth E. Jansenc     this tau needs a u/h instead of a u*h so we contract with g_{ij} as
277*59599516SKenneth E. Jansenc     follows  (i.e. u_i g_{ij} u_j approx u^2/(h^2)/4)
278*59599516SKenneth E. Jansenc
279*59599516SKenneth E. Jansen         fact =
280*59599516SKenneth E. Jansen     3          u1 * ( gijd(:,1) * u1
281*59599516SKenneth E. Jansen     4               + gijd(:,4) * u2
282*59599516SKenneth E. Jansen     5               + gijd(:,6) * u3 )
283*59599516SKenneth E. Jansen     6        + u2 * ( gijd(:,4) * u1
284*59599516SKenneth E. Jansen     7               + gijd(:,2) * u2
285*59599516SKenneth E. Jansen     8               + gijd(:,5) * u3 )
286*59599516SKenneth E. Jansen     9        + u3 * ( gijd(:,6) * u1
287*59599516SKenneth E. Jansen     a               + gijd(:,5) * u2
288*59599516SKenneth E. Jansen     1               + gijd(:,3) * u3 )
289*59599516SKenneth E. Jansen         fact=one/sqrt(fact)
290*59599516SKenneth E. Jansen
291*59599516SKenneth E. Jansen         unorm = (u1*u1+u2*u2+u3*u3)
292*59599516SKenneth E. Jansen
293*59599516SKenneth E. Jansen         dts= one/( Dtgl*dtsfct)
294*59599516SKenneth E. Jansen         tauM =min(dts,min(fact,fact*fact*unorm*pt33/rmu))
295*59599516SKenneth E. Jansen      endif
296*59599516SKenneth E. Jansenc
297*59599516SKenneth E. Jansenc.... calculate tauBar
298*59599516SKenneth E. Jansenc
299*59599516SKenneth E. Jansen      tauBar = rLui(:,1) * ( gijd(:,1) * rLui(:,1)
300*59599516SKenneth E. Jansen     &                       + gijd(:,4) * rLui(:,2)
301*59599516SKenneth E. Jansen     &                       + gijd(:,6) * rLui(:,3) )
302*59599516SKenneth E. Jansen     &         + rLui(:,2) * ( gijd(:,4) * rLui(:,1)
303*59599516SKenneth E. Jansen     &                       + gijd(:,2) * rLui(:,2)
304*59599516SKenneth E. Jansen     &                       + gijd(:,5) * rLui(:,3) )
305*59599516SKenneth E. Jansen     &         + rLui(:,3) * ( gijd(:,6) * rLui(:,1)
306*59599516SKenneth E. Jansen     &                       + gijd(:,5) * rLui(:,2)
307*59599516SKenneth E. Jansen     &                       + gijd(:,3) * rLui(:,3) )
308*59599516SKenneth E. Jansen      where ( tauBar .ne. 0.0 )
309*59599516SKenneth E. Jansen         tauBar = tauM / sqrt(tauBar)
310*59599516SKenneth E. Jansen      endwhere
311*59599516SKenneth E. Jansen
312*59599516SKenneth E. Jansenc
313*59599516SKenneth E. Jansenc.... compute the modified velocity, uBar
314*59599516SKenneth E. Jansenc
315*59599516SKenneth E. Jansen        uBar(:,1) = u1 - tauM * rLui(:,1)*rhoinv
316*59599516SKenneth E. Jansen        uBar(:,2) = u2 - tauM * rLui(:,2)*rhoinv
317*59599516SKenneth E. Jansen        uBar(:,3) = u3 - tauM * rLui(:,3)*rhoinv
318*59599516SKenneth E. Jansenc
319*59599516SKenneth E. Jansenc.... return
320*59599516SKenneth E. Jansenc
321*59599516SKenneth E. Jansen        return
322*59599516SKenneth E. Jansen        end
323*59599516SKenneth E. Jansen
324*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
325*59599516SKenneth E. Jansenc
326*59599516SKenneth E. Jansenc  Momentum tau
327*59599516SKenneth E. Jansenc
328*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
329*59599516SKenneth E. Jansen      subroutine e3uBar (rho,          ui,         dxidx,
330*59599516SKenneth E. Jansen     &                   rLui,         rmu,        uBar )
331*59599516SKenneth E. Jansen
332*59599516SKenneth E. Jansen      include "common.h"
333*59599516SKenneth E. Jansen
334*59599516SKenneth E. Jansen      real*8     rho(npro),            ui(npro,nsd),
335*59599516SKenneth E. Jansen     &           dxidx(npro,nsd,nsd),  rLui(npro,nsd),
336*59599516SKenneth E. Jansen     &           rmu(npro),            uBar(npro,nsd)
337*59599516SKenneth E. Jansen
338*59599516SKenneth E. Jansen      real*8     gijd(npro,6),         tauM(npro)
339*59599516SKenneth E. Jansen
340*59599516SKenneth E. Jansenc
341*59599516SKenneth E. Jansenc.... get the metric tensor
342*59599516SKenneth E. Jansenc
343*59599516SKenneth E. Jansen      call e3gijd( dxidx, gijd )
344*59599516SKenneth E. Jansenc
345*59599516SKenneth E. Jansenc.... higher order element diffusive correction
346*59599516SKenneth E. Jansenc
347*59599516SKenneth E. Jansen      if (ipord == 1) then
348*59599516SKenneth E. Jansen         fff = 36.0d0
349*59599516SKenneth E. Jansen      else if (ipord == 2) then
350*59599516SKenneth E. Jansen         fff = 60.0d0
351*59599516SKenneth E. Jansen      else if (ipord == 3) then
352*59599516SKenneth E. Jansen         fff = 128.0d0
353*59599516SKenneth E. Jansen      endif
354*59599516SKenneth E. Jansen
355*59599516SKenneth E. Jansen!MR CHANGE
356*59599516SKenneth E. Jansen      dts  =  (Dtgl*dtsfct)
357*59599516SKenneth E. Jansen!      dts=  min(Dtgl,28800.0d0)*dtsfct      !28800 = 1600*180 / 10
358*59599516SKenneth E. Jansen!      dts=  min(Dtgl,2880.0d0)*dtsfct      !2880 = 1600*180 / 100
359*59599516SKenneth E. Jansen!      dts=  min(Dtgl,288.0d0)*dtsfct        !288 = 1600*180 / 1000
360*59599516SKenneth E. Jansen!MR CHANGE
361*59599516SKenneth E. Jansen
362*59599516SKenneth E. Jansen      tauM = rho ** 2
363*59599516SKenneth E. Jansen     1              * ( (two*dts)**2
364*59599516SKenneth E. Jansen     3                + ( ui(:,1) * ( gijd(:,1) * ui(:,1)
365*59599516SKenneth E. Jansen     4                              + gijd(:,4) * ui(:,2)
366*59599516SKenneth E. Jansen     5                              + gijd(:,6) * ui(:,3) )
367*59599516SKenneth E. Jansen     6                  + ui(:,2) * ( gijd(:,4) * ui(:,1)
368*59599516SKenneth E. Jansen     7			            + gijd(:,2) * ui(:,2)
369*59599516SKenneth E. Jansen     8			            + gijd(:,5) * ui(:,3) )
370*59599516SKenneth E. Jansen     9		        + ui(:,3) * ( gijd(:,6) * ui(:,1)
371*59599516SKenneth E. Jansen     a			            + gijd(:,5) * ui(:,2)
372*59599516SKenneth E. Jansen     1			            + gijd(:,3) * ui(:,3) ) ) )
373*59599516SKenneth E. Jansen     2		    + fff * rmu** 2
374*59599516SKenneth E. Jansen     3		    * ( gijd(:,1) ** 2
375*59599516SKenneth E. Jansen     4		      + gijd(:,2) ** 2
376*59599516SKenneth E. Jansen     5		      + gijd(:,3) ** 2
377*59599516SKenneth E. Jansen     6		      + 2.
378*59599516SKenneth E. Jansen     7		      * ( gijd(:,4) ** 2
379*59599516SKenneth E. Jansen     8		        + gijd(:,5) ** 2
380*59599516SKenneth E. Jansen     9		        + gijd(:,6) ** 2 ) )
381*59599516SKenneth E. Jansen
382*59599516SKenneth E. Jansen      tauM = one/sqrt(tauM)
383*59599516SKenneth E. Jansenc
384*59599516SKenneth E. Jansenc.... compute the modified velocity, uBar
385*59599516SKenneth E. Jansenc
386*59599516SKenneth E. Jansen      uBar(:,1) = ui(:,1) - tauM * rLui(:,1)
387*59599516SKenneth E. Jansen      uBar(:,2) = ui(:,2) - tauM * rLui(:,2)
388*59599516SKenneth E. Jansen      uBar(:,3) = ui(:,3) - tauM * rLui(:,3)
389*59599516SKenneth E. Jansen
390*59599516SKenneth E. Jansen      return
391*59599516SKenneth E. Jansen      end
392*59599516SKenneth E. Jansen
393*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
394*59599516SKenneth E. Jansenc get the metric tensor g_{ij}=xi_{k,i} xi_{k,j}.
395*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
396*59599516SKenneth E. Jansen      subroutine e3gijd( dxidx,  gijd )
397*59599516SKenneth E. Jansen
398*59599516SKenneth E. Jansen      include "common.h"
399*59599516SKenneth E. Jansen
400*59599516SKenneth E. Jansen      real*8  dxidx(npro,nsd,nsd),  gijd(npro,6),
401*59599516SKenneth E. Jansen     &        tmp1(npro),           tmp2(npro),
402*59599516SKenneth E. Jansen     &        tmp3(npro)
403*59599516SKenneth E. Jansenc
404*59599516SKenneth E. Jansenc  form metric tensor g_{ij}=xi_{k,i} xi_{k,j}.  It is a symmetric
405*59599516SKenneth E. Jansenc  tensor so we only form 6 components and use symmetric matrix numbering.
406*59599516SKenneth E. Jansenc
407*59599516SKenneth E. Jansen      if (lcsyst .ge. 2) then  ! note this makes wedges like hexs..should
408*59599516SKenneth E. Jansenc                                be corrected later
409*59599516SKenneth E. Jansen
410*59599516SKenneth E. Jansen         gijd(:,1) = dxidx(:,1,1) * dxidx(:,1,1)
411*59599516SKenneth E. Jansen     &             + dxidx(:,2,1) * dxidx(:,2,1)
412*59599516SKenneth E. Jansen     &             + dxidx(:,3,1) * dxidx(:,3,1)
413*59599516SKenneth E. Jansenc
414*59599516SKenneth E. Jansen         gijd(:,4) = dxidx(:,1,1) * dxidx(:,1,2)
415*59599516SKenneth E. Jansen     &             + dxidx(:,2,1) * dxidx(:,2,2)
416*59599516SKenneth E. Jansen     &             + dxidx(:,3,1) * dxidx(:,3,2)
417*59599516SKenneth E. Jansenc
418*59599516SKenneth E. Jansen         gijd(:,2) = dxidx(:,1,2) * dxidx(:,1,2)
419*59599516SKenneth E. Jansen     &             + dxidx(:,2,2) * dxidx(:,2,2)
420*59599516SKenneth E. Jansen     &             + dxidx(:,3,2) * dxidx(:,3,2)
421*59599516SKenneth E. Jansenc
422*59599516SKenneth E. Jansen         gijd(:,5) = dxidx(:,1,2) * dxidx(:,1,3)
423*59599516SKenneth E. Jansen     &             + dxidx(:,2,2) * dxidx(:,2,3)
424*59599516SKenneth E. Jansen     &             + dxidx(:,3,2) * dxidx(:,3,3)
425*59599516SKenneth E. Jansenc
426*59599516SKenneth E. Jansen         gijd(:,6) = dxidx(:,1,1) * dxidx(:,1,3)
427*59599516SKenneth E. Jansen     &             + dxidx(:,2,1) * dxidx(:,2,3)
428*59599516SKenneth E. Jansen     &             + dxidx(:,3,1) * dxidx(:,3,3)
429*59599516SKenneth E. Jansenc
430*59599516SKenneth E. Jansen         gijd(:,3) = dxidx(:,1,3) * dxidx(:,1,3)
431*59599516SKenneth E. Jansen     &             + dxidx(:,2,3) * dxidx(:,2,3)
432*59599516SKenneth E. Jansen     &             + dxidx(:,3,3) * dxidx(:,3,3)
433*59599516SKenneth E. Jansenc
434*59599516SKenneth E. Jansen      else   if (lcsyst .eq. 1) then
435*59599516SKenneth E. Jansenc
436*59599516SKenneth E. Jansenc  There is an invariance problem with tets
437*59599516SKenneth E. Jansenc  It is fixed by the following modifications to gijd
438*59599516SKenneth E. Jansenc
439*59599516SKenneth E. Jansen
440*59599516SKenneth E. Jansen         c1 = 1.259921049894873D+00
441*59599516SKenneth E. Jansen         c2 = 6.299605249474365D-01
442*59599516SKenneth E. Jansenc
443*59599516SKenneth E. Jansen         tmp1(:) = c1 * dxidx(:,1,1)+c2 *(dxidx(:,2,1)+dxidx(:,3,1))
444*59599516SKenneth E. Jansen         tmp2(:) = c1 * dxidx(:,2,1)+c2 *(dxidx(:,1,1)+dxidx(:,3,1))
445*59599516SKenneth E. Jansen         tmp3(:) = c1 * dxidx(:,3,1)+c2 *(dxidx(:,1,1)+dxidx(:,2,1))
446*59599516SKenneth E. Jansen         gijd(:,1) = dxidx(:,1,1) * tmp1
447*59599516SKenneth E. Jansen     1              + dxidx(:,2,1) * tmp2
448*59599516SKenneth E. Jansen     2              + dxidx(:,3,1) * tmp3
449*59599516SKenneth E. Jansenc
450*59599516SKenneth E. Jansen         tmp1(:) = c1 * dxidx(:,1,2)+c2 *(dxidx(:,2,2)+dxidx(:,3,2))
451*59599516SKenneth E. Jansen         tmp2(:) = c1 * dxidx(:,2,2)+c2 *(dxidx(:,1,2)+dxidx(:,3,2))
452*59599516SKenneth E. Jansen         tmp3(:) = c1 * dxidx(:,3,2)+c2 *(dxidx(:,1,2)+dxidx(:,2,2))
453*59599516SKenneth E. Jansen         gijd(:,2) = dxidx(:,1,2) * tmp1
454*59599516SKenneth E. Jansen     1             + dxidx(:,2,2) * tmp2
455*59599516SKenneth E. Jansen     2             + dxidx(:,3,2) * tmp3
456*59599516SKenneth E. Jansenc
457*59599516SKenneth E. Jansen         gijd(:,4) = dxidx(:,1,1) * tmp1
458*59599516SKenneth E. Jansen     1             + dxidx(:,2,1) * tmp2
459*59599516SKenneth E. Jansen     2             + dxidx(:,3,1) * tmp3
460*59599516SKenneth E. Jansenc
461*59599516SKenneth E. Jansen         tmp1(:) = c1 * dxidx(:,1,3)+c2 *(dxidx(:,2,3)+dxidx(:,3,3))
462*59599516SKenneth E. Jansen         tmp2(:) = c1 * dxidx(:,2,3)+c2 *(dxidx(:,1,3)+dxidx(:,3,3))
463*59599516SKenneth E. Jansen         tmp3(:) = c1 * dxidx(:,3,3)+c2 *(dxidx(:,1,3)+dxidx(:,2,3))
464*59599516SKenneth E. Jansen         gijd(:,3) = dxidx(:,1,3) * tmp1
465*59599516SKenneth E. Jansen     1             + dxidx(:,2,3) * tmp2
466*59599516SKenneth E. Jansen     2             + dxidx(:,3,3) * tmp3
467*59599516SKenneth E. Jansenc
468*59599516SKenneth E. Jansen         gijd(:,5) = dxidx(:,1,2) * tmp1
469*59599516SKenneth E. Jansen     1             + dxidx(:,2,2) * tmp2
470*59599516SKenneth E. Jansen     2             + dxidx(:,3,2) * tmp3
471*59599516SKenneth E. Jansenc
472*59599516SKenneth E. Jansen         gijd(:,6) = dxidx(:,1,1) * tmp1
473*59599516SKenneth E. Jansen     1             + dxidx(:,2,1) * tmp2
474*59599516SKenneth E. Jansen     2             + dxidx(:,3,1) * tmp3
475*59599516SKenneth E. Jansenc
476*59599516SKenneth E. Jansen      else
477*59599516SKenneth E. Jansen         write(*,*) 'lcsyst eq',lcsyst,'not supported'
478*59599516SKenneth E. Jansen         stop
479*59599516SKenneth E. Jansen      endif
480*59599516SKenneth E. Jansen
481*59599516SKenneth E. Jansen      return
482*59599516SKenneth E. Jansen      end
483*59599516SKenneth E. Jansen
484*59599516SKenneth E. Jansenc------------------------------------------------------------------------
485*59599516SKenneth E. Jansenc
486*59599516SKenneth E. Jansenc     calculate the stabilization for the advection-diffusion equation
487*59599516SKenneth E. Jansenc
488*59599516SKenneth E. Jansenc------------------------------------------------------------------------
489*59599516SKenneth E. Jansen      subroutine e3StabSclr (uMod,  dxidx,  tauT, diffus, srcR, giju,
490*59599516SKenneth E. Jansen     &                       srcRat )
491*59599516SKenneth E. Jansenc
492*59599516SKenneth E. Jansenc
493*59599516SKenneth E. Jansen        include "common.h"
494*59599516SKenneth E. Jansenc
495*59599516SKenneth E. Jansen        real*8    rho(npro),                 uMod(npro,nsd),
496*59599516SKenneth E. Jansen     &            dxidx(npro,nsd,nsd),       diffus(npro),
497*59599516SKenneth E. Jansen     &            tauT(npro),                srcR(npro)
498*59599516SKenneth E. Jansen
499*59599516SKenneth E. Jansenc
500*59599516SKenneth E. Jansen        real*8    gijd(npro,6),       giju(npro,6),
501*59599516SKenneth E. Jansen     &            tmp1(npro),         tmp2(npro),
502*59599516SKenneth E. Jansen     &            tmp3(npro),         fact(npro),
503*59599516SKenneth E. Jansen     &            srcRat(npro)
504*59599516SKenneth E. Jansen
505*59599516SKenneth E. Jansen        real*8     fff
506*59599516SKenneth E. Jansen        if(ivart.eq.1) then
507*59599516SKenneth E. Jansen           tauT=zero
508*59599516SKenneth E. Jansen           return
509*59599516SKenneth E. Jansen        endif
510*59599516SKenneth E. Jansenc
511*59599516SKenneth E. Jansenc.... get the metric tensor
512*59599516SKenneth E. Jansenc
513*59599516SKenneth E. Jansen      call e3gijd( dxidx, gijd )
514*59599516SKenneth E. Jansenc
515*59599516SKenneth E. Jansenc...  momentum tau
516*59599516SKenneth E. Jansenc
517*59599516SKenneth E. Jansenc
518*59599516SKenneth E. Jansenc... higher order element diffusive correction
519*59599516SKenneth E. Jansenc
520*59599516SKenneth E. Jansen        if (ipord == 1) then
521*59599516SKenneth E. Jansen           fff = 9.0d0
522*59599516SKenneth E. Jansen        else if (ipord == 2) then
523*59599516SKenneth E. Jansen           fff = 36.0d0
524*59599516SKenneth E. Jansen        else if (ipord == 3) then
525*59599516SKenneth E. Jansen           fff = 64.0d0
526*59599516SKenneth E. Jansen        endif
527*59599516SKenneth E. Jansen
528*59599516SKenneth E. Jansen!MR CHANGE
529*59599516SKenneth E. Jansen      dts  =  (Dtgl*dtsfct)
530*59599516SKenneth E. Jansen!      dts=  min(Dtgl,28800.0d0)*dtsfct      !28800 = 1600*180 / 10
531*59599516SKenneth E. Jansen!      dts=  min(Dtgl,2880.0d0)*dtsfct      !2880 = 1600*180 / 100
532*59599516SKenneth E. Jansen!      dts=  min(Dtgl,288.0d0)*dtsfct        !288 = 1600*180 / 1000
533*59599516SKenneth E. Jansen!MR CHANGE
534*59599516SKenneth E. Jansen
535*59599516SKenneth E. Jansenc        if(iRANS.ne.-2) srcRat=srcR
536*59599516SKenneth E. Jansen        tauT =
537*59599516SKenneth E. Jansen     1         (two*dts)**2
538*59599516SKenneth E. Jansen     2       + srcRat ** 2
539*59599516SKenneth E. Jansen     3       + uMod(:,1) * ( gijd(:,1) * uMod(:,1)
540*59599516SKenneth E. Jansen     4                     + gijd(:,4) * uMod(:,2)
541*59599516SKenneth E. Jansen     5	                   + gijd(:,6) * uMod(:,3) )
542*59599516SKenneth E. Jansen     6	     + uMod(:,2) * ( gijd(:,4) * uMod(:,1)
543*59599516SKenneth E. Jansen     7	                   + gijd(:,2) * uMod(:,2)
544*59599516SKenneth E. Jansen     8	                   + gijd(:,5) * uMod(:,3) )
545*59599516SKenneth E. Jansen     9	     + uMod(:,3) * ( gijd(:,6) * uMod(:,1)
546*59599516SKenneth E. Jansen     a	                   + gijd(:,5) * uMod(:,2)
547*59599516SKenneth E. Jansen     1	                   + gijd(:,3) * uMod(:,3) )
548*59599516SKenneth E. Jansen     2	     + fff * diffus(:)** 2
549*59599516SKenneth E. Jansen     3	           * ( gijd(:,1) ** 2
550*59599516SKenneth E. Jansen     4		     + gijd(:,2) ** 2
551*59599516SKenneth E. Jansen     5		     + gijd(:,3) ** 2
552*59599516SKenneth E. Jansen     6		     + 2.
553*59599516SKenneth E. Jansen     7		      * ( gijd(:,4) ** 2
554*59599516SKenneth E. Jansen     8		        + gijd(:,5) ** 2
555*59599516SKenneth E. Jansen     9		        + gijd(:,6) ** 2 ) )
556*59599516SKenneth E. Jansen
557*59599516SKenneth E. Jansen        tauT = one/sqrt(tauT)
558*59599516SKenneth E. Jansenc
559*59599516SKenneth E. Jansen        if(idcsclr(1) .ne. 0) then
560*59599516SKenneth E. Jansen           if ((idcsclr(2).eq.1 .and. isclr.eq.1) .or.
561*59599516SKenneth E. Jansen     &          (idcsclr(2).eq.2 .and. isclr.eq.2)) then ! scalar with dc
562*59599516SKenneth E. Jansenc
563*59599516SKenneth E. Jansenc     determinant of gijd
564*59599516SKenneth E. Jansenc
565*59599516SKenneth E. Jansen              fact = one/(gijd(:,1) * gijd(:,2) * gijd(:,3)
566*59599516SKenneth E. Jansen     &             - gijd(:,2) * gijd(:,6) * gijd(:,6)
567*59599516SKenneth E. Jansen     &             - gijd(:,1) * gijd(:,5) * gijd(:,5)
568*59599516SKenneth E. Jansen     &             - gijd(:,3) * gijd(:,4) * gijd(:,4)
569*59599516SKenneth E. Jansen     &             + gijd(:,6) * gijd(:,4) * gijd(:,5) * two)
570*59599516SKenneth E. Jansenc
571*59599516SKenneth E. Jansenc ... note between compressible and incompressible 5 and 6 of giju
572*59599516SKenneth E. Jansenc     are switched
573*59599516SKenneth E. Jansenc
574*59599516SKenneth E. Jansen              giju(:,1) = fact * (gijd(:,2)*gijd(:,3)
575*59599516SKenneth E. Jansen     &                  - gijd(:,5)**2)
576*59599516SKenneth E. Jansen              giju(:,2) = fact * (gijd(:,1)*gijd(:,3)
577*59599516SKenneth E. Jansen     &                  - gijd(:,6)**2)
578*59599516SKenneth E. Jansen              giju(:,3) = fact * (gijd(:,1)*gijd(:,2)
579*59599516SKenneth E. Jansen     &                  - gijd(:,4)**2)
580*59599516SKenneth E. Jansen              giju(:,4) = fact * (gijd(:,5)*gijd(:,6)
581*59599516SKenneth E. Jansen     &                  - gijd(:,4)*gijd(:,3) )
582*59599516SKenneth E. Jansen              giju(:,5) = fact * (gijd(:,4)*gijd(:,6)
583*59599516SKenneth E. Jansen     &                  - gijd(:,1)*gijd(:,5) )
584*59599516SKenneth E. Jansen              giju(:,6) = fact * (gijd(:,4)*gijd(:,5)
585*59599516SKenneth E. Jansen     &                  - gijd(:,6)*gijd(:,2) )
586*59599516SKenneth E. Jansen
587*59599516SKenneth E. Jansenc
588*59599516SKenneth E. Jansen           endif
589*59599516SKenneth E. Jansen        endif                   ! end of idcsclr.ne.0
590*59599516SKenneth E. Jansenc
591*59599516SKenneth E. Jansenc.... return
592*59599516SKenneth E. Jansenc
593*59599516SKenneth E. Jansen        return
594*59599516SKenneth E. Jansen        end
595*59599516SKenneth E. Jansen
596