xref: /phasta/phSolver/compressible/e3b.f (revision 8555394c6a5fc76a7de5bfab7b421d25774c86ff)
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