1*59599516SKenneth E. Jansen subroutine e3b (yl, ycl, iBCB, BCB, shpb, shglb, 2*59599516SKenneth E. Jansen & xlb, rl, rml, sgn) 3*59599516SKenneth E. Jansenc 4*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 5*59599516SKenneth E. Jansenc 6*59599516SKenneth E. Jansenc This routine calculates the 3D RHS residual of the fluid boundary 7*59599516SKenneth E. Jansenc elements. 8*59599516SKenneth E. Jansenc 9*59599516SKenneth E. Jansenc input: 10*59599516SKenneth E. Jansenc yl (npro,nshl,nflow) : Y variables (perturbed, no scalars) 11*59599516SKenneth E. Jansenc ycl (npro,nshl,ndof) : Y variables 12*59599516SKenneth E. Jansenc iBCB (npro,ndiBCB) : boundary condition code (iBCB(:,1) is 13*59599516SKenneth E. Jansenc a bit tested boundary integral flag i.e. 14*59599516SKenneth E. Jansenc if set to value of BCB if set to floating value 15*59599516SKenneth E. Jansenc iBCB(:,1) : convective flux * 1 0 (ditto to all below) 16*59599516SKenneth E. Jansenc pressure flux * 2 17*59599516SKenneth E. Jansenc viscous flux * 4 18*59599516SKenneth E. Jansenc heat flux * 8 19*59599516SKenneth E. Jansenc turbulence wall * 16 20*59599516SKenneth E. Jansenc scalarI flux * 16*2^I 21*59599516SKenneth E. Jansenc (where I is the scalar number) 22*59599516SKenneth E. Jansenc 23*59599516SKenneth E. Jansenc iBCB(:,2) is the srfID given by the user in MGI that we will 24*59599516SKenneth E. Jansenc collect integrated fluxes for. 25*59599516SKenneth E. Jansenc 26*59599516SKenneth E. Jansenc BCB (npro,nshlb,ndBCB) : Boundary Condition values 27*59599516SKenneth E. Jansenc BCB (1) : mass flux 28*59599516SKenneth E. Jansenc BCB (2) : pressure 29*59599516SKenneth E. Jansenc BCB (3) : viscous flux in x1-direc. 30*59599516SKenneth E. Jansenc BCB (4) : viscous flux in x2-direc. 31*59599516SKenneth E. Jansenc BCB (5) : viscous flux in x3-direc. 32*59599516SKenneth E. Jansenc BCB (6) : heat flux 33*59599516SKenneth E. Jansenc shpb (nshl,ngaussb) : boundary element shape-functions 34*59599516SKenneth E. Jansenc shglb (nsd,nshl,ngaussb) : boundary element grad-shape-functions 35*59599516SKenneth E. Jansenc xlb (npro,nenl,nsd) : nodal coordinates at current step 36*59599516SKenneth E. Jansenc 37*59599516SKenneth E. Jansenc output: 38*59599516SKenneth E. Jansenc rl (npro,nshl,nflow) : element residual 39*59599516SKenneth E. Jansenc rml (npro,nshl,nflow) : element modified residual 40*59599516SKenneth E. Jansenc 41*59599516SKenneth E. Jansenc 42*59599516SKenneth E. Jansenc Note: Always the first side of the element is on the boundary. 43*59599516SKenneth E. Jansenc However, note that for higher-order elements the nodes on 44*59599516SKenneth E. Jansenc the boundary side are not the first nshlb nodes, see the 45*59599516SKenneth E. Jansenc array lnode. 46*59599516SKenneth E. Jansenc 47*59599516SKenneth E. Jansenc 48*59599516SKenneth E. Jansenc Zdenek Johan, Summer 1990. (Modified from e2b.f) 49*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 50*59599516SKenneth E. Jansenc Anilkumar Karanam Spring 2000 (Modified for Hierarchic Hexes) 51*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 52*59599516SKenneth E. Jansenc 53*59599516SKenneth E. Jansen include "common.h" 54*59599516SKenneth E. Jansenc 55*59599516SKenneth E. Jansen dimension yl(npro,nshl,nflow), iBCB(npro,ndiBCB), 56*59599516SKenneth E. Jansen & ycl(npro,nshl,ndof), 57*59599516SKenneth E. Jansen & BCB(npro,nshlb,ndBCB), shpb(nshl,ngaussb), 58*59599516SKenneth E. Jansen & shglb(nsd,nshl,ngaussb), 59*59599516SKenneth E. Jansen & xlb(npro,nenl,nsd), 60*59599516SKenneth E. Jansen & rl(npro,nshl,nflow), rml(npro,nshl,nflow) 61*59599516SKenneth E. Jansenc 62*59599516SKenneth E. Jansen dimension g1yi(npro,nflow), g2yi(npro,nflow), 63*59599516SKenneth E. Jansen & g3yi(npro,nflow), WdetJb(npro), 64*59599516SKenneth E. Jansen & bnorm(npro,nsd) 65*59599516SKenneth E. Jansenc 66*59599516SKenneth E. Jansen dimension un(npro), rk(npro), 67*59599516SKenneth E. Jansen & u1(npro), u2(npro), 68*59599516SKenneth E. Jansen & u3(npro), 69*59599516SKenneth E. Jansen & rho(npro), pres(npro), 70*59599516SKenneth E. Jansen & T(npro), ei(npro), 71*59599516SKenneth E. Jansen & cp(npro) 72*59599516SKenneth E. Jansenc 73*59599516SKenneth E. Jansen dimension rou(npro), p(npro), 74*59599516SKenneth E. Jansen & F1(npro), F2(npro), 75*59599516SKenneth E. Jansen & F3(npro), F4(npro), 76*59599516SKenneth E. Jansen & F5(npro), Fv2(npro), 77*59599516SKenneth E. Jansen & Fv3(npro), Fv4(npro), 78*59599516SKenneth E. Jansen & Fv5(npro), Fh5(npro) 79*59599516SKenneth E. Jansenc 80*59599516SKenneth E. Jansen dimension rmu(npro), rlm(npro), 81*59599516SKenneth E. Jansen & rlm2mu(npro), con(npro), 82*59599516SKenneth E. Jansen & tau1n(npro), 83*59599516SKenneth E. Jansen & tau2n(npro), tau3n(npro), 84*59599516SKenneth E. Jansen & heat(npro) 85*59599516SKenneth E. Jansenc 86*59599516SKenneth E. Jansen dimension lnode(27), sgn(npro,nshl), 87*59599516SKenneth E. Jansen & shape(npro,nshl), shdrv(npro,nsd,nshl) 88*59599516SKenneth E. Jansenc 89*59599516SKenneth E. Jansen dimension xmudum(npro,ngauss) 90*59599516SKenneth E. Jansen 91*59599516SKenneth E. Jansen ttim(40) = ttim(40) - secs(0.0) 92*59599516SKenneth E. Jansen 93*59599516SKenneth E. Jansenc 94*59599516SKenneth E. Jansenc.... compute the nodes which lie on the boundary 95*59599516SKenneth E. Jansenc 96*59599516SKenneth E. Jansen call getbnodes(lnode) 97*59599516SKenneth E. Jansen 98*59599516SKenneth E. Jansenc.... loop through the integration points 99*59599516SKenneth E. Jansen 100*59599516SKenneth E. Jansen if(lcsyst.eq.3.or.lcsyst.eq.4) then 101*59599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 102*59599516SKenneth E. Jansen else 103*59599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 104*59599516SKenneth E. Jansen endif 105*59599516SKenneth E. Jansen 106*59599516SKenneth E. Jansen do intp = 1, ngaussb 107*59599516SKenneth E. Jansenc 108*59599516SKenneth E. Jansenc.... if Det. .eq. 0, do not include this point 109*59599516SKenneth E. Jansenc 110*59599516SKenneth E. Jansen if (Qwtb(lcsyst,intp) .eq. zero) cycle ! precaution 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansenc.... create a matrix of shape functions (and derivatives) for each 113*59599516SKenneth E. Jansenc element at this quadrature point. These arrays will contain 114*59599516SKenneth E. Jansenc the correct signs for the hierarchic basis 115*59599516SKenneth E. Jansenc 116*59599516SKenneth E. Jansenc 117*59599516SKenneth E. Jansen call getshpb(shpb, shglb, sgn, 118*59599516SKenneth E. Jansen & shape, shdrv) 119*59599516SKenneth E. Jansenc 120*59599516SKenneth E. Jansenc.... calculate the integration variables 121*59599516SKenneth E. Jansenc 122*59599516SKenneth E. Jansen call e3bvar (yl, ycl, BCB, shape, 123*59599516SKenneth E. Jansen & shdrv, xlb, 124*59599516SKenneth E. Jansen & lnode, g1yi, 125*59599516SKenneth E. Jansen & g2yi, g3yi, WdetJb, 126*59599516SKenneth E. Jansen & bnorm, pres, T, 127*59599516SKenneth E. Jansen & u1, u2, u3, 128*59599516SKenneth E. Jansen & rho, ei, cp, 129*59599516SKenneth E. Jansen & rk, rou, p, 130*59599516SKenneth E. Jansen & Fv2, Fv3, Fv4, 131*59599516SKenneth E. Jansen & Fh5) 132*59599516SKenneth E. Jansenc 133*59599516SKenneth E. Jansenc.... ires = 1 or 3 134*59599516SKenneth E. Jansenc 135*59599516SKenneth E. Jansen if ((ires .eq. 1) .or. (ires .eq. 3)) then 136*59599516SKenneth E. Jansenc 137*59599516SKenneth E. Jansenc.... clear some variables 138*59599516SKenneth E. Jansenc 139*59599516SKenneth E. Jansen tau1n = zero 140*59599516SKenneth E. Jansen tau2n = zero 141*59599516SKenneth E. Jansen tau3n = zero 142*59599516SKenneth E. Jansen heat = zero 143*59599516SKenneth E. Jansenc 144*59599516SKenneth E. Jansenc.... -------------------------> convective <------------------------ 145*59599516SKenneth E. Jansenc 146*59599516SKenneth E. Jansenc 147*59599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),0) ) 148*59599516SKenneth E. Jansen un = bnorm(:,1) * u1 + bnorm(:,2) * u2 + bnorm(:,3) * u3 149*59599516SKenneth E. Jansen rou = rho * ( un ) 150*59599516SKenneth E. Jansen elsewhere 151*59599516SKenneth E. Jansen un = (rou / rho) 152*59599516SKenneth E. Jansen endwhere 153*59599516SKenneth E. Jansenc 154*59599516SKenneth E. Jansenc.... -------------------------> pressure <-------------------------- 155*59599516SKenneth E. Jansenc 156*59599516SKenneth E. Jansenc.... use one-point quadrature in time 157*59599516SKenneth E. Jansenc 158*59599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),1)) p = pres 159*59599516SKenneth E. Jansenc 160*59599516SKenneth E. Jansenc.... add the Euler contribution 161*59599516SKenneth E. Jansenc 162*59599516SKenneth E. Jansen F1 = rou 163*59599516SKenneth E. Jansen F2 = rou * u1 + bnorm(:,1) * p 164*59599516SKenneth E. Jansen F3 = rou * u2 + bnorm(:,2) * p 165*59599516SKenneth E. Jansen F4 = rou * u3 + bnorm(:,3) * p 166*59599516SKenneth E. Jansen F5 = rou * (ei + rk) + un * p 167*59599516SKenneth E. Jansenc 168*59599516SKenneth E. Jansenc.... flop count 169*59599516SKenneth E. Jansenc 170*59599516SKenneth E. Jansen flops = flops + 23*npro 171*59599516SKenneth E. Jansenc 172*59599516SKenneth E. Jansenc.... end of ires = 1 or 3 173*59599516SKenneth E. Jansenc 174*59599516SKenneth E. Jansen endif 175*59599516SKenneth E. Jansenc 176*59599516SKenneth E. Jansenc.... -----------------------> Navier-Stokes <----------------------- 177*59599516SKenneth E. Jansenc 178*59599516SKenneth E. Jansen if (Navier .eq. 1) then 179*59599516SKenneth E. Jansen 180*59599516SKenneth E. Jansen xmudum = zero 181*59599516SKenneth E. Jansen 182*59599516SKenneth E. Jansenc 183*59599516SKenneth E. Jansenc.... get the material properties 184*59599516SKenneth E. Jansenc 185*59599516SKenneth E. Jansen call getDiff (T, cp, rho, ycl, 186*59599516SKenneth E. Jansen & rmu, rlm, rlm2mu, con, shape, 187*59599516SKenneth E. Jansen & xmudum, xl) 188*59599516SKenneth E. Jansenc 189*59599516SKenneth E. Jansenc.... ------------------------> viscous flux <------------------------ 190*59599516SKenneth E. Jansenc 191*59599516SKenneth E. Jansenc.... floating viscous flux 192*59599516SKenneth E. Jansenc 193*59599516SKenneth E. Jansen tau1n = bnorm(:,1) * (rlm2mu* g1yi(:,2) + rlm *g2yi(:,3) 194*59599516SKenneth E. Jansen & + rlm *g3yi(:,4)) 195*59599516SKenneth E. Jansen & + bnorm(:,2) * (rmu *(g2yi(:,2) + g1yi(:,3))) 196*59599516SKenneth E. Jansen & + bnorm(:,3) * (rmu *(g3yi(:,2) + g1yi(:,4))) 197*59599516SKenneth E. Jansen tau2n = bnorm(:,1) * (rmu *(g2yi(:,2) + g1yi(:,3))) 198*59599516SKenneth E. Jansen & + bnorm(:,2) * (rlm * g1yi(:,2) + rlm2mu*g2yi(:,3) 199*59599516SKenneth E. Jansen & + rlm *g3yi(:,4)) 200*59599516SKenneth E. Jansen & + bnorm(:,3) * (rmu *(g3yi(:,3) + g2yi(:,4))) 201*59599516SKenneth E. Jansen tau3n = bnorm(:,1) * (rmu *(g3yi(:,2) + g1yi(:,4))) 202*59599516SKenneth E. Jansen & + bnorm(:,2) * (rmu *(g3yi(:,3) + g2yi(:,4))) 203*59599516SKenneth E. Jansen & + bnorm(:,3) * (rlm * g1yi(:,2) + rlm *g2yi(:,3) 204*59599516SKenneth E. Jansen & + rlm2mu*g3yi(:,4)) 205*59599516SKenneth E. Jansenc 206*59599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),2) ) 207*59599516SKenneth E. Jansen Fv2 = tau1n ! wherever traction is not set, use the 208*59599516SKenneth E. Jansen Fv3 = tau2n ! viscous flux calculated from the field 209*59599516SKenneth E. Jansen Fv4 = tau3n ! 210*59599516SKenneth E. Jansen endwhere 211*59599516SKenneth E. Jansenc 212*59599516SKenneth E. Jansen Fv5 = u1 * Fv2 + u2 * Fv3 + u3 * Fv4 213*59599516SKenneth E. Jansenc 214*59599516SKenneth E. Jansenc.... --------------------------> heat flux <------------------------- 215*59599516SKenneth E. Jansenc 216*59599516SKenneth E. Jansenc.... floating heat flux 217*59599516SKenneth E. Jansenc 218*59599516SKenneth E. Jansen heat = con * ( bnorm(:,1) * g1yi(:,5) + 219*59599516SKenneth E. Jansen & bnorm(:,2) * g2yi(:,5) + 220*59599516SKenneth E. Jansen & bnorm(:,3) * g3yi(:,5) ) 221*59599516SKenneth E. Jansenc 222*59599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),3) ) Fh5 = heat 223*59599516SKenneth E. Jansenc 224*59599516SKenneth E. Jansenc.... add the Navier-Stokes contribution 225*59599516SKenneth E. Jansenc 226*59599516SKenneth E. Jansen F2 = F2 - Fv2 227*59599516SKenneth E. Jansen F3 = F3 - Fv3 228*59599516SKenneth E. Jansen F4 = F4 - Fv4 229*59599516SKenneth E. Jansen F5 = F5 - Fv5 + Fh5 230*59599516SKenneth E. Jansenc 231*59599516SKenneth E. Jansenc.... flop count 232*59599516SKenneth E. Jansenc 233*59599516SKenneth E. Jansen flops = flops + 27*npro 234*59599516SKenneth E. Jansenc 235*59599516SKenneth E. Jansenc.... end of Navier Stokes part 236*59599516SKenneth E. Jansenc 237*59599516SKenneth E. Jansen endif 238*59599516SKenneth E. Jansenc 239*59599516SKenneth E. Jansenc.... -------------------------> Residual <-------------------------- 240*59599516SKenneth E. Jansenc 241*59599516SKenneth E. Jansenc.... add the flux to the residual 242*59599516SKenneth E. Jansenc 243*59599516SKenneth E. Jansen if ((ires .eq. 1) .or. (ires .eq. 3)) then 244*59599516SKenneth E. Jansenc 245*59599516SKenneth E. Jansenc 246*59599516SKenneth E. Jansen do n = 1, nshlb 247*59599516SKenneth E. Jansen nodlcl = lnode(n) 248*59599516SKenneth E. Jansenc 249*59599516SKenneth E. Jansen rl(:,nodlcl,1) = rl(:,nodlcl,1) 250*59599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F1 251*59599516SKenneth E. Jansen rl(:,nodlcl,2) = rl(:,nodlcl,2) 252*59599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F2 253*59599516SKenneth E. Jansen rl(:,nodlcl,3) = rl(:,nodlcl,3) 254*59599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F3 255*59599516SKenneth E. Jansen rl(:,nodlcl,4) = rl(:,nodlcl,4) 256*59599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F4 257*59599516SKenneth E. Jansen rl(:,nodlcl,5) = rl(:,nodlcl,5) 258*59599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F5 259*59599516SKenneth E. Jansen enddo 260*59599516SKenneth E. Jansenc 261*59599516SKenneth E. Jansen flops = flops + 12*nshlb*npro 262*59599516SKenneth E. Jansenc 263*59599516SKenneth E. Jansen endif 264*59599516SKenneth E. Jansenc 265*59599516SKenneth E. Jansenc.... add the flux to the modified residual 266*59599516SKenneth E. Jansenc 267*59599516SKenneth E. Jansen if (((ires .eq. 2) .or. (ires .eq. 3)) 268*59599516SKenneth E. Jansen & .and. (Navier .eq. 1) .and. (Jactyp .eq. 1)) then 269*59599516SKenneth E. Jansenc 270*59599516SKenneth E. Jansen do n = 1, nshlb 271*59599516SKenneth E. Jansen nodlcl = lnode(n) 272*59599516SKenneth E. Jansenc 273*59599516SKenneth E. Jansen rml(:,nodlcl,2) = rml(:,nodlcl,2) - WdetJb * 274*59599516SKenneth E. Jansen & shape(:,nodlcl) * Fv2 275*59599516SKenneth E. Jansen rml(:,nodlcl,3) = rml(:,nodlcl,3) - WdetJb * 276*59599516SKenneth E. Jansen & shape(:,nodlcl) * Fv3 277*59599516SKenneth E. Jansen rml(:,nodlcl,4) = rml(:,nodlcl,4) - WdetJb * 278*59599516SKenneth E. Jansen & shape(:,nodlcl) * Fv4 279*59599516SKenneth E. Jansen rml(:,nodlcl,5) = rml(:,nodlcl,5) - WdetJb * 280*59599516SKenneth E. Jansen & shape(:,nodlcl) * (Fv5 - Fh5) 281*59599516SKenneth E. Jansen enddo 282*59599516SKenneth E. Jansenc 283*59599516SKenneth E. Jansen flops = flops + 11*nenbl*npro 284*59599516SKenneth E. Jansenc 285*59599516SKenneth E. Jansen endif 286*59599516SKenneth E. Jansenc 287*59599516SKenneth E. Jansenc uncomment and run 1 step to get estimate of wall shear vs z 288*59599516SKenneth E. Jansenc 289*59599516SKenneth E. Jansenc do i=1,npro 290*59599516SKenneth E. Jansenc tnorm= sqrt(tau1n(i)*tau1n(i) 291*59599516SKenneth E. Jansenc & +tau2n(i)*tau2n(i)+tau3n(i)*tau3n(i)) 292*59599516SKenneth E. Jansenc 293*59599516SKenneth E. Jansenc write(700+myrank,*) xlb(i,1,3),tnorm 294*59599516SKenneth E. Jansenc enddo 295*59599516SKenneth E. Jansen 296*59599516SKenneth E. Jansen 297*59599516SKenneth E. Jansen do iel = 1, npro 298*59599516SKenneth E. Jansenc 299*59599516SKenneth E. Jansenc if we have a nonzero value then 300*59599516SKenneth E. Jansenc calculate the fluxes through this surface 301*59599516SKenneth E. Jansenc 302*59599516SKenneth E. Jansen iface = abs(iBCB(iel,2)) 303*59599516SKenneth E. Jansen if (iface .ne. 0 .and. ires.ne.2) then 304*59599516SKenneth E. Jansen flxID(1,iface) = flxID(1,iface) + WdetJb(iel)! measure area too 305*59599516SKenneth E. Jansenc flxID(2,iface) = flxID(2,iface) - WdetJb(iel) * un(iel) 306*59599516SKenneth E. Jansen flxID(2,iface) = flxID(2,iface) - WdetJb(iel) * rou(iel) 307*59599516SKenneth E. Jansen flxID(3,iface) = flxID(3,iface) 308*59599516SKenneth E. Jansen & - ( tau1n(iel) - bnorm(iel,1)*pres(iel)) 309*59599516SKenneth E. Jansen & * WdetJb(iel) 310*59599516SKenneth E. Jansen flxID(4,iface) = flxID(4,iface) 311*59599516SKenneth E. Jansen & - ( tau2n(iel) - bnorm(iel,2)*pres(iel)) 312*59599516SKenneth E. Jansen & * WdetJb(iel) 313*59599516SKenneth E. Jansen flxID(5,iface) = flxID(5,iface) 314*59599516SKenneth E. Jansen & - ( tau3n(iel) - bnorm(iel,3)*pres(iel)) 315*59599516SKenneth E. Jansen & * WdetJb(iel) 316*59599516SKenneth E. Jansen 317*59599516SKenneth E. Jansen endif 318*59599516SKenneth E. Jansen enddo 319*59599516SKenneth E. Jansen 320*59599516SKenneth E. Jansenc 321*59599516SKenneth E. Jansenc.... --------------------> Aerodynamic Forces <--------------------- 322*59599516SKenneth E. Jansenc 323*59599516SKenneth E. Jansen if ((ires .ne. 2) .and. (iter .eq. nitr)) then 324*59599516SKenneth E. Jansenc 325*59599516SKenneth E. Jansenc.... compute the forces on the body 326*59599516SKenneth E. Jansenc 327*59599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),0) ) 328*59599516SKenneth E. Jansen tau1n = ( pres * bnorm(:,1) - tau1n ) * WdetJb 329*59599516SKenneth E. Jansen tau2n = ( pres * bnorm(:,2) - tau2n ) * WdetJb 330*59599516SKenneth E. Jansen tau3n = ( pres * bnorm(:,3) - tau3n ) * WdetJb 331*59599516SKenneth E. Jansen heat = - heat * WdetJb 332*59599516SKenneth E. Jansen elsewhere 333*59599516SKenneth E. Jansen tau1n = zero 334*59599516SKenneth E. Jansen tau2n = zero 335*59599516SKenneth E. Jansen tau3n = zero 336*59599516SKenneth E. Jansen heat = zero 337*59599516SKenneth E. Jansen endwhere 338*59599516SKenneth E. Jansenc 339*59599516SKenneth E. Jansen Force(1) = Force(1) + sum(tau1n) 340*59599516SKenneth E. Jansen Force(2) = Force(2) + sum(tau2n) 341*59599516SKenneth E. Jansen Force(3) = Force(3) + sum(tau3n) 342*59599516SKenneth E. Jansen HFlux = HFlux + sum(heat) 343*59599516SKenneth E. Jansenc 344*59599516SKenneth E. Jansen endif 345*59599516SKenneth E. Jansenc 346*59599516SKenneth E. Jansenc.... end of integration loop 347*59599516SKenneth E. Jansenc 348*59599516SKenneth E. Jansen enddo 349*59599516SKenneth E. Jansen 350*59599516SKenneth E. Jansen ttim(40) = ttim(40) + secs(0.0) 351*59599516SKenneth E. Jansenc 352*59599516SKenneth E. Jansenc.... return 353*59599516SKenneth E. Jansenc 354*59599516SKenneth E. Jansen return 355*59599516SKenneth E. Jansen end 356*59599516SKenneth E. Jansenc 357*59599516SKenneth E. Jansenc 358*59599516SKenneth E. Jansenc 359*59599516SKenneth E. Jansen subroutine e3bSclr (ycl, iBCB, BCB, 360*59599516SKenneth E. Jansen & shpb, shglb, sgn, 361*59599516SKenneth E. Jansen & xlb, rtl, rmtl) 362*59599516SKenneth E. Jansenc 363*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 364*59599516SKenneth E. Jansenc 365*59599516SKenneth E. Jansenc This routine calculates the 3D RHS residual of the fluid boundary 366*59599516SKenneth E. Jansenc elements. 367*59599516SKenneth E. Jansenc 368*59599516SKenneth E. Jansenc input: 369*59599516SKenneth E. Jansenc ycl (npro,nshl,ndof) : Y variables 370*59599516SKenneth E. Jansenc iBCB (npro,ndiBCB) : boundary condition code & surfID 371*59599516SKenneth E. Jansenc BCB (npro,nenbl,ndBCB) : Boundary Condition values 372*59599516SKenneth E. Jansenc BCB (1) : mass flux 373*59599516SKenneth E. Jansenc BCB (2) : pressure 374*59599516SKenneth E. Jansenc BCB (3) : viscous flux in x1-direc. 375*59599516SKenneth E. Jansenc BCB (4) : viscous flux in x2-direc. 376*59599516SKenneth E. Jansenc BCB (5) : viscous flux in x3-direc. 377*59599516SKenneth E. Jansenc BCB (6) : heat flux 378*59599516SKenneth E. Jansenc BCB (7) : eddy visc flux 379*59599516SKenneth E. Jansenc shpb (nen,nintg) : boundary element shape-functions 380*59599516SKenneth E. Jansenc shglb (nsd,nen,nintg) : boundary element grad-shape-functions 381*59599516SKenneth E. Jansenc xlb (npro,nenl,nsd) : nodal coordinates at current step 382*59599516SKenneth E. Jansenc 383*59599516SKenneth E. Jansenc output: 384*59599516SKenneth E. Jansenc rtl (npro,nenl,nflow) : element residual 385*59599516SKenneth E. Jansenc rmtl (npro,nenl,nflow) : element modified residual 386*59599516SKenneth E. Jansenc 387*59599516SKenneth E. Jansenc 388*59599516SKenneth E. Jansenc Note: Always the first side of the element is on the boundary. 389*59599516SKenneth E. Jansenc However, note that for higher-order elements the nodes on 390*59599516SKenneth E. Jansenc the boundary side are not the first nenbl nodes, see the 391*59599516SKenneth E. Jansenc array mnodeb. 392*59599516SKenneth E. Jansenc 393*59599516SKenneth E. Jansenc 394*59599516SKenneth E. Jansenc Zdenek Johan, Summer 1990. (Modified from e2b.f) 395*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 396*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 397*59599516SKenneth E. Jansenc 398*59599516SKenneth E. Jansen use turbSA ! for saSigma 399*59599516SKenneth E. Jansen include "common.h" 400*59599516SKenneth E. Jansenc 401*59599516SKenneth E. Jansen dimension ycl(npro,nshl,ndof), iBCB(npro,ndiBCB), 402*59599516SKenneth E. Jansen & BCB(npro,nshlb,ndBCB), shpb(nshl,ngaussb), 403*59599516SKenneth E. Jansen & shglb(nsd,nshl,ngaussb), sgn(npro,nshl), 404*59599516SKenneth E. Jansen & xlb(npro,nenl,nsd), shape(npro,nshl), 405*59599516SKenneth E. Jansen & rtl(npro,nshl), rmtl(npro,nshl), 406*59599516SKenneth E. Jansen & shdrv(npro,nsd,nshl) 407*59599516SKenneth E. Jansenc 408*59599516SKenneth E. Jansen dimension u1(npro), u2(npro), 409*59599516SKenneth E. Jansen & u3(npro), 410*59599516SKenneth E. Jansen & g1yti(npro), g2yti(npro), 411*59599516SKenneth E. Jansen & g3yti(npro), WdetJb(npro), 412*59599516SKenneth E. Jansen & bnorm(npro,nsd) 413*59599516SKenneth E. Jansenc 414*59599516SKenneth E. Jansen dimension rho(npro), Sclr(npro), 415*59599516SKenneth E. Jansen & T(npro), cp(npro) 416*59599516SKenneth E. Jansenc 417*59599516SKenneth E. Jansen dimension rou(npro), F(npro), 418*59599516SKenneth E. Jansen & un(npro), Sclrn(npro) 419*59599516SKenneth E. Jansenc 420*59599516SKenneth E. Jansen dimension rmu(npro), rlm(npro), 421*59599516SKenneth E. Jansen & rlm2mu(npro), con(npro), 422*59599516SKenneth E. Jansen & heat(npro), srcp(npro) 423*59599516SKenneth E. Jansenc 424*59599516SKenneth E. Jansen dimension lnode(27) 425*59599516SKenneth E. Jansen real*8 sign_levelset(npro), sclr_ls(npro), mytmp(npro) 426*59599516SKenneth E. Jansen ttim(40) = ttim(40) - tmr() 427*59599516SKenneth E. Jansenc 428*59599516SKenneth E. Jansenc.... get the boundary nodes 429*59599516SKenneth E. Jansenc 430*59599516SKenneth E. Jansen id = isclr + 5 431*59599516SKenneth E. Jansen ib = isclr + 4 432*59599516SKenneth E. Jansen ibb = isclr + 6 433*59599516SKenneth E. Jansen call getbnodes(lnode) 434*59599516SKenneth E. Jansenc 435*59599516SKenneth E. Jansenc.... loop through the integration points 436*59599516SKenneth E. Jansenc 437*59599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 438*59599516SKenneth E. Jansenc 439*59599516SKenneth E. Jansen do intp = 1, ngaussb 440*59599516SKenneth E. Jansenc 441*59599516SKenneth E. Jansenc.... if Det. .eq. 0, do not include this point 442*59599516SKenneth E. Jansenc 443*59599516SKenneth E. Jansen if (Qwtb(lcsyst,intp) .eq. zero) cycle ! precaution 444*59599516SKenneth E. Jansenc 445*59599516SKenneth E. Jansenc.... create a matrix of shape functions (and derivatives) for each 446*59599516SKenneth E. Jansenc element at this quadrature point. These arrays will contain 447*59599516SKenneth E. Jansenc the correct signs for the hierarchic basis 448*59599516SKenneth E. Jansenc 449*59599516SKenneth E. Jansen call getshpb(shpb, shglb, sgn, 450*59599516SKenneth E. Jansen & shape, shdrv) 451*59599516SKenneth E. Jansenc 452*59599516SKenneth E. Jansenc.... calculate the integraton variables 453*59599516SKenneth E. Jansenc 454*59599516SKenneth E. Jansen call e3bvarSclr (ycl, BCB, 455*59599516SKenneth E. Jansen & shape, shdrv, 456*59599516SKenneth E. Jansen & xlb, lnode, u1, 457*59599516SKenneth E. Jansen & u2, u3, g1yti, 458*59599516SKenneth E. Jansen & g2yti, g3yti, WdetJb, 459*59599516SKenneth E. Jansen & bnorm, T, rho, 460*59599516SKenneth E. Jansen & cp, rou, Sclr, 461*59599516SKenneth E. Jansen & F) 462*59599516SKenneth E. Jansenc.......********************modification for Ilset=2********************** 463*59599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then !we are redistancing level-sets 464*59599516SKenneth E. Jansen 465*59599516SKenneth E. JansenCAD If Sclr(:,1).gt.zero, result of sign_term function 1 466*59599516SKenneth E. JansenCAD If Sclr(:,1).eq.zero, result of sign_term function 0 467*59599516SKenneth E. JansenCAD If Sclr(:,1).lt.zero, result of sign_term function -1 468*59599516SKenneth E. Jansen 469*59599516SKenneth E. Jansen sclr_ls = zero !zero out temp variable 470*59599516SKenneth E. Jansen 471*59599516SKenneth E. Jansen do ii=1,npro 472*59599516SKenneth E. Jansen 473*59599516SKenneth E. Jansen do jj = 1, nshl ! first find the value of levelset at point ii 474*59599516SKenneth E. Jansen 475*59599516SKenneth E. Jansen sclr_ls(ii) = sclr_ls(ii) 476*59599516SKenneth E. Jansen & + shape(ii,jj) * ycl(ii,jj,6) 477*59599516SKenneth E. Jansen 478*59599516SKenneth E. Jansen enddo 479*59599516SKenneth E. Jansen if (sclr_ls(ii) .lt. - epsilon_ls)then 480*59599516SKenneth E. Jansen 481*59599516SKenneth E. Jansen sign_levelset(ii) = - one 482*59599516SKenneth E. Jansen 483*59599516SKenneth E. Jansen elseif (abs(sclr_ls(ii)) .le. epsilon_ls)then 484*59599516SKenneth E. Jansenc 485*59599516SKenneth E. Jansen sign_levelset(ii) =sclr_ls(ii)/epsilon_ls 486*59599516SKenneth E. Jansen & + sin(pi*sclr_ls(ii)/epsilon_ls)/pi 487*59599516SKenneth E. Jansen 488*59599516SKenneth E. Jansen elseif (sclr_ls(ii) .gt. epsilon_ls) then 489*59599516SKenneth E. Jansen 490*59599516SKenneth E. Jansen sign_levelset(ii) = one 491*59599516SKenneth E. Jansen 492*59599516SKenneth E. Jansen endif 493*59599516SKenneth E. Jansenc 494*59599516SKenneth E. Jansen srcp(ii) = sign_levelset(ii) 495*59599516SKenneth E. Jansenc 496*59599516SKenneth E. Jansen enddo 497*59599516SKenneth E. Jansenc 498*59599516SKenneth E. Jansencad The redistancing equation can be written in the following form 499*59599516SKenneth E. Jansencad 500*59599516SKenneth E. Jansencad d_{,t} + sign(phi)*( d_{,i}/|d_{,i}| )* d_{,i} = sign(phi) 501*59599516SKenneth E. Jansencad 502*59599516SKenneth E. Jansencad This is rewritten in the form 503*59599516SKenneth E. Jansencad 504*59599516SKenneth E. Jansencad d_{,t} + u * d_{,i} = sign(phi) 505*59599516SKenneth E. Jansencad 506*59599516SKenneth E. Jansen 507*59599516SKenneth E. Jansenc$$$CAD For the redistancing equation the "pseudo velocity" term is 508*59599516SKenneth E. Jansenc$$$CAD calculated as follows 509*59599516SKenneth E. Jansen 510*59599516SKenneth E. Jansen 511*59599516SKenneth E. Jansen 512*59599516SKenneth E. Jansen mytmp = srcp / sqrt ( g1yti * g1yti 513*59599516SKenneth E. Jansen & + g2yti * g2yti 514*59599516SKenneth E. Jansen & + g3yti * g3yti) 515*59599516SKenneth E. Jansen 516*59599516SKenneth E. Jansen u1 = mytmp * g1yti 517*59599516SKenneth E. Jansen u2 = mytmp * g2yti 518*59599516SKenneth E. Jansen u3 = mytmp * g3yti 519*59599516SKenneth E. Jansen endif 520*59599516SKenneth E. Jansen 521*59599516SKenneth E. Jansenc 522*59599516SKenneth E. Jansenc.... ires = 1 or 3 523*59599516SKenneth E. Jansenc 524*59599516SKenneth E. Jansen if ((ires .eq. 1) .or. (ires .eq. 3)) then 525*59599516SKenneth E. Jansen 526*59599516SKenneth E. Jansenc.... -------------------------> convective <------------------------ 527*59599516SKenneth E. Jansenc 528*59599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),0) ) 529*59599516SKenneth E. Jansen un = bnorm(:,1)*u1 + bnorm(:,2)*u2 + bnorm(:,3)*u3 530*59599516SKenneth E. Jansen rou = rho * ( un ) 531*59599516SKenneth E. Jansen elsewhere 532*59599516SKenneth E. Jansen un = (rou / rho) 533*59599516SKenneth E. Jansen endwhere 534*59599516SKenneth E. Jansenc 535*59599516SKenneth E. Jansenc.... calculate flux where unconstrained 536*59599516SKenneth E. Jansenc 537*59599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),ib) ) 538*59599516SKenneth E. Jansen F = Sclr *rou 539*59599516SKenneth E. Jansen endwhere 540*59599516SKenneth E. Jansenc 541*59599516SKenneth E. Jansenc.... get the material properties 542*59599516SKenneth E. Jansenc 543*59599516SKenneth E. Jansen 544*59599516SKenneth E. Jansen call getDiffSclr (T, cp, rmu, 545*59599516SKenneth E. Jansen & rlm, rlm2mu, con, rho, Sclr) 546*59599516SKenneth E. Jansen 547*59599516SKenneth E. Jansenc 548*59599516SKenneth E. Jansenc.... ----------> DiffFlux for Scalar Variable <-------- 549*59599516SKenneth E. Jansenc 550*59599516SKenneth E. Jansen if (ilset.ne.2) then 551*59599516SKenneth E. Jansen 552*59599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),ib) ) 553*59599516SKenneth E. Jansen Sclrn = bnorm(:,1) * g1yti(:) 554*59599516SKenneth E. Jansen & + bnorm(:,2) * g2yti(:) 555*59599516SKenneth E. Jansen & + bnorm(:,3) * g3yti(:) 556*59599516SKenneth E. JansenC 557*59599516SKenneth E. Jansen 558*59599516SKenneth E. Jansenc F = F + rmu*Sclrn !!!! CHECK THIS 559*59599516SKenneth E. Jansen 560*59599516SKenneth E. Jansen F = F + saSigmaInv*rho*((rmu/rho)+Sclr)*Sclrn!confirm the modificationc in getdiffsclr 561*59599516SKenneth E. Jansen 562*59599516SKenneth E. Jansenc.....this modification of viscosity goes in getdiffsclr 563*59599516SKenneth E. Jansen 564*59599516SKenneth E. Jansen endwhere 565*59599516SKenneth E. Jansen endif 566*59599516SKenneth E. Jansenc 567*59599516SKenneth E. Jansenc.... end of ires = 1 or 3 568*59599516SKenneth E. Jansenc 569*59599516SKenneth E. Jansen endif 570*59599516SKenneth E. Jansenc 571*59599516SKenneth E. Jansenc.... -------------------------> Residual <-------------------------- 572*59599516SKenneth E. Jansenc 573*59599516SKenneth E. Jansenc.... add the flux to the residual 574*59599516SKenneth E. Jansenc 575*59599516SKenneth E. Jansen if ((ires .eq. 1) .or. (ires .eq. 3)) then 576*59599516SKenneth E. Jansen if (iconvsclr.eq.1) then !conservative boundary integral 577*59599516SKenneth E. Jansen do n = 1, nshlb 578*59599516SKenneth E. Jansen nodlcl = lnode(n) 579*59599516SKenneth E. Jansen rtl(:,nodlcl) = rtl(:,nodlcl) 580*59599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F 581*59599516SKenneth E. Jansen enddo 582*59599516SKenneth E. Jansen flops = flops + 12*nshlb*npro 583*59599516SKenneth E. Jansen endif 584*59599516SKenneth E. Jansen endif 585*59599516SKenneth E. Jansenc 586*59599516SKenneth E. Jansenc.... add the flux to the modified residual 587*59599516SKenneth E. Jansenc 588*59599516SKenneth E. Jansenc if (((ires .eq. 2) .or. (ires .eq. 3)) 589*59599516SKenneth E. Jansenc & .and. (Navier .eq. 1) .and. (Jactyp .eq. 1)) then 590*59599516SKenneth E. Jansenc 591*59599516SKenneth E. Jansenc do n = 1, nenbl 592*59599516SKenneth E. Jansenc nodlcl = lnode(n) 593*59599516SKenneth E. Jansenc 594*59599516SKenneth E. Jansenc rml(:,nodlcl,2) = rml(:,nodlcl,2) - WdetJb * 595*59599516SKenneth E. Jansenc & shpb(nodlcl,intp) * Fv2 596*59599516SKenneth E. Jansenc rml(:,nodlcl,3) = rml(:,nodlcl,3) - WdetJb * 597*59599516SKenneth E. Jansenc & shpb(nodlcl,intp) * Fv3 598*59599516SKenneth E. Jansenc rml(:,nodlcl,4) = rml(:,nodlcl,4) - WdetJb * 599*59599516SKenneth E. Jansenc & shpb(nodlcl,intp) * Fv4 600*59599516SKenneth E. Jansenc rml(:,nodlcl,5) = rml(:,nodlcl,5) - WdetJb * 601*59599516SKenneth E. Jansenc & shpb(nodlcl,intp) * (Fv5 - Fh5) 602*59599516SKenneth E. Jansenc enddo 603*59599516SKenneth E. Jansenc 604*59599516SKenneth E. Jansenc flops = flops + 11*nenbl*npro 605*59599516SKenneth E. Jansenc 606*59599516SKenneth E. Jansenc endif 607*59599516SKenneth E. Jansenc 608*59599516SKenneth E. Jansen 609*59599516SKenneth E. Jansenc 610*59599516SKenneth E. Jansenc.... end of integration loop 611*59599516SKenneth E. Jansenc 612*59599516SKenneth E. Jansen enddo 613*59599516SKenneth E. Jansen 614*59599516SKenneth E. Jansen ttim(40) = ttim(40) + tmr() 615*59599516SKenneth E. Jansenc 616*59599516SKenneth E. Jansenc.... return 617*59599516SKenneth E. Jansenc 618*59599516SKenneth E. Jansen return 619*59599516SKenneth E. Jansen end 620*59599516SKenneth E. Jansen 621