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