159599516SKenneth E. Jansen subroutine e3b (yl, ycl, iBCB, BCB, shpb, shglb, 2513954efSKenneth E. Jansen & xlb, rl, rml, sgn, EGmass) 359599516SKenneth E. Jansenc 459599516SKenneth E. Jansenc---------------------------------------------------------------------- 559599516SKenneth E. Jansenc 659599516SKenneth E. Jansenc This routine calculates the 3D RHS residual of the fluid boundary 759599516SKenneth E. Jansenc elements. 859599516SKenneth E. Jansenc 959599516SKenneth E. Jansenc input: 1059599516SKenneth E. Jansenc yl (npro,nshl,nflow) : Y variables (perturbed, no scalars) 1159599516SKenneth E. Jansenc ycl (npro,nshl,ndof) : Y variables 1259599516SKenneth E. Jansenc iBCB (npro,ndiBCB) : boundary condition code (iBCB(:,1) is 1359599516SKenneth E. Jansenc a bit tested boundary integral flag i.e. 1459599516SKenneth E. Jansenc if set to value of BCB if set to floating value 1559599516SKenneth E. Jansenc iBCB(:,1) : convective flux * 1 0 (ditto to all below) 1659599516SKenneth E. Jansenc pressure flux * 2 1759599516SKenneth E. Jansenc viscous flux * 4 1859599516SKenneth E. Jansenc heat flux * 8 1959599516SKenneth E. Jansenc turbulence wall * 16 2059599516SKenneth E. Jansenc scalarI flux * 16*2^I 2159599516SKenneth E. Jansenc (where I is the scalar number) 2259599516SKenneth E. Jansenc 2359599516SKenneth E. Jansenc iBCB(:,2) is the srfID given by the user in MGI that we will 2459599516SKenneth E. Jansenc collect integrated fluxes for. 2559599516SKenneth E. Jansenc 2659599516SKenneth E. Jansenc BCB (npro,nshlb,ndBCB) : Boundary Condition values 2759599516SKenneth E. Jansenc BCB (1) : mass flux 2859599516SKenneth E. Jansenc BCB (2) : pressure 2959599516SKenneth E. Jansenc BCB (3) : viscous flux in x1-direc. 3059599516SKenneth E. Jansenc BCB (4) : viscous flux in x2-direc. 3159599516SKenneth E. Jansenc BCB (5) : viscous flux in x3-direc. 3259599516SKenneth E. Jansenc BCB (6) : heat flux 3359599516SKenneth E. Jansenc shpb (nshl,ngaussb) : boundary element shape-functions 3459599516SKenneth E. Jansenc shglb (nsd,nshl,ngaussb) : boundary element grad-shape-functions 3559599516SKenneth E. Jansenc xlb (npro,nenl,nsd) : nodal coordinates at current step 3659599516SKenneth E. Jansenc 3759599516SKenneth E. Jansenc output: 3859599516SKenneth E. Jansenc rl (npro,nshl,nflow) : element residual 3959599516SKenneth E. Jansenc rml (npro,nshl,nflow) : element modified residual 40513954efSKenneth E. Jansenc EGmass (npro,nshl,nshl) : LHS from BC for energy-temperature diagonal 4159599516SKenneth E. Jansenc 4259599516SKenneth E. Jansenc 4359599516SKenneth E. Jansenc Note: Always the first side of the element is on the boundary. 4459599516SKenneth E. Jansenc However, note that for higher-order elements the nodes on 4559599516SKenneth E. Jansenc the boundary side are not the first nshlb nodes, see the 4659599516SKenneth E. Jansenc array lnode. 4759599516SKenneth E. Jansenc 4859599516SKenneth E. Jansenc 4959599516SKenneth E. Jansenc Zdenek Johan, Summer 1990. (Modified from e2b.f) 5059599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 5159599516SKenneth E. Jansenc Anilkumar Karanam Spring 2000 (Modified for Hierarchic Hexes) 5259599516SKenneth E. Jansenc---------------------------------------------------------------------- 5359599516SKenneth E. Jansenc 5459599516SKenneth E. Jansen include "common.h" 5559599516SKenneth E. Jansenc 5659599516SKenneth E. Jansen dimension yl(npro,nshl,nflow), iBCB(npro,ndiBCB), 5759599516SKenneth E. Jansen & ycl(npro,nshl,ndof), 5859599516SKenneth E. Jansen & BCB(npro,nshlb,ndBCB), shpb(nshl,ngaussb), 5959599516SKenneth E. Jansen & shglb(nsd,nshl,ngaussb), 6059599516SKenneth E. Jansen & xlb(npro,nenl,nsd), 6159599516SKenneth E. Jansen & rl(npro,nshl,nflow), rml(npro,nshl,nflow) 6259599516SKenneth E. Jansenc 6359599516SKenneth E. Jansen dimension g1yi(npro,nflow), g2yi(npro,nflow), 6459599516SKenneth E. Jansen & g3yi(npro,nflow), WdetJb(npro), 65513954efSKenneth E. Jansen & bnorm(npro,nsd), 66513954efSKenneth E. Jansen & dNadx(npro, nshl, nsd), !shape function gradient 67513954efSKenneth E. Jansen & dNadn(npro, nshl), !dN_a/dx_i n_i, i.e. gradient normal to wall 68513954efSKenneth E. Jansen & EGmass(npro, nshl, nshl) 6959599516SKenneth E. Jansenc 7059599516SKenneth E. Jansen dimension un(npro), rk(npro), 7159599516SKenneth E. Jansen & u1(npro), u2(npro), 7259599516SKenneth E. Jansen & u3(npro), 7359599516SKenneth E. Jansen & rho(npro), pres(npro), 7459599516SKenneth E. Jansen & T(npro), ei(npro), 7559599516SKenneth E. Jansen & cp(npro) 7659599516SKenneth E. Jansenc 7759599516SKenneth E. Jansen dimension rou(npro), p(npro), 7859599516SKenneth E. Jansen & F1(npro), F2(npro), 7959599516SKenneth E. Jansen & F3(npro), F4(npro), 8059599516SKenneth E. Jansen & F5(npro), Fv2(npro), 8159599516SKenneth E. Jansen & Fv3(npro), Fv4(npro), 8259599516SKenneth E. Jansen & Fv5(npro), Fh5(npro) 8359599516SKenneth E. Jansenc 8459599516SKenneth E. Jansen dimension rmu(npro), rlm(npro), 8559599516SKenneth E. Jansen & rlm2mu(npro), con(npro), 8659599516SKenneth E. Jansen & tau1n(npro), 8759599516SKenneth E. Jansen & tau2n(npro), tau3n(npro), 8859599516SKenneth E. Jansen & heat(npro) 8959599516SKenneth E. Jansenc 9059599516SKenneth E. Jansen dimension lnode(27), sgn(npro,nshl), 9159599516SKenneth E. Jansen & shape(npro,nshl), shdrv(npro,nsd,nshl) 9259599516SKenneth E. Jansenc 9359599516SKenneth E. Jansen dimension xmudum(npro,ngauss) 94513954efSKenneth E. Jansen integer aa, b 9559599516SKenneth E. Jansen 9659599516SKenneth E. Jansen ttim(40) = ttim(40) - secs(0.0) 9759599516SKenneth E. Jansen 9859599516SKenneth E. Jansenc 9959599516SKenneth E. Jansenc.... compute the nodes which lie on the boundary 10059599516SKenneth E. Jansenc 10159599516SKenneth E. Jansen call getbnodes(lnode) 10259599516SKenneth E. Jansen 10359599516SKenneth E. Jansenc.... loop through the integration points 10459599516SKenneth E. Jansen 10559599516SKenneth E. Jansen if(lcsyst.eq.3.or.lcsyst.eq.4) then 10659599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 10759599516SKenneth E. Jansen else 10859599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 10959599516SKenneth E. Jansen endif 11059599516SKenneth E. Jansen 11159599516SKenneth E. Jansen do intp = 1, ngaussb 11259599516SKenneth E. Jansenc 11359599516SKenneth E. Jansenc.... if Det. .eq. 0, do not include this point 11459599516SKenneth E. Jansenc 11559599516SKenneth E. Jansen if (Qwtb(lcsyst,intp) .eq. zero) cycle ! precaution 11659599516SKenneth E. Jansenc 11759599516SKenneth E. Jansenc.... create a matrix of shape functions (and derivatives) for each 11859599516SKenneth E. Jansenc element at this quadrature point. These arrays will contain 11959599516SKenneth E. Jansenc the correct signs for the hierarchic basis 12059599516SKenneth E. Jansenc 12159599516SKenneth E. Jansenc 12259599516SKenneth E. Jansen call getshpb(shpb, shglb, sgn, 12359599516SKenneth E. Jansen & shape, shdrv) 12459599516SKenneth E. Jansenc 12559599516SKenneth E. Jansenc.... calculate the integration variables 12659599516SKenneth E. Jansenc 12759599516SKenneth E. Jansen call e3bvar (yl, ycl, BCB, shape, 12859599516SKenneth E. Jansen & shdrv, xlb, 12959599516SKenneth E. Jansen & lnode, g1yi, 13059599516SKenneth E. Jansen & g2yi, g3yi, WdetJb, 13159599516SKenneth E. Jansen & bnorm, pres, T, 13259599516SKenneth E. Jansen & u1, u2, u3, 13359599516SKenneth E. Jansen & rho, ei, cp, 13459599516SKenneth E. Jansen & rk, rou, p, 13559599516SKenneth E. Jansen & Fv2, Fv3, Fv4, 136513954efSKenneth E. Jansen & Fh5, dNadx) 13759599516SKenneth E. Jansenc 13859599516SKenneth E. Jansenc.... ires = 1 or 3 13959599516SKenneth E. Jansenc 14059599516SKenneth E. Jansen if ((ires .eq. 1) .or. (ires .eq. 3)) then 14159599516SKenneth E. Jansenc 14259599516SKenneth E. Jansenc.... clear some variables 14359599516SKenneth E. Jansenc 14459599516SKenneth E. Jansen tau1n = zero 14559599516SKenneth E. Jansen tau2n = zero 14659599516SKenneth E. Jansen tau3n = zero 14759599516SKenneth E. Jansen heat = zero 14859599516SKenneth E. Jansenc 14959599516SKenneth E. Jansenc.... -------------------------> convective <------------------------ 15059599516SKenneth E. Jansenc 15159599516SKenneth E. Jansenc 15259599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),0) ) 15359599516SKenneth E. Jansen un = bnorm(:,1) * u1 + bnorm(:,2) * u2 + bnorm(:,3) * u3 15459599516SKenneth E. Jansen rou = rho * ( un ) 15559599516SKenneth E. Jansen elsewhere 15659599516SKenneth E. Jansen un = (rou / rho) 15759599516SKenneth E. Jansen endwhere 15859599516SKenneth E. Jansenc 15959599516SKenneth E. Jansenc.... -------------------------> pressure <-------------------------- 16059599516SKenneth E. Jansenc 16159599516SKenneth E. Jansenc.... use one-point quadrature in time 16259599516SKenneth E. Jansenc 16359599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),1)) p = pres 16459599516SKenneth E. Jansenc 16559599516SKenneth E. Jansenc.... add the Euler contribution 16659599516SKenneth E. Jansenc 16759599516SKenneth E. Jansen F1 = rou 16859599516SKenneth E. Jansen F2 = rou * u1 + bnorm(:,1) * p 16959599516SKenneth E. Jansen F3 = rou * u2 + bnorm(:,2) * p 17059599516SKenneth E. Jansen F4 = rou * u3 + bnorm(:,3) * p 17159599516SKenneth E. Jansen F5 = rou * (ei + rk) + un * p 17259599516SKenneth E. Jansenc 17359599516SKenneth E. Jansenc.... flop count 17459599516SKenneth E. Jansenc 175f4d0b58bSKenneth E. Jansen! flops = flops + 23*npro 17659599516SKenneth E. Jansenc 17759599516SKenneth E. Jansenc.... end of ires = 1 or 3 17859599516SKenneth E. Jansenc 17959599516SKenneth E. Jansen endif 18059599516SKenneth E. Jansenc 18159599516SKenneth E. Jansenc.... -----------------------> Navier-Stokes <----------------------- 18259599516SKenneth E. Jansenc 18359599516SKenneth E. Jansen if (Navier .eq. 1) then 18459599516SKenneth E. Jansen 18559599516SKenneth E. Jansen xmudum = zero 18659599516SKenneth E. Jansen 18759599516SKenneth E. Jansenc 18859599516SKenneth E. Jansenc.... get the material properties 18959599516SKenneth E. Jansenc 19059599516SKenneth E. Jansen call getDiff (T, cp, rho, ycl, 19159599516SKenneth E. Jansen & rmu, rlm, rlm2mu, con, shape, 192513954efSKenneth E. Jansen & xmudum, xlb) 19359599516SKenneth E. Jansenc 19459599516SKenneth E. Jansenc.... ------------------------> viscous flux <------------------------ 19559599516SKenneth E. Jansenc 19659599516SKenneth E. Jansenc.... floating viscous flux 19759599516SKenneth E. Jansenc 19859599516SKenneth E. Jansen tau1n = bnorm(:,1) * (rlm2mu* g1yi(:,2) + rlm *g2yi(:,3) 19959599516SKenneth E. Jansen & + rlm *g3yi(:,4)) 20059599516SKenneth E. Jansen & + bnorm(:,2) * (rmu *(g2yi(:,2) + g1yi(:,3))) 20159599516SKenneth E. Jansen & + bnorm(:,3) * (rmu *(g3yi(:,2) + g1yi(:,4))) 20259599516SKenneth E. Jansen tau2n = bnorm(:,1) * (rmu *(g2yi(:,2) + g1yi(:,3))) 20359599516SKenneth E. Jansen & + bnorm(:,2) * (rlm * g1yi(:,2) + rlm2mu*g2yi(:,3) 20459599516SKenneth E. Jansen & + rlm *g3yi(:,4)) 20559599516SKenneth E. Jansen & + bnorm(:,3) * (rmu *(g3yi(:,3) + g2yi(:,4))) 20659599516SKenneth E. Jansen tau3n = bnorm(:,1) * (rmu *(g3yi(:,2) + g1yi(:,4))) 20759599516SKenneth E. Jansen & + bnorm(:,2) * (rmu *(g3yi(:,3) + g2yi(:,4))) 20859599516SKenneth E. Jansen & + bnorm(:,3) * (rlm * g1yi(:,2) + rlm *g2yi(:,3) 20959599516SKenneth E. Jansen & + rlm2mu*g3yi(:,4)) 21059599516SKenneth E. Jansenc 21159599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),2) ) 21259599516SKenneth E. Jansen Fv2 = tau1n ! wherever traction is not set, use the 21359599516SKenneth E. Jansen Fv3 = tau2n ! viscous flux calculated from the field 21459599516SKenneth E. Jansen Fv4 = tau3n ! 21559599516SKenneth E. Jansen endwhere 21659599516SKenneth E. Jansenc 21759599516SKenneth E. Jansen Fv5 = u1 * Fv2 + u2 * Fv3 + u3 * Fv4 21859599516SKenneth E. Jansenc 21959599516SKenneth E. Jansenc.... --------------------------> heat flux <------------------------- 22059599516SKenneth E. Jansenc 22159599516SKenneth E. Jansenc.... floating heat flux 22259599516SKenneth E. Jansenc 223*8555394cSKenneth E. Jansen heat = -con * ( bnorm(:,1) * g1yi(:,5) + 22459599516SKenneth E. Jansen & bnorm(:,2) * g2yi(:,5) + 22559599516SKenneth E. Jansen & bnorm(:,3) * g3yi(:,5) ) 226513954efSKenneth E. Jansen 227513954efSKenneth E. Jansen !Note that Fh5 already contains heat flux BCs from e3bvar 22859599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),3) ) Fh5 = heat 229513954efSKenneth E. Jansen 230513954efSKenneth E. Jansen 231513954efSKenneth E. Jansen 232513954efSKenneth E. Jansen if(iLHScond > 0) then !compute contributions to the LHS matrix 233513954efSKenneth E. Jansen do aa = 1, nshl 234513954efSKenneth E. Jansen dNadn(:,aa) = dNadx(:,aa,1)*bnorm(:,1) 235513954efSKenneth E. Jansen & + dNadx(:,aa,2)*bnorm(:,2) 236513954efSKenneth E. Jansen & + dNadx(:,aa,3)*bnorm(:,3) 237513954efSKenneth E. Jansen enddo 238513954efSKenneth E. Jansen 239513954efSKenneth E. Jansen !EGmass(e, b, a) using the newer nomenclature, i.e. b indexes 240513954efSKenneth E. Jansen !the matrix row and a indexes the matrix column. 241513954efSKenneth E. Jansen 242513954efSKenneth E. Jansen !Calculate \kappa 243513954efSKenneth E. Jansen do aa = 1,nshl 244513954efSKenneth E. Jansen do b = 1,nshl 245513954efSKenneth E. Jansen EGmass(:,b, aa) = con * WdetJb * shape(:,b) * dNadn(:,aa) 246513954efSKenneth E. Jansen enddo 247513954efSKenneth E. Jansen enddo 248513954efSKenneth E. Jansen 249513954efSKenneth E. Jansen endif !iLHScond >= 0 or contributions to lhsk are being computed. 25059599516SKenneth E. Jansenc 25159599516SKenneth E. Jansenc.... add the Navier-Stokes contribution 25259599516SKenneth E. Jansenc 25359599516SKenneth E. Jansen F2 = F2 - Fv2 25459599516SKenneth E. Jansen F3 = F3 - Fv3 25559599516SKenneth E. Jansen F4 = F4 - Fv4 25659599516SKenneth E. Jansen F5 = F5 - Fv5 + Fh5 25759599516SKenneth E. Jansenc 25859599516SKenneth E. Jansenc.... flop count 25959599516SKenneth E. Jansenc 260f4d0b58bSKenneth E. Jansen! flops = flops + 27*npro 26159599516SKenneth E. Jansenc 26259599516SKenneth E. Jansenc.... end of Navier Stokes part 26359599516SKenneth E. Jansenc 26459599516SKenneth E. Jansen endif 26559599516SKenneth E. Jansenc 26659599516SKenneth E. Jansenc.... -------------------------> Residual <-------------------------- 26759599516SKenneth E. Jansenc 26859599516SKenneth E. Jansenc.... add the flux to the residual 26959599516SKenneth E. Jansenc 27059599516SKenneth E. Jansen if ((ires .eq. 1) .or. (ires .eq. 3)) then 27159599516SKenneth E. Jansenc 27259599516SKenneth E. Jansenc 27359599516SKenneth E. Jansen do n = 1, nshlb 274513954efSKenneth E. Jansen !Note that nshlb is different from the dimension of rl and 275513954efSKenneth E. Jansen !shape. For tets, the weight of the 4th node is zero. 27659599516SKenneth E. Jansen nodlcl = lnode(n) 27759599516SKenneth E. Jansenc 27859599516SKenneth E. Jansen rl(:,nodlcl,1) = rl(:,nodlcl,1) 27959599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F1 28059599516SKenneth E. Jansen rl(:,nodlcl,2) = rl(:,nodlcl,2) 28159599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F2 28259599516SKenneth E. Jansen rl(:,nodlcl,3) = rl(:,nodlcl,3) 28359599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F3 28459599516SKenneth E. Jansen rl(:,nodlcl,4) = rl(:,nodlcl,4) 28559599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F4 28659599516SKenneth E. Jansen rl(:,nodlcl,5) = rl(:,nodlcl,5) 28759599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F5 28859599516SKenneth E. Jansen enddo 28959599516SKenneth E. Jansenc 290f4d0b58bSKenneth E. Jansen! flops = flops + 12*nshlb*npro 29159599516SKenneth E. Jansenc 29259599516SKenneth E. Jansen endif 29359599516SKenneth E. Jansenc 29459599516SKenneth E. Jansenc.... add the flux to the modified residual 29559599516SKenneth E. Jansenc 29659599516SKenneth E. Jansen if (((ires .eq. 2) .or. (ires .eq. 3)) 29759599516SKenneth E. Jansen & .and. (Navier .eq. 1) .and. (Jactyp .eq. 1)) then 29859599516SKenneth E. Jansenc 29959599516SKenneth E. Jansen do n = 1, nshlb 30059599516SKenneth E. Jansen nodlcl = lnode(n) 30159599516SKenneth E. Jansenc 30259599516SKenneth E. Jansen rml(:,nodlcl,2) = rml(:,nodlcl,2) - WdetJb * 30359599516SKenneth E. Jansen & shape(:,nodlcl) * Fv2 30459599516SKenneth E. Jansen rml(:,nodlcl,3) = rml(:,nodlcl,3) - WdetJb * 30559599516SKenneth E. Jansen & shape(:,nodlcl) * Fv3 30659599516SKenneth E. Jansen rml(:,nodlcl,4) = rml(:,nodlcl,4) - WdetJb * 30759599516SKenneth E. Jansen & shape(:,nodlcl) * Fv4 30859599516SKenneth E. Jansen rml(:,nodlcl,5) = rml(:,nodlcl,5) - WdetJb * 30959599516SKenneth E. Jansen & shape(:,nodlcl) * (Fv5 - Fh5) 31059599516SKenneth E. Jansen enddo 31159599516SKenneth E. Jansenc 312f4d0b58bSKenneth E. Jansen! flops = flops + 11*nenbl*npro 31359599516SKenneth E. Jansenc 31459599516SKenneth E. Jansen endif 31559599516SKenneth E. Jansenc 31659599516SKenneth E. Jansenc uncomment and run 1 step to get estimate of wall shear vs z 31759599516SKenneth E. Jansenc 31859599516SKenneth E. Jansenc do i=1,npro 31959599516SKenneth E. Jansenc tnorm= sqrt(tau1n(i)*tau1n(i) 32059599516SKenneth E. Jansenc & +tau2n(i)*tau2n(i)+tau3n(i)*tau3n(i)) 32159599516SKenneth E. Jansenc 32259599516SKenneth E. Jansenc write(700+myrank,*) xlb(i,1,3),tnorm 32359599516SKenneth E. Jansenc enddo 32459599516SKenneth E. Jansen 32559599516SKenneth E. Jansen 32659599516SKenneth E. Jansen do iel = 1, npro 32759599516SKenneth E. Jansenc 32859599516SKenneth E. Jansenc if we have a nonzero value then 32959599516SKenneth E. Jansenc calculate the fluxes through this surface 33059599516SKenneth E. Jansenc 33159599516SKenneth E. Jansen iface = abs(iBCB(iel,2)) 33259599516SKenneth E. Jansen if (iface .ne. 0 .and. ires.ne.2) then 33359599516SKenneth E. Jansen flxID(1,iface) = flxID(1,iface) + WdetJb(iel)! measure area too 33459599516SKenneth E. Jansenc flxID(2,iface) = flxID(2,iface) - WdetJb(iel) * un(iel) 33559599516SKenneth E. Jansen flxID(2,iface) = flxID(2,iface) - WdetJb(iel) * rou(iel) 33659599516SKenneth E. Jansen flxID(3,iface) = flxID(3,iface) 33759599516SKenneth E. Jansen & - ( tau1n(iel) - bnorm(iel,1)*pres(iel)) 33859599516SKenneth E. Jansen & * WdetJb(iel) 33959599516SKenneth E. Jansen flxID(4,iface) = flxID(4,iface) 34059599516SKenneth E. Jansen & - ( tau2n(iel) - bnorm(iel,2)*pres(iel)) 34159599516SKenneth E. Jansen & * WdetJb(iel) 34259599516SKenneth E. Jansen flxID(5,iface) = flxID(5,iface) 34359599516SKenneth E. Jansen & - ( tau3n(iel) - bnorm(iel,3)*pres(iel)) 34459599516SKenneth E. Jansen & * WdetJb(iel) 34559599516SKenneth E. Jansen 34659599516SKenneth E. Jansen endif 34759599516SKenneth E. Jansen enddo 34859599516SKenneth E. Jansen 34959599516SKenneth E. Jansenc 35059599516SKenneth E. Jansenc.... --------------------> Aerodynamic Forces <--------------------- 35159599516SKenneth E. Jansenc 35259599516SKenneth E. Jansen if ((ires .ne. 2) .and. (iter .eq. nitr)) then 35359599516SKenneth E. Jansenc 35459599516SKenneth E. Jansenc.... compute the forces on the body 35559599516SKenneth E. Jansenc 35659599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),0) ) 35759599516SKenneth E. Jansen tau1n = ( pres * bnorm(:,1) - tau1n ) * WdetJb 35859599516SKenneth E. Jansen tau2n = ( pres * bnorm(:,2) - tau2n ) * WdetJb 35959599516SKenneth E. Jansen tau3n = ( pres * bnorm(:,3) - tau3n ) * WdetJb 36059599516SKenneth E. Jansen heat = - heat * WdetJb 36159599516SKenneth E. Jansen elsewhere 36259599516SKenneth E. Jansen tau1n = zero 36359599516SKenneth E. Jansen tau2n = zero 36459599516SKenneth E. Jansen tau3n = zero 36559599516SKenneth E. Jansen heat = zero 36659599516SKenneth E. Jansen endwhere 36759599516SKenneth E. Jansenc 36859599516SKenneth E. Jansen Force(1) = Force(1) + sum(tau1n) 36959599516SKenneth E. Jansen Force(2) = Force(2) + sum(tau2n) 37059599516SKenneth E. Jansen Force(3) = Force(3) + sum(tau3n) 37159599516SKenneth E. Jansen HFlux = HFlux + sum(heat) 37259599516SKenneth E. Jansenc 37359599516SKenneth E. Jansen endif 37459599516SKenneth E. Jansenc 37559599516SKenneth E. Jansenc.... end of integration loop 37659599516SKenneth E. Jansenc 37759599516SKenneth E. Jansen enddo 37859599516SKenneth E. Jansen 37959599516SKenneth E. Jansen ttim(40) = ttim(40) + secs(0.0) 38059599516SKenneth E. Jansenc 38159599516SKenneth E. Jansenc.... return 38259599516SKenneth E. Jansenc 38359599516SKenneth E. Jansen return 38459599516SKenneth E. Jansen end 38559599516SKenneth E. Jansenc 38659599516SKenneth E. Jansenc 38759599516SKenneth E. Jansenc 38859599516SKenneth E. Jansen subroutine e3bSclr (ycl, iBCB, BCB, 38959599516SKenneth E. Jansen & shpb, shglb, sgn, 39059599516SKenneth E. Jansen & xlb, rtl, rmtl) 39159599516SKenneth E. Jansenc 39259599516SKenneth E. Jansenc---------------------------------------------------------------------- 39359599516SKenneth E. Jansenc 39459599516SKenneth E. Jansenc This routine calculates the 3D RHS residual of the fluid boundary 39559599516SKenneth E. Jansenc elements. 39659599516SKenneth E. Jansenc 39759599516SKenneth E. Jansenc input: 39859599516SKenneth E. Jansenc ycl (npro,nshl,ndof) : Y variables 39959599516SKenneth E. Jansenc iBCB (npro,ndiBCB) : boundary condition code & surfID 40059599516SKenneth E. Jansenc BCB (npro,nenbl,ndBCB) : Boundary Condition values 40159599516SKenneth E. Jansenc BCB (1) : mass flux 40259599516SKenneth E. Jansenc BCB (2) : pressure 40359599516SKenneth E. Jansenc BCB (3) : viscous flux in x1-direc. 40459599516SKenneth E. Jansenc BCB (4) : viscous flux in x2-direc. 40559599516SKenneth E. Jansenc BCB (5) : viscous flux in x3-direc. 40659599516SKenneth E. Jansenc BCB (6) : heat flux 40759599516SKenneth E. Jansenc BCB (7) : eddy visc flux 40859599516SKenneth E. Jansenc shpb (nen,nintg) : boundary element shape-functions 40959599516SKenneth E. Jansenc shglb (nsd,nen,nintg) : boundary element grad-shape-functions 41059599516SKenneth E. Jansenc xlb (npro,nenl,nsd) : nodal coordinates at current step 41159599516SKenneth E. Jansenc 41259599516SKenneth E. Jansenc output: 41359599516SKenneth E. Jansenc rtl (npro,nenl,nflow) : element residual 41459599516SKenneth E. Jansenc rmtl (npro,nenl,nflow) : element modified residual 41559599516SKenneth E. Jansenc 41659599516SKenneth E. Jansenc 41759599516SKenneth E. Jansenc Note: Always the first side of the element is on the boundary. 41859599516SKenneth E. Jansenc However, note that for higher-order elements the nodes on 41959599516SKenneth E. Jansenc the boundary side are not the first nenbl nodes, see the 42059599516SKenneth E. Jansenc array mnodeb. 42159599516SKenneth E. Jansenc 42259599516SKenneth E. Jansenc 42359599516SKenneth E. Jansenc Zdenek Johan, Summer 1990. (Modified from e2b.f) 42459599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 42559599516SKenneth E. Jansenc---------------------------------------------------------------------- 42659599516SKenneth E. Jansenc 42759599516SKenneth E. Jansen use turbSA ! for saSigma 42859599516SKenneth E. Jansen include "common.h" 42959599516SKenneth E. Jansenc 43059599516SKenneth E. Jansen dimension ycl(npro,nshl,ndof), iBCB(npro,ndiBCB), 43159599516SKenneth E. Jansen & BCB(npro,nshlb,ndBCB), shpb(nshl,ngaussb), 43259599516SKenneth E. Jansen & shglb(nsd,nshl,ngaussb), sgn(npro,nshl), 43359599516SKenneth E. Jansen & xlb(npro,nenl,nsd), shape(npro,nshl), 43459599516SKenneth E. Jansen & rtl(npro,nshl), rmtl(npro,nshl), 43559599516SKenneth E. Jansen & shdrv(npro,nsd,nshl) 43659599516SKenneth E. Jansenc 43759599516SKenneth E. Jansen dimension u1(npro), u2(npro), 43859599516SKenneth E. Jansen & u3(npro), 43959599516SKenneth E. Jansen & g1yti(npro), g2yti(npro), 44059599516SKenneth E. Jansen & g3yti(npro), WdetJb(npro), 44159599516SKenneth E. Jansen & bnorm(npro,nsd) 44259599516SKenneth E. Jansenc 44359599516SKenneth E. Jansen dimension rho(npro), Sclr(npro), 44459599516SKenneth E. Jansen & T(npro), cp(npro) 44559599516SKenneth E. Jansenc 44659599516SKenneth E. Jansen dimension rou(npro), F(npro), 44759599516SKenneth E. Jansen & un(npro), Sclrn(npro) 44859599516SKenneth E. Jansenc 44959599516SKenneth E. Jansen dimension rmu(npro), rlm(npro), 45059599516SKenneth E. Jansen & rlm2mu(npro), con(npro), 45159599516SKenneth E. Jansen & heat(npro), srcp(npro) 45259599516SKenneth E. Jansenc 45359599516SKenneth E. Jansen dimension lnode(27) 45459599516SKenneth E. Jansen real*8 sign_levelset(npro), sclr_ls(npro), mytmp(npro) 45559599516SKenneth E. Jansen ttim(40) = ttim(40) - tmr() 45659599516SKenneth E. Jansenc 45759599516SKenneth E. Jansenc.... get the boundary nodes 45859599516SKenneth E. Jansenc 45959599516SKenneth E. Jansen id = isclr + 5 46059599516SKenneth E. Jansen ib = isclr + 4 46159599516SKenneth E. Jansen ibb = isclr + 6 46259599516SKenneth E. Jansen call getbnodes(lnode) 46359599516SKenneth E. Jansenc 46459599516SKenneth E. Jansenc.... loop through the integration points 46559599516SKenneth E. Jansenc 46659599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 46759599516SKenneth E. Jansenc 46859599516SKenneth E. Jansen do intp = 1, ngaussb 46959599516SKenneth E. Jansenc 47059599516SKenneth E. Jansenc.... if Det. .eq. 0, do not include this point 47159599516SKenneth E. Jansenc 47259599516SKenneth E. Jansen if (Qwtb(lcsyst,intp) .eq. zero) cycle ! precaution 47359599516SKenneth E. Jansenc 47459599516SKenneth E. Jansenc.... create a matrix of shape functions (and derivatives) for each 47559599516SKenneth E. Jansenc element at this quadrature point. These arrays will contain 47659599516SKenneth E. Jansenc the correct signs for the hierarchic basis 47759599516SKenneth E. Jansenc 47859599516SKenneth E. Jansen call getshpb(shpb, shglb, sgn, 47959599516SKenneth E. Jansen & shape, shdrv) 48059599516SKenneth E. Jansenc 48159599516SKenneth E. Jansenc.... calculate the integraton variables 48259599516SKenneth E. Jansenc 48359599516SKenneth E. Jansen call e3bvarSclr (ycl, BCB, 48459599516SKenneth E. Jansen & shape, shdrv, 48559599516SKenneth E. Jansen & xlb, lnode, u1, 48659599516SKenneth E. Jansen & u2, u3, g1yti, 48759599516SKenneth E. Jansen & g2yti, g3yti, WdetJb, 48859599516SKenneth E. Jansen & bnorm, T, rho, 48959599516SKenneth E. Jansen & cp, rou, Sclr, 49059599516SKenneth E. Jansen & F) 49159599516SKenneth E. Jansenc.......********************modification for Ilset=2********************** 49259599516SKenneth E. Jansen if (ilset.eq.2 .and. isclr.eq.2) then !we are redistancing level-sets 49359599516SKenneth E. Jansen 49459599516SKenneth E. JansenCAD If Sclr(:,1).gt.zero, result of sign_term function 1 49559599516SKenneth E. JansenCAD If Sclr(:,1).eq.zero, result of sign_term function 0 49659599516SKenneth E. JansenCAD If Sclr(:,1).lt.zero, result of sign_term function -1 49759599516SKenneth E. Jansen 49859599516SKenneth E. Jansen sclr_ls = zero !zero out temp variable 49959599516SKenneth E. Jansen 50059599516SKenneth E. Jansen do ii=1,npro 50159599516SKenneth E. Jansen 50259599516SKenneth E. Jansen do jj = 1, nshl ! first find the value of levelset at point ii 50359599516SKenneth E. Jansen 50459599516SKenneth E. Jansen sclr_ls(ii) = sclr_ls(ii) 50559599516SKenneth E. Jansen & + shape(ii,jj) * ycl(ii,jj,6) 50659599516SKenneth E. Jansen 50759599516SKenneth E. Jansen enddo 50859599516SKenneth E. Jansen if (sclr_ls(ii) .lt. - epsilon_ls)then 50959599516SKenneth E. Jansen 51059599516SKenneth E. Jansen sign_levelset(ii) = - one 51159599516SKenneth E. Jansen 51259599516SKenneth E. Jansen elseif (abs(sclr_ls(ii)) .le. epsilon_ls)then 51359599516SKenneth E. Jansenc 51459599516SKenneth E. Jansen sign_levelset(ii) =sclr_ls(ii)/epsilon_ls 51559599516SKenneth E. Jansen & + sin(pi*sclr_ls(ii)/epsilon_ls)/pi 51659599516SKenneth E. Jansen 51759599516SKenneth E. Jansen elseif (sclr_ls(ii) .gt. epsilon_ls) then 51859599516SKenneth E. Jansen 51959599516SKenneth E. Jansen sign_levelset(ii) = one 52059599516SKenneth E. Jansen 52159599516SKenneth E. Jansen endif 52259599516SKenneth E. Jansenc 52359599516SKenneth E. Jansen srcp(ii) = sign_levelset(ii) 52459599516SKenneth E. Jansenc 52559599516SKenneth E. Jansen enddo 52659599516SKenneth E. Jansenc 52759599516SKenneth E. Jansencad The redistancing equation can be written in the following form 52859599516SKenneth E. Jansencad 52959599516SKenneth E. Jansencad d_{,t} + sign(phi)*( d_{,i}/|d_{,i}| )* d_{,i} = sign(phi) 53059599516SKenneth E. Jansencad 53159599516SKenneth E. Jansencad This is rewritten in the form 53259599516SKenneth E. Jansencad 53359599516SKenneth E. Jansencad d_{,t} + u * d_{,i} = sign(phi) 53459599516SKenneth E. Jansencad 53559599516SKenneth E. Jansen 53659599516SKenneth E. Jansenc$$$CAD For the redistancing equation the "pseudo velocity" term is 53759599516SKenneth E. Jansenc$$$CAD calculated as follows 53859599516SKenneth E. Jansen 53959599516SKenneth E. Jansen 54059599516SKenneth E. Jansen 54159599516SKenneth E. Jansen mytmp = srcp / sqrt ( g1yti * g1yti 54259599516SKenneth E. Jansen & + g2yti * g2yti 54359599516SKenneth E. Jansen & + g3yti * g3yti) 54459599516SKenneth E. Jansen 54559599516SKenneth E. Jansen u1 = mytmp * g1yti 54659599516SKenneth E. Jansen u2 = mytmp * g2yti 54759599516SKenneth E. Jansen u3 = mytmp * g3yti 54859599516SKenneth E. Jansen endif 54959599516SKenneth E. Jansen 55059599516SKenneth E. Jansenc 55159599516SKenneth E. Jansenc.... ires = 1 or 3 55259599516SKenneth E. Jansenc 55359599516SKenneth E. Jansen if ((ires .eq. 1) .or. (ires .eq. 3)) then 55459599516SKenneth E. Jansen 55559599516SKenneth E. Jansenc.... -------------------------> convective <------------------------ 55659599516SKenneth E. Jansenc 55759599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),0) ) 55859599516SKenneth E. Jansen un = bnorm(:,1)*u1 + bnorm(:,2)*u2 + bnorm(:,3)*u3 55959599516SKenneth E. Jansen rou = rho * ( un ) 56059599516SKenneth E. Jansen elsewhere 56159599516SKenneth E. Jansen un = (rou / rho) 56259599516SKenneth E. Jansen endwhere 56359599516SKenneth E. Jansenc 56459599516SKenneth E. Jansenc.... calculate flux where unconstrained 56559599516SKenneth E. Jansenc 56659599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),ib) ) 56759599516SKenneth E. Jansen F = Sclr *rou 56859599516SKenneth E. Jansen endwhere 56959599516SKenneth E. Jansenc 57059599516SKenneth E. Jansenc.... get the material properties 57159599516SKenneth E. Jansenc 57259599516SKenneth E. Jansen 57359599516SKenneth E. Jansen call getDiffSclr (T, cp, rmu, 57459599516SKenneth E. Jansen & rlm, rlm2mu, con, rho, Sclr) 57559599516SKenneth E. Jansen 57659599516SKenneth E. Jansenc 57759599516SKenneth E. Jansenc.... ----------> DiffFlux for Scalar Variable <-------- 57859599516SKenneth E. Jansenc 57959599516SKenneth E. Jansen if (ilset.ne.2) then 58059599516SKenneth E. Jansen 58159599516SKenneth E. Jansen where (.not.btest(iBCB(:,1),ib) ) 58259599516SKenneth E. Jansen Sclrn = bnorm(:,1) * g1yti(:) 58359599516SKenneth E. Jansen & + bnorm(:,2) * g2yti(:) 58459599516SKenneth E. Jansen & + bnorm(:,3) * g3yti(:) 58559599516SKenneth E. JansenC 58659599516SKenneth E. Jansen 58759599516SKenneth E. Jansenc F = F + rmu*Sclrn !!!! CHECK THIS 58859599516SKenneth E. Jansen 58959599516SKenneth E. Jansen F = F + saSigmaInv*rho*((rmu/rho)+Sclr)*Sclrn!confirm the modificationc in getdiffsclr 59059599516SKenneth E. Jansen 59159599516SKenneth E. Jansenc.....this modification of viscosity goes in getdiffsclr 59259599516SKenneth E. Jansen 59359599516SKenneth E. Jansen endwhere 59459599516SKenneth E. Jansen endif 59559599516SKenneth E. Jansenc 59659599516SKenneth E. Jansenc.... end of ires = 1 or 3 59759599516SKenneth E. Jansenc 59859599516SKenneth E. Jansen endif 59959599516SKenneth E. Jansenc 60059599516SKenneth E. Jansenc.... -------------------------> Residual <-------------------------- 60159599516SKenneth E. Jansenc 60259599516SKenneth E. Jansenc.... add the flux to the residual 60359599516SKenneth E. Jansenc 60459599516SKenneth E. Jansen if ((ires .eq. 1) .or. (ires .eq. 3)) then 60559599516SKenneth E. Jansen if (iconvsclr.eq.1) then !conservative boundary integral 60659599516SKenneth E. Jansen do n = 1, nshlb 60759599516SKenneth E. Jansen nodlcl = lnode(n) 60859599516SKenneth E. Jansen rtl(:,nodlcl) = rtl(:,nodlcl) 60959599516SKenneth E. Jansen & + WdetJb * shape(:,nodlcl) * F 61059599516SKenneth E. Jansen enddo 611f4d0b58bSKenneth E. Jansen! flops = flops + 12*nshlb*npro 61259599516SKenneth E. Jansen endif 61359599516SKenneth E. Jansen endif 61459599516SKenneth E. Jansenc 61559599516SKenneth E. Jansenc.... add the flux to the modified residual 61659599516SKenneth E. Jansenc 61759599516SKenneth E. Jansenc if (((ires .eq. 2) .or. (ires .eq. 3)) 61859599516SKenneth E. Jansenc & .and. (Navier .eq. 1) .and. (Jactyp .eq. 1)) then 61959599516SKenneth E. Jansenc 62059599516SKenneth E. Jansenc do n = 1, nenbl 62159599516SKenneth E. Jansenc nodlcl = lnode(n) 62259599516SKenneth E. Jansenc 62359599516SKenneth E. Jansenc rml(:,nodlcl,2) = rml(:,nodlcl,2) - WdetJb * 62459599516SKenneth E. Jansenc & shpb(nodlcl,intp) * Fv2 62559599516SKenneth E. Jansenc rml(:,nodlcl,3) = rml(:,nodlcl,3) - WdetJb * 62659599516SKenneth E. Jansenc & shpb(nodlcl,intp) * Fv3 62759599516SKenneth E. Jansenc rml(:,nodlcl,4) = rml(:,nodlcl,4) - WdetJb * 62859599516SKenneth E. Jansenc & shpb(nodlcl,intp) * Fv4 62959599516SKenneth E. Jansenc rml(:,nodlcl,5) = rml(:,nodlcl,5) - WdetJb * 63059599516SKenneth E. Jansenc & shpb(nodlcl,intp) * (Fv5 - Fh5) 63159599516SKenneth E. Jansenc enddo 63259599516SKenneth E. Jansenc 633f4d0b58bSKenneth E. Jansenc ! flops = flops + 11*nenbl*npro 63459599516SKenneth E. Jansenc 63559599516SKenneth E. Jansenc endif 63659599516SKenneth E. Jansenc 63759599516SKenneth E. Jansen 63859599516SKenneth E. Jansenc 63959599516SKenneth E. Jansenc.... end of integration loop 64059599516SKenneth E. Jansenc 64159599516SKenneth E. Jansen enddo 64259599516SKenneth E. Jansen 64359599516SKenneth E. Jansen ttim(40) = ttim(40) + tmr() 64459599516SKenneth E. Jansenc 64559599516SKenneth E. Jansenc.... return 64659599516SKenneth E. Jansenc 64759599516SKenneth E. Jansen return 64859599516SKenneth E. Jansen end 64959599516SKenneth E. Jansen 650