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