xref: /phasta/phSolver/incompressible/advLES.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen
2*59599516SKenneth E. Jansenc---------------------------------------------------------------------------
3*59599516SKenneth E. Jansen
4*59599516SKenneth E. Jansen      subroutine SUPGstress (y, ac, x, qres, ien, xmudmi,
5*59599516SKenneth E. Jansen     &     cdelsq, shgl, shp, Qwtf, shglo, shpo, stress, diss, vol)
6*59599516SKenneth E. Jansen
7*59599516SKenneth E. Jansen      use stats
8*59599516SKenneth E. Jansen      use rlssave   ! Use the resolved Leonard stresses at the nodes.
9*59599516SKenneth E. Jansen
10*59599516SKenneth E. Jansen      include "common.h"
11*59599516SKenneth E. Jansen
12*59599516SKenneth E. Jansen      dimension y(nshg,5),                  ac(nshg,5),
13*59599516SKenneth E. Jansen     &          x(numnp,nsd),               ien(npro,nshl),
14*59599516SKenneth E. Jansen     &          shp(nshl,ngauss),            shpfun(npro,nshl),
15*59599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),       shg(npro,nshl,nsd),
16*59599516SKenneth E. Jansen     &          shglo(nsd,nshl,ngauss),      shpo(nshl,ngauss),
17*59599516SKenneth E. Jansen     &          Qwtf(ngaussf),              acl(npro,nshl,ndof),
18*59599516SKenneth E. Jansen     &          yl(npro,nshl,ndof),         xl(npro,nenl,nsd)
19*59599516SKenneth E. Jansen      dimension stress(nshg,9),             stressl(npro,9),
20*59599516SKenneth E. Jansen     &          stressli(npro,9),
21*59599516SKenneth E. Jansen     &          dxdxi(npro,nsd,nsd),        dxidx(npro,nsd,nsd),
22*59599516SKenneth E. Jansen     &          WdetJ(npro),                rho(npro),
23*59599516SKenneth E. Jansen     &          tmp(npro),                  aci(npro,nsd),
24*59599516SKenneth E. Jansen     &          pres(npro),                 u1(npro),
25*59599516SKenneth E. Jansen     &          u2(npro),                   u3(npro)
26*59599516SKenneth E. Jansen      dimension qres(nshg,nsd*nsd),         ql(npro,nshl,nsd*nsd),
27*59599516SKenneth E. Jansen     &          g1yi(npro,ndof),            g2yi(npro,ndof),
28*59599516SKenneth E. Jansen     &          g3yi(npro,ndof),            divqi(npro,3),
29*59599516SKenneth E. Jansen     &          src(npro,nsd),             Temp(npro),
30*59599516SKenneth E. Jansen     &          xx(npro,nsd),
31*59599516SKenneth E. Jansen     &          rlsl(npro,nshl,6),         rlsli(npro,6),
32*59599516SKenneth E. Jansen     &          rLui(npro,3),
33*59599516SKenneth E. Jansen     &          tauC(npro),                tauM(npro),
34*59599516SKenneth E. Jansen     &          tauBar(npro),              uBar(npro,nsd)
35*59599516SKenneth E. Jansen      dimension Sij(npro,6),               Snorm(npro),
36*59599516SKenneth E. Jansen     &          Snorm2(npro),              cdelsq(nshg),
37*59599516SKenneth E. Jansen     &          xmudmi(npro,ngauss),        xmudmif(npro,ngauss),
38*59599516SKenneth E. Jansen     &          dissi(npro,3),             dissl(npro,3),
39*59599516SKenneth E. Jansen     &          voli(npro),                voll(npro),
40*59599516SKenneth E. Jansen     &          vol(nshg),                 diss(nshg,3),
41*59599516SKenneth E. Jansen     &          rmu(npro)
42*59599516SKenneth E. Jansen
43*59599516SKenneth E. Jansen      real*8    omega(3), divu(npro)
44*59599516SKenneth E. Jansen
45*59599516SKenneth E. Jansenc.... Note that the xmudmi passed in here is
46*59599516SKenneth E. Jansenc.... evaluated at quadrature points of the flow. xmudmif will
47*59599516SKenneth E. Jansenc...  be evaluated at the ngaussf quad. pts.
48*59599516SKenneth E. Jansen
49*59599516SKenneth E. Jansen      xmudmif = zero
50*59599516SKenneth E. Jansen
51*59599516SKenneth E. Jansenc.... Debuggin
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansenc      xmudmi = zero
54*59599516SKenneth E. Jansen
55*59599516SKenneth E. Jansenc.... Localization
56*59599516SKenneth E. Jansen
57*59599516SKenneth E. Jansen      call localy(y,      yl,     ien,    ndofl,  'gather  ')
58*59599516SKenneth E. Jansen      call localy(ac,    acl,     ien,    ndofl,  'gather  ')
59*59599516SKenneth E. Jansen      call localx(x,      xl,     ien,    nsd,    'gather  ')
60*59599516SKenneth E. Jansen
61*59599516SKenneth E. Jansen      if (idiff==1 .or. idiff==3) then ! global reconstruction of qdiff
62*59599516SKenneth E. Jansen         call local (qres,   ql,     ien, nsd*nsd, 'gather  ')
63*59599516SKenneth E. Jansen      endif
64*59599516SKenneth E. Jansen
65*59599516SKenneth E. Jansen      if ( idiff==2 .and. ires .eq. 1 ) then
66*59599516SKenneth E. Jansen         call e3ql (yl,        shpo,       shglo,
67*59599516SKenneth E. Jansen     &              xl,        ql,        xmudmi,
68*59599516SKenneth E. Jansen     &              sgn)
69*59599516SKenneth E. Jansen      endif
70*59599516SKenneth E. Jansen
71*59599516SKenneth E. Jansen      if( (iLES.gt.10).and.(iLES.lt.20)) then ! bardina
72*59599516SKenneth E. Jansen         call local (rls, rlsl,     ien,       6, 'gather  ')
73*59599516SKenneth E. Jansen      else
74*59599516SKenneth E. Jansen         rlsl = zero
75*59599516SKenneth E. Jansen      endif
76*59599516SKenneth E. Jansen
77*59599516SKenneth E. Jansenc... Now that everything is localized, begin loop over ngaussf quad. pts.
78*59599516SKenneth E. Jansen
79*59599516SKenneth E. Jansen
80*59599516SKenneth E. Jansen      stressl = zero
81*59599516SKenneth E. Jansen      dissl   = zero
82*59599516SKenneth E. Jansen      voll    = zero
83*59599516SKenneth E. Jansen
84*59599516SKenneth E. Jansen      do intp = 1, ngaussf
85*59599516SKenneth E. Jansen
86*59599516SKenneth E. Jansenc
87*59599516SKenneth E. Jansenc.... ------------->  Primitive variables at int. point  <--------------
88*59599516SKenneth E. Jansenc
89*59599516SKenneth E. Jansen       pres = zero
90*59599516SKenneth E. Jansen       u1   = zero
91*59599516SKenneth E. Jansen       u2   = zero
92*59599516SKenneth E. Jansen       u3   = zero
93*59599516SKenneth E. Jansenc
94*59599516SKenneth E. Jansen       do n = 1, nshl
95*59599516SKenneth E. Jansen          pres(:) = pres(:) + shp(n,intp) * yl(:,n,1)
96*59599516SKenneth E. Jansen          u1(:)   = u1(:)   + shp(n,intp) * yl(:,n,2)
97*59599516SKenneth E. Jansen          u2(:)   = u2(:)   + shp(n,intp) * yl(:,n,3)
98*59599516SKenneth E. Jansen          u3(:)   = u3(:)   + shp(n,intp) * yl(:,n,4)
99*59599516SKenneth E. Jansen       enddo
100*59599516SKenneth E. Jansen
101*59599516SKenneth E. Jansenc
102*59599516SKenneth E. Jansenc.... ----------------------->  accel. at int. point  <----------------------
103*59599516SKenneth E. Jansenc
104*59599516SKenneth E. Jansen       aci = zero
105*59599516SKenneth E. Jansen       do n = 1, nshl
106*59599516SKenneth E. Jansen          aci(:,1) = aci(:,1) + shp(n,intp) * acl(:,n,2)
107*59599516SKenneth E. Jansen          aci(:,2) = aci(:,2) + shp(n,intp) * acl(:,n,3)
108*59599516SKenneth E. Jansen          aci(:,3) = aci(:,3) + shp(n,intp) * acl(:,n,4)
109*59599516SKenneth E. Jansen       enddo
110*59599516SKenneth E. Jansen
111*59599516SKenneth E. Jansen
112*59599516SKenneth E. Jansenc
113*59599516SKenneth E. Jansenc.... --------------->  Element Metrics at int. point <-------------
114*59599516SKenneth E. Jansenc
115*59599516SKenneth E. Jansenc.... compute the deformation gradient
116*59599516SKenneth E. Jansenc
117*59599516SKenneth E. Jansen        dxdxi = zero
118*59599516SKenneth E. Jansenc
119*59599516SKenneth E. Jansen          do n = 1, nenl
120*59599516SKenneth E. Jansen            dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(1,n,intp)
121*59599516SKenneth E. Jansen            dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(2,n,intp)
122*59599516SKenneth E. Jansen            dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(3,n,intp)
123*59599516SKenneth E. Jansen            dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(1,n,intp)
124*59599516SKenneth E. Jansen            dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(2,n,intp)
125*59599516SKenneth E. Jansen            dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(3,n,intp)
126*59599516SKenneth E. Jansen            dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(1,n,intp)
127*59599516SKenneth E. Jansen            dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(2,n,intp)
128*59599516SKenneth E. Jansen            dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(3,n,intp)
129*59599516SKenneth E. Jansen          enddo
130*59599516SKenneth E. Jansenc
131*59599516SKenneth E. Jansenc.... compute the inverse of deformation gradient
132*59599516SKenneth E. Jansenc
133*59599516SKenneth E. Jansen        dxidx(:,1,1) =   dxdxi(:,2,2) * dxdxi(:,3,3)
134*59599516SKenneth E. Jansen     &                 - dxdxi(:,3,2) * dxdxi(:,2,3)
135*59599516SKenneth E. Jansen        dxidx(:,1,2) =   dxdxi(:,3,2) * dxdxi(:,1,3)
136*59599516SKenneth E. Jansen     &                 - dxdxi(:,1,2) * dxdxi(:,3,3)
137*59599516SKenneth E. Jansen        dxidx(:,1,3) =   dxdxi(:,1,2) * dxdxi(:,2,3)
138*59599516SKenneth E. Jansen     &                 - dxdxi(:,1,3) * dxdxi(:,2,2)
139*59599516SKenneth E. Jansen        tmp          = one / ( dxidx(:,1,1) * dxdxi(:,1,1)
140*59599516SKenneth E. Jansen     &                       + dxidx(:,1,2) * dxdxi(:,2,1)
141*59599516SKenneth E. Jansen     &                       + dxidx(:,1,3) * dxdxi(:,3,1) )
142*59599516SKenneth E. Jansen        dxidx(:,1,1) = dxidx(:,1,1) * tmp
143*59599516SKenneth E. Jansen        dxidx(:,1,2) = dxidx(:,1,2) * tmp
144*59599516SKenneth E. Jansen        dxidx(:,1,3) = dxidx(:,1,3) * tmp
145*59599516SKenneth E. Jansen        dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1)
146*59599516SKenneth E. Jansen     &                - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp
147*59599516SKenneth E. Jansen        dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3)
148*59599516SKenneth E. Jansen     &                - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp
149*59599516SKenneth E. Jansen        dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3)
150*59599516SKenneth E. Jansen     &                - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp
151*59599516SKenneth E. Jansen        dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2)
152*59599516SKenneth E. Jansen     &                - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp
153*59599516SKenneth E. Jansen        dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2)
154*59599516SKenneth E. Jansen     &                - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp
155*59599516SKenneth E. Jansen        dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2)
156*59599516SKenneth E. Jansen     &                - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp
157*59599516SKenneth E. Jansenc
158*59599516SKenneth E. Jansen
159*59599516SKenneth E. Jansen        wght=Qwtf(intp)
160*59599516SKenneth E. Jansen        WdetJ = wght / tmp
161*59599516SKenneth E. Jansen
162*59599516SKenneth E. Jansenc    Obtain the global gradient of the shape functions at current qpt.
163*59599516SKenneth E. Jansen
164*59599516SKenneth E. Jansen      do n = 1,nshl
165*59599516SKenneth E. Jansen        shg(:,n,1) = (shgl(1,n,intp) * dxidx(:,1,1)
166*59599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,1)
167*59599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,1))
168*59599516SKenneth E. Jansen        shg(:,n,2) = (shgl(1,n,intp) * dxidx(:,1,2)
169*59599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,2)
170*59599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,2))
171*59599516SKenneth E. Jansen        shg(:,n,3) = (shgl(1,n,intp) * dxidx(:,1,3)
172*59599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,3)
173*59599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,3))
174*59599516SKenneth E. Jansen      enddo
175*59599516SKenneth E. Jansen
176*59599516SKenneth E. Jansenc
177*59599516SKenneth E. Jansenc.... compute the global gradient of u and P
178*59599516SKenneth E. Jansenc
179*59599516SKenneth E. Jansenc
180*59599516SKenneth E. Jansen       g1yi = zero
181*59599516SKenneth E. Jansen       g2yi = zero
182*59599516SKenneth E. Jansen       g3yi = zero
183*59599516SKenneth E. Jansen       do n = 1, nshl
184*59599516SKenneth E. Jansen          g1yi(:,1) = g1yi(:,1) + shg(:,n,1) * yl(:,n,1)
185*59599516SKenneth E. Jansen          g1yi(:,2) = g1yi(:,2) + shg(:,n,1) * yl(:,n,2)
186*59599516SKenneth E. Jansen          g1yi(:,3) = g1yi(:,3) + shg(:,n,1) * yl(:,n,3)
187*59599516SKenneth E. Jansen          g1yi(:,4) = g1yi(:,4) + shg(:,n,1) * yl(:,n,4)
188*59599516SKenneth E. Jansenc
189*59599516SKenneth E. Jansen          g2yi(:,1) = g2yi(:,1) + shg(:,n,2) * yl(:,n,1)
190*59599516SKenneth E. Jansen          g2yi(:,2) = g2yi(:,2) + shg(:,n,2) * yl(:,n,2)
191*59599516SKenneth E. Jansen          g2yi(:,3) = g2yi(:,3) + shg(:,n,2) * yl(:,n,3)
192*59599516SKenneth E. Jansen          g2yi(:,4) = g2yi(:,4) + shg(:,n,2) * yl(:,n,4)
193*59599516SKenneth E. Jansenc
194*59599516SKenneth E. Jansen          g3yi(:,1) = g3yi(:,1) + shg(:,n,3) * yl(:,n,1)
195*59599516SKenneth E. Jansen          g3yi(:,2) = g3yi(:,2) + shg(:,n,3) * yl(:,n,2)
196*59599516SKenneth E. Jansen          g3yi(:,3) = g3yi(:,3) + shg(:,n,3) * yl(:,n,3)
197*59599516SKenneth E. Jansen          g3yi(:,4) = g3yi(:,4) + shg(:,n,3) * yl(:,n,4)
198*59599516SKenneth E. Jansen       enddo
199*59599516SKenneth E. Jansen
200*59599516SKenneth E. Jansenc.... Let us build the Sij tensor and its norms
201*59599516SKenneth E. Jansen
202*59599516SKenneth E. Jansen       Sij(:,1) = g1yi(:,2)
203*59599516SKenneth E. Jansen       Sij(:,2) = g2yi(:,3)
204*59599516SKenneth E. Jansen       Sij(:,3) = g3yi(:,4)
205*59599516SKenneth E. Jansen       Sij(:,4) = (g2yi(:,2)+g1yi(:,3))*pt5
206*59599516SKenneth E. Jansen       Sij(:,5) = (g3yi(:,2)+g1yi(:,4))*pt5
207*59599516SKenneth E. Jansen       Sij(:,6) = (g3yi(:,3)+g2yi(:,4))*pt5
208*59599516SKenneth E. Jansen
209*59599516SKenneth E. Jansen       Snorm(:) = Sij(:,1)**2 + Sij(:,2)**2 + Sij(:,3)**2
210*59599516SKenneth E. Jansen     &      + two*(Sij(:,4)**2 + Sij(:,5)**2 + Sij(:,6)**2)
211*59599516SKenneth E. Jansen
212*59599516SKenneth E. Jansen       Snorm2(:) = sqrt( two*(Sij(:,1)**2 + Sij(:,2)**2 + Sij(:,3)**2)
213*59599516SKenneth E. Jansen     &      + four*(Sij(:,4)**2 + Sij(:,5)**2 + Sij(:,6)**2) )
214*59599516SKenneth E. Jansen
215*59599516SKenneth E. Jansenc... Let us build xmudmif at current quad pt. a la scatnu.f
216*59599516SKenneth E. Jansen
217*59599516SKenneth E. Jansen       do n = 1,nshl
218*59599516SKenneth E. Jansen          xmudmif(:,intp) = xmudmif(:,intp) +
219*59599516SKenneth E. Jansen     &         cdelsq(ien(:,n)) * Snorm2(:)*shp(n,intp)
220*59599516SKenneth E. Jansen       enddo
221*59599516SKenneth E. Jansen
222*59599516SKenneth E. Jansen      rmu=datmat(1,2,1)
223*59599516SKenneth E. Jansen      xmudmif(:,intp)=min(xmudmif(:,intp),1000.0*rmu(:)) !
224*59599516SKenneth E. Jansenc                                don't let it get larger than 1000 mu
225*59599516SKenneth E. Jansen      xmudmif(:,intp)=max(xmudmif(:,intp), zero) ! don't let (xmudmi) < 0
226*59599516SKenneth E. Jansen
227*59599516SKenneth E. Jansenc.... Debugging
228*59599516SKenneth E. Jansen
229*59599516SKenneth E. Jansenc      xmudmif(:,intp) = rmu(:)
230*59599516SKenneth E. Jansen
231*59599516SKenneth E. Jansen
232*59599516SKenneth E. Jansenc
233*59599516SKenneth E. Jansenc.... get necessary fluid properties (including the updated viscosity)
234*59599516SKenneth E. Jansenc
235*59599516SKenneth E. Jansen       do i = 1, npro
236*59599516SKenneth E. Jansen          do n = 1, nshl
237*59599516SKenneth E. Jansen             shpfun(i,n) = shp(n,intp)
238*59599516SKenneth E. Jansen          enddo
239*59599516SKenneth E. Jansen       enddo
240*59599516SKenneth E. Jansen
241*59599516SKenneth E. Jansen        call getdiff(yl, shpfun, xmudmif,xl, rmu, rho)
242*59599516SKenneth E. Jansen
243*59599516SKenneth E. Jansen
244*59599516SKenneth E. Jansen       divqi = zero
245*59599516SKenneth E. Jansen       if ( idiff >= 1 ) then
246*59599516SKenneth E. Jansenc
247*59599516SKenneth E. Jansenc.... compute divergence of diffusive flux vector, qi,i
248*59599516SKenneth E. Jansenc
249*59599516SKenneth E. Jansen          do n=1, nshl
250*59599516SKenneth E. Jansen             divqi(:,1) = divqi(:,1) + shg(:,n,1)*ql(:,n,1 )
251*59599516SKenneth E. Jansen     &                               + shg(:,n,2)*ql(:,n,4 )
252*59599516SKenneth E. Jansen     &                               + shg(:,n,3)*ql(:,n,7 )
253*59599516SKenneth E. Jansen
254*59599516SKenneth E. Jansen             divqi(:,2) = divqi(:,2) + shg(:,n,1)*ql(:,n,2 )
255*59599516SKenneth E. Jansen     &                               + shg(:,n,2)*ql(:,n,5 )
256*59599516SKenneth E. Jansen     &                               + shg(:,n,3)*ql(:,n,8)
257*59599516SKenneth E. Jansen
258*59599516SKenneth E. Jansen             divqi(:,3) = divqi(:,3) + shg(:,n,1)*ql(:,n,3 )
259*59599516SKenneth E. Jansen     &                               + shg(:,n,2)*ql(:,n,6 )
260*59599516SKenneth E. Jansen     &                               + shg(:,n,3)*ql(:,n,9 )
261*59599516SKenneth E. Jansen
262*59599516SKenneth E. Jansen          enddo
263*59599516SKenneth E. Jansen
264*59599516SKenneth E. Jansen       endif                    ! diffusive flux computation
265*59599516SKenneth E. Jansen
266*59599516SKenneth E. Jansenc
267*59599516SKenneth E. Jansenc.... take care of the body force term here
268*59599516SKenneth E. Jansenc
269*59599516SKenneth E. Jansen       src = zero
270*59599516SKenneth E. Jansen       if(matflg(5,1) .ge. 1) then
271*59599516SKenneth E. Jansenc
272*59599516SKenneth E. Jansen         bfx      = datmat(1,5,1) ! Boussinesq, g*alfap
273*59599516SKenneth E. Jansen         bfy      = datmat(2,5,1)
274*59599516SKenneth E. Jansen         bfz      = datmat(3,5,1)
275*59599516SKenneth E. Jansen
276*59599516SKenneth E. Jansen         select case ( matflg(5,1) )
277*59599516SKenneth E. Jansen            case ( 1 )               ! standard linear body force
278*59599516SKenneth E. Jansen               src(:,1) = bfx
279*59599516SKenneth E. Jansen               src(:,2) = bfy
280*59599516SKenneth E. Jansen               src(:,3) = bfz
281*59599516SKenneth E. Jansen            case ( 2 )               ! boussinesq body force
282*59599516SKenneth E. Jansen               Temp = zero
283*59599516SKenneth E. Jansen               do n = 1, nshl
284*59599516SKenneth E. Jansen                  Temp = Temp + shp(n,intp) * yl(:,n,5)
285*59599516SKenneth E. Jansen               enddo
286*59599516SKenneth E. Jansen               Tref = datmat(2,2,1)
287*59599516SKenneth E. Jansen               src(:,1) = bfx * (Temp(:)-Tref)
288*59599516SKenneth E. Jansen               src(:,2) = bfy * (Temp(:)-Tref)
289*59599516SKenneth E. Jansen               src(:,3) = bfz * (Temp(:)-Tref)
290*59599516SKenneth E. Jansen            case ( 3 )               ! user specified f(x,y,z)
291*59599516SKenneth E. Jansen               xx = zero
292*59599516SKenneth E. Jansen               do n  = 1,nenl
293*59599516SKenneth E. Jansen                  xx(:,1) = xx(:,1)  + shp(n,intp) * xl(:,n,1)
294*59599516SKenneth E. Jansen                  xx(:,2) = xx(:,2)  + shp(n,intp) * xl(:,n,2)
295*59599516SKenneth E. Jansen                  xx(:,3) = xx(:,3)  + shp(n,intp) * xl(:,n,3)
296*59599516SKenneth E. Jansen               enddo
297*59599516SKenneth E. Jansen
298*59599516SKenneth E. Jansen               call e3source(xx, src)
299*59599516SKenneth E. Jansen          end select
300*59599516SKenneth E. Jansen
301*59599516SKenneth E. Jansen       endif
302*59599516SKenneth E. Jansenc
303*59599516SKenneth E. Jansenc.... -------------------> Coriolis force  <-----------------
304*59599516SKenneth E. Jansenc
305*59599516SKenneth E. Jansen      omag=datmat(3,5,1)  ! frame rotation rate
306*59599516SKenneth E. Jansen       if(omag.ne.0) then
307*59599516SKenneth E. Jansenc
308*59599516SKenneth E. Jansenc.... unit vector of axis of rotation currently selecting the i,j,k
309*59599516SKenneth E. Jansenc
310*59599516SKenneth E. Jansen          e1 = one/sqrt(3.0d0)
311*59599516SKenneth E. Jansen          e2 = e1
312*59599516SKenneth E. Jansen          e3 = e1
313*59599516SKenneth E. Jansen
314*59599516SKenneth E. Jansen          omega(1)=omag*e1
315*59599516SKenneth E. Jansen          omega(2)=omag*e2
316*59599516SKenneth E. Jansen          omega(3)=omag*e3
317*59599516SKenneth E. Jansen
318*59599516SKenneth E. Jansen          if(matflg(5,1) .ne. 3) then ! we need to calculate the int pt. coords
319*59599516SKenneth E. Jansen             xx = zero
320*59599516SKenneth E. Jansen             do n  = 1,nenl
321*59599516SKenneth E. Jansen                xx(:,1) = xx(:,1)  + shp(n,intp) * xl(:,n,1)
322*59599516SKenneth E. Jansen                xx(:,2) = xx(:,2)  + shp(n,intp) * xl(:,n,2)
323*59599516SKenneth E. Jansen                xx(:,3) = xx(:,3)  + shp(n,intp) * xl(:,n,3)
324*59599516SKenneth E. Jansen             enddo
325*59599516SKenneth E. Jansen
326*59599516SKenneth E. Jansen          endif
327*59599516SKenneth E. Jansenc
328*59599516SKenneth E. Jansenc  note that we calculate f as if it contains the usual source
329*59599516SKenneth E. Jansenc  plus the Coriolis and the centrifugal forces taken to the rhs (sign change)
330*59599516SKenneth E. Jansenc  as long as we are doing SUPG with no accounting for these terms in the
331*59599516SKenneth E. Jansenc  LHS this is the only change (which will find its way to the RHS momentum
332*59599516SKenneth E. Jansenc  equation (both Galerkin and SUPG parts)).
333*59599516SKenneth E. Jansenc
334*59599516SKenneth E. Jansenc  uncomment later if you want rotation always about z axis
335*59599516SKenneth E. Jansenc                 orig_src - om x om x r       - two om x u
336*59599516SKenneth E. Jansenc
337*59599516SKenneth E. Jansenc$$$          src(:,1)=src(:,1)+omega(3)*omega(3)*xx(:,1)+two*omega(3)*u2
338*59599516SKenneth E. Jansenc$$$          src(:,2)=src(:,2)+omega(3)*omega(3)*xx(:,2)-two*omega(3)*u1
339*59599516SKenneth E. Jansenc
340*59599516SKenneth E. Jansenc more general for testing
341*59599516SKenneth E. Jansenc
342*59599516SKenneth E. Jansen          src(:,1)=src(:,1)
343*59599516SKenneth E. Jansen     &            -(omega(2)*(omega(1)*xx(:,2)-omega(2)*xx(:,1))
344*59599516SKenneth E. Jansen     &             -omega(3)*(omega(3)*xx(:,1)-omega(1)*xx(:,3)))
345*59599516SKenneth E. Jansen     &            -two*(omega(2)*u3-omega(3)*u2)
346*59599516SKenneth E. Jansen          src(:,2)=src(:,2)
347*59599516SKenneth E. Jansen     &            -(omega(3)*(omega(2)*xx(:,3)-omega(3)*xx(:,2))
348*59599516SKenneth E. Jansen     &             -omega(1)*(omega(1)*xx(:,2)-omega(2)*xx(:,1)))
349*59599516SKenneth E. Jansen     &            -two*(omega(3)*u1-omega(1)*u3)
350*59599516SKenneth E. Jansen          src(:,3)=src(:,3)
351*59599516SKenneth E. Jansen     &            -(omega(1)*(omega(3)*xx(:,1)-omega(1)*xx(:,3))
352*59599516SKenneth E. Jansen     &             -omega(2)*(omega(2)*xx(:,3)-omega(3)*xx(:,2)))
353*59599516SKenneth E. Jansen     &            -two*(omega(1)*u2-omega(2)*u1)
354*59599516SKenneth E. Jansen       endif
355*59599516SKenneth E. Jansenc
356*59599516SKenneth E. Jansenc.... -------------------> momentum residual  <-----------------
357*59599516SKenneth E. Jansenc
358*59599516SKenneth E. Jansen       rLui(:,1) =(aci(:,1) + u1 * g1yi(:,2)
359*59599516SKenneth E. Jansen     &                      + u2 * g2yi(:,2)
360*59599516SKenneth E. Jansen     &                      + u3 * g3yi(:,2) - src(:,1) ) * rho
361*59599516SKenneth E. Jansen     &           + g1yi(:,1)
362*59599516SKenneth E. Jansen     &           - divqi(:,1)
363*59599516SKenneth E. Jansen       rLui(:,2) =(aci(:,2) + u1 * g1yi(:,3)
364*59599516SKenneth E. Jansen     &                      + u2 * g2yi(:,3)
365*59599516SKenneth E. Jansen     &                      + u3 * g3yi(:,3) - src(:,2) ) * rho
366*59599516SKenneth E. Jansen     &           + g2yi(:,1)
367*59599516SKenneth E. Jansen     &           - divqi(:,2)
368*59599516SKenneth E. Jansen       rLui(:,3) =(aci(:,3) + u1 * g1yi(:,4)
369*59599516SKenneth E. Jansen     &                      + u2 * g2yi(:,4)
370*59599516SKenneth E. Jansen     &                      + u3 * g3yi(:,4) - src(:,3) ) * rho
371*59599516SKenneth E. Jansen     &           + g3yi(:,1)
372*59599516SKenneth E. Jansen     &           - divqi(:,3)
373*59599516SKenneth E. Jansen       if(iconvflow.eq.1) then
374*59599516SKenneth E. Jansen          divu(:)  = (g1yi(:,2) + g2yi(:,3) + g3yi(:,4))*rho
375*59599516SKenneth E. Jansen          rLui(:,1)=rlui(:,1)+u1*divu
376*59599516SKenneth E. Jansen          rLui(:,2)=rlui(:,2)+u2*divu
377*59599516SKenneth E. Jansen          rLui(:,3)=rlui(:,3)+u3*divu
378*59599516SKenneth E. Jansen       endif
379*59599516SKenneth E. Jansen
380*59599516SKenneth E. Jansenc
381*59599516SKenneth E. Jansenc.... compute the stabilization terms
382*59599516SKenneth E. Jansenc
383*59599516SKenneth E. Jansen        call e3stab (rho,          u1,       u2,
384*59599516SKenneth E. Jansen     &               u3,           dxidx,    rLui,
385*59599516SKenneth E. Jansen     &               rmu,          tauC,     tauM,
386*59599516SKenneth E. Jansen     &               tauBar,       uBar )
387*59599516SKenneth E. Jansenc
388*59599516SKenneth E. Jansenc... Compute the SUPG stress at the current quad point multiplied
389*59599516SKenneth E. Jansenc... by the quadrature point weight.
390*59599516SKenneth E. Jansenc
391*59599516SKenneth E. Jansen        stressli(:,1) = u1(:)*rLui(:,1)
392*59599516SKenneth E. Jansen        stressli(:,2) = u1(:)*rLui(:,2)
393*59599516SKenneth E. Jansen        stressli(:,3) = u1(:)*rLui(:,3)
394*59599516SKenneth E. Jansen        stressli(:,4) = u2(:)*rLui(:,1)
395*59599516SKenneth E. Jansen        stressli(:,5) = u2(:)*rLui(:,2)
396*59599516SKenneth E. Jansen        stressli(:,6) = u2(:)*rLui(:,3)
397*59599516SKenneth E. Jansen        stressli(:,7) = u3(:)*rLui(:,1)
398*59599516SKenneth E. Jansen        stressli(:,8) = u3(:)*rLui(:,2)
399*59599516SKenneth E. Jansen        stressli(:,9) = u3(:)*rLui(:,3)
400*59599516SKenneth E. Jansen
401*59599516SKenneth E. Jansen        if (iconvflow .eq. 1) then
402*59599516SKenneth E. Jansen           stressli(:,1) = stressli(:,1) + u1(:)*rLui(:,1)
403*59599516SKenneth E. Jansen           stressli(:,2) = stressli(:,2) + u2(:)*rLui(:,1)
404*59599516SKenneth E. Jansen           stressli(:,3) = stressli(:,3) + u3(:)*rLui(:,1)
405*59599516SKenneth E. Jansen           stressli(:,4) = stressli(:,4) + u1(:)*rLui(:,2)
406*59599516SKenneth E. Jansen           stressli(:,5) = stressli(:,5) + u2(:)*rLui(:,2)
407*59599516SKenneth E. Jansen           stressli(:,6) = stressli(:,6) + u3(:)*rLui(:,2)
408*59599516SKenneth E. Jansen           stressli(:,7) = stressli(:,7) + u1(:)*rLui(:,3)
409*59599516SKenneth E. Jansen           stressli(:,8) = stressli(:,8) + u2(:)*rLui(:,3)
410*59599516SKenneth E. Jansen           stressli(:,9) = stressli(:,9) + u3(:)*rLui(:,3)
411*59599516SKenneth E. Jansen        endif
412*59599516SKenneth E. Jansen
413*59599516SKenneth E. Jansenc.... Debugging
414*59599516SKenneth E. Jansen
415*59599516SKenneth E. Jansenc        stressli = two
416*59599516SKenneth E. Jansenc        tauM     = one
417*59599516SKenneth E. Jansen
418*59599516SKenneth E. Jansenc.... Multiply  ui*Luj times tauM and times WdetJ
419*59599516SKenneth E. Jansen
420*59599516SKenneth E. Jansen        do l = 1, 9
421*59599516SKenneth E. Jansen           do k = 1, npro
422*59599516SKenneth E. Jansen              stressli(k,l) = stressli(k,l)*WdetJ(k)*tauM(k)
423*59599516SKenneth E. Jansen           enddo
424*59599516SKenneth E. Jansen        enddo
425*59599516SKenneth E. Jansen
426*59599516SKenneth E. Jansenc.... Obtain the SUPG energy dissipation (tau_{ij} S_{ij}) at the
427*59599516SKenneth E. Jansenc.... current qpt.
428*59599516SKenneth E. Jansen
429*59599516SKenneth E. Jansen        dissi(:,1) = stressli(:,1)*Sij(:,1) + stressli(:,5)*Sij(:,2)
430*59599516SKenneth E. Jansen     &       + stressli(:,9)*Sij(:,3) + stressli(:,4)*Sij(:,4)
431*59599516SKenneth E. Jansen     &       + stressli(:,7)*Sij(:,5) + stressli(:,8)*Sij(:,6)
432*59599516SKenneth E. Jansen     &       + stressli(:,2)*Sij(:,4) + stressli(:,3)*Sij(:,5)
433*59599516SKenneth E. Jansen     &       + stressli(:,6)*Sij(:,6)
434*59599516SKenneth E. Jansen
435*59599516SKenneth E. Jansenc.... Obtain the eddy viscosity dissipation multiplied by WdetJ
436*59599516SKenneth E. Jansen
437*59599516SKenneth E. Jansen        dissi(:,2) = xmudmif(:,intp)*Snorm(:)*rho(:)*WdetJ(:)
438*59599516SKenneth E. Jansen        dissi(:,3) = rmu(:)*Snorm(:)*rho(:)*WdetJ(:) ! Total dissipation
439*59599516SKenneth E. Jansenc                                             from molec. and eddy
440*59599516SKenneth E. Jansen
441*59599516SKenneth E. Jansenc.... Debugging
442*59599516SKenneth E. Jansen
443*59599516SKenneth E. Jansenc        dissi(:,1) = two*WdetJ(:)
444*59599516SKenneth E. Jansenc        dissi(:,2) = two*WdetJ(:)
445*59599516SKenneth E. Jansenc        dissi(:,3) = two*WdetJ(:)
446*59599516SKenneth E. Jansen
447*59599516SKenneth E. Jansenc..... Volume of element
448*59599516SKenneth E. Jansen
449*59599516SKenneth E. Jansen        voli = WdetJ  ! Volume of element patch
450*59599516SKenneth E. Jansenc
451*59599516SKenneth E. Jansenc.... For debugging purposes let us keep track of rLui
452*59599516SKenneth E. Jansen
453*59599516SKenneth E. Jansenc        rLui(:,1) = rLui(:,1)*WdetJ(:)
454*59599516SKenneth E. Jansenc        rLui(:,1) = rLui(:,2)*WdetJ(:)
455*59599516SKenneth E. Jansenc        rLui(:,1) = rLui(:,3)*WdetJ(:)
456*59599516SKenneth E. Jansen
457*59599516SKenneth E. Jansenc.... Acumulate integration point contributions for each each element
458*59599516SKenneth E. Jansen
459*59599516SKenneth E. Jansen        do l = 1, 9
460*59599516SKenneth E. Jansen           stressl(:,l) = stressl(:,l) + stressli(:,l)
461*59599516SKenneth E. Jansen        enddo
462*59599516SKenneth E. Jansen
463*59599516SKenneth E. Jansen        do l = 1, 3
464*59599516SKenneth E. Jansen           dissl(:,l) = dissl(:,l) + dissi(:,l)
465*59599516SKenneth E. Jansen        enddo
466*59599516SKenneth E. Jansen
467*59599516SKenneth E. Jansen        voll = voll + voli
468*59599516SKenneth E. Jansen
469*59599516SKenneth E. Jansen      enddo    ! End loop over quadrature points.
470*59599516SKenneth E. Jansen
471*59599516SKenneth E. Jansen      do j = 1,nshl
472*59599516SKenneth E. Jansen      do nel = 1,npro
473*59599516SKenneth E. Jansen        stress(ien(nel,j),:) = stress(ien(nel,j),:) + stressl(nel,:)
474*59599516SKenneth E. Jansen      enddo
475*59599516SKenneth E. Jansen      enddo
476*59599516SKenneth E. Jansen
477*59599516SKenneth E. Jansen      do j = 1,nshl
478*59599516SKenneth E. Jansen      do nel = 1,npro
479*59599516SKenneth E. Jansen        diss(ien(nel,j),:) = diss(ien(nel,j),:) + dissl(nel,:)
480*59599516SKenneth E. Jansen      enddo
481*59599516SKenneth E. Jansen      enddo
482*59599516SKenneth E. Jansen
483*59599516SKenneth E. Jansen      do j = 1,nshl
484*59599516SKenneth E. Jansen      do nel = 1,npro
485*59599516SKenneth E. Jansen         vol(ien(nel,j)) = vol(ien(nel,j)) + voll(nel)
486*59599516SKenneth E. Jansen      enddo
487*59599516SKenneth E. Jansen      enddo
488*59599516SKenneth E. Jansen
489*59599516SKenneth E. Jansen      return
490*59599516SKenneth E. Jansen      end
491*59599516SKenneth E. Jansen      subroutine cpjdmcnoi (y,      shgl,      shp,
492*59599516SKenneth E. Jansen     &                   iper,   ilwork,       x,
493*59599516SKenneth E. Jansen     &                   rowp,   colm,
494*59599516SKenneth E. Jansen     &                   iBC,    BC)
495*59599516SKenneth E. Jansen
496*59599516SKenneth E. Jansen      use pointer_data
497*59599516SKenneth E. Jansen
498*59599516SKenneth E. Jansen      use lhsGkeep ! This module stores the mass (Gram) matrix.
499*59599516SKenneth E. Jansen
500*59599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
501*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
502*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
503*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
504*59599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
505*59599516SKenneth E. Jansenc                    quad. points.
506*59599516SKenneth E. Jansen
507*59599516SKenneth E. Jansen      include "common.h"
508*59599516SKenneth E. Jansen      include "mpif.h"
509*59599516SKenneth E. Jansen      include "auxmpi.h"
510*59599516SKenneth E. Jansen
511*59599516SKenneth E. Jansenc
512*59599516SKenneth E. Jansen      dimension fres(nshg,24),         fwr(nshg),
513*59599516SKenneth E. Jansen     &          strnrm(nshg),         cdelsq(nshg),
514*59599516SKenneth E. Jansen     &          xnum(nshg),           xden(nshg),
515*59599516SKenneth E. Jansen     &          xmij(nshg,6),         xlij(nshg,6),
516*59599516SKenneth E. Jansen     &          xnude(nfath,2),        xnuder(nfath,2),
517*59599516SKenneth E. Jansen     &          strl(numel,ngauss),
518*59599516SKenneth E. Jansen     &          y(nshg,5),            yold(nshg,5),
519*59599516SKenneth E. Jansen     &          iper(nshg),
520*59599516SKenneth E. Jansen     &          ilwork(nlwork),
521*59599516SKenneth E. Jansen     &          x(numnp,3),
522*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
523*59599516SKenneth E. Jansen     &          pfres(nshg,22),                ifath(nshg),
524*59599516SKenneth E. Jansen     &          nsons(nshg),                   iBC(nshg),
525*59599516SKenneth E. Jansen     &          BC(nshg,ndofBC),               xnutf(nfath),
526*59599516SKenneth E. Jansen     &          xnut(nshg)
527*59599516SKenneth E. Jansen
528*59599516SKenneth E. Jansen        integer   rowp(nshg*nnz),         colm(nshg+1)
529*59599516SKenneth E. Jansen
530*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: em
531*59599516SKenneth E. Jansen
532*59599516SKenneth E. Jansen
533*59599516SKenneth E. Jansen      denom=max(1.0d0*(lstep),one)
534*59599516SKenneth E. Jansen      if(dtavei.lt.0) then
535*59599516SKenneth E. Jansen         wcur=one/denom
536*59599516SKenneth E. Jansen      else
537*59599516SKenneth E. Jansen         wcur=dtavei
538*59599516SKenneth E. Jansen      endif
539*59599516SKenneth E. Jansen      whist=1.0-wcur
540*59599516SKenneth E. Jansen
541*59599516SKenneth E. Jansen      if (istep .eq. 0) then
542*59599516SKenneth E. Jansen         lhsG = zero
543*59599516SKenneth E. Jansen      endif
544*59599516SKenneth E. Jansen
545*59599516SKenneth E. Jansen      fres = zero
546*59599516SKenneth E. Jansen      yold(:,1)=y(:,4)
547*59599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
548*59599516SKenneth E. Jansenc
549*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
550*59599516SKenneth E. Jansenc
551*59599516SKenneth E. Jansenc      do i = 1, nshg  ! No periodicity for testing
552*59599516SKenneth E. Jansenc      iper(i) = i
553*59599516SKenneth E. Jansenc      enddo
554*59599516SKenneth E. Jansenc      yold(:,5) = 1.0
555*59599516SKenneth E. Jansenc      yold(:,2) = 3.0d0
556*59599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3*x(:,2)
557*59599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
558*59599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
559*59599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
560*59599516SKenneth E. Jansenc                               suitable for the
561*59599516SKenneth E. Jansen
562*59599516SKenneth E. Jansen
563*59599516SKenneth E. Jansen      intrul=intg(1,itseq)
564*59599516SKenneth E. Jansen      intind=intpt(intrul)
565*59599516SKenneth E. Jansen
566*59599516SKenneth E. Jansen      do iblk = 1,nelblk
567*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
568*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
569*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
570*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
571*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
572*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
573*59599516SKenneth E. Jansen        inum  = iel + npro - 1
574*59599516SKenneth E. Jansen
575*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
576*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
577*59599516SKenneth E. Jansen
578*59599516SKenneth E. Jansen        call hfilterBB (yold, x, mien(iblk)%p, fres,
579*59599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
580*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
581*59599516SKenneth E. Jansen
582*59599516SKenneth E. Jansen
583*59599516SKenneth E. Jansen        if ( istep.eq.0 ) then
584*59599516SKenneth E. Jansen
585*59599516SKenneth E. Jansen           allocate ( em(npro,nshl,nshl) )
586*59599516SKenneth E. Jansen
587*59599516SKenneth E. Jansen           call getgram2 (x, mien(iblk)%p,
588*59599516SKenneth E. Jansen     &          shgl(lcsyst,:,1:nshl,:),  shp(lcsyst,1:nshl,:),
589*59599516SKenneth E. Jansen     &          shglf(lcsyst,:,1:nshl,:), shpf(lcsyst,1:nshl,:), em,
590*59599516SKenneth E. Jansen     &          Qwtf(lcsyst,1:ngaussf))
591*59599516SKenneth E. Jansen
592*59599516SKenneth E. Jansen           call fillsparseSclr (mien(iblk)%p,
593*59599516SKenneth E. Jansen     &                          em,            lhsG,
594*59599516SKenneth E. Jansen     &                          rowp,          colm)
595*59599516SKenneth E. Jansen
596*59599516SKenneth E. Jansen
597*59599516SKenneth E. Jansen           deallocate ( em )
598*59599516SKenneth E. Jansen
599*59599516SKenneth E. Jansen        endif
600*59599516SKenneth E. Jansen
601*59599516SKenneth E. Jansen      enddo   ! End loop over element blocks
602*59599516SKenneth E. Jansenc
603*59599516SKenneth E. Jansen
604*59599516SKenneth E. Jansenc      write(*,*)'Im here'
605*59599516SKenneth E. Jansen
606*59599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 24, 'in ')
607*59599516SKenneth E. Jansenc
608*59599516SKenneth E. Jansenc account for periodicity in filtered variables
609*59599516SKenneth E. Jansenc
610*59599516SKenneth E. Jansen      do j = 1,nshg
611*59599516SKenneth E. Jansen        i = iper(j)
612*59599516SKenneth E. Jansen        if (i .ne. j) then
613*59599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
614*59599516SKenneth E. Jansen        endif
615*59599516SKenneth E. Jansen      enddo
616*59599516SKenneth E. Jansen
617*59599516SKenneth E. Jansen      do j = 1,nshg
618*59599516SKenneth E. Jansen        i = iper(j)
619*59599516SKenneth E. Jansen        if (i .ne. j) then
620*59599516SKenneth E. Jansen           fres(j,:) = zero
621*59599516SKenneth E. Jansen        endif
622*59599516SKenneth E. Jansen      enddo
623*59599516SKenneth E. Jansen
624*59599516SKenneth E. Jansenc     Need to zero off-processor slaves as well.
625*59599516SKenneth E. Jansen
626*59599516SKenneth E. Jansen      if (numpe.gt.1) then
627*59599516SKenneth E. Jansen
628*59599516SKenneth E. Jansen         numtask = ilwork(1)
629*59599516SKenneth E. Jansen         itkbeg = 1
630*59599516SKenneth E. Jansen
631*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
632*59599516SKenneth E. Jansen
633*59599516SKenneth E. Jansen         do itask = 1, numtask
634*59599516SKenneth E. Jansen
635*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
636*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
637*59599516SKenneth E. Jansen
638*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
639*59599516SKenneth E. Jansen               do is = 1,numseg
640*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
641*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
642*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
643*59599516SKenneth E. Jansen                  fres(isgbeg:isgend,:) = zero
644*59599516SKenneth E. Jansen               enddo
645*59599516SKenneth E. Jansen            endif
646*59599516SKenneth E. Jansen
647*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
648*59599516SKenneth E. Jansen
649*59599516SKenneth E. Jansen         enddo
650*59599516SKenneth E. Jansen
651*59599516SKenneth E. Jansen      endif
652*59599516SKenneth E. Jansen
653*59599516SKenneth E. Jansenc... At this point fres has the right hand side vector (b) and lhsG has
654*59599516SKenneth E. Jansenc... the Gram matrix (M_{AB}) (in sparse storage). Now we need to solve
655*59599516SKenneth E. Jansenc... Ax = b using the conjugate gradient method to finish off the
656*59599516SKenneth E. Jansenc... L2-projection.
657*59599516SKenneth E. Jansen
658*59599516SKenneth E. Jansen
659*59599516SKenneth E. Jansen      do i = 1, 21
660*59599516SKenneth E. Jansen         call sparseCG (fres(:,i), pfres(:,i), lhsG,
661*59599516SKenneth E. Jansen     &        rowp, colm, iper, ilwork,
662*59599516SKenneth E. Jansen     &        iBC,  BC)
663*59599516SKenneth E. Jansen      enddo
664*59599516SKenneth E. Jansen
665*59599516SKenneth E. Jansen
666*59599516SKenneth E. Jansen      write(*,*)'Done with least-squares projection'
667*59599516SKenneth E. Jansen
668*59599516SKenneth E. Jansen      do i = 1, 21
669*59599516SKenneth E. Jansen         fres(:,i) = pfres(:,i)
670*59599516SKenneth E. Jansen      enddo
671*59599516SKenneth E. Jansen
672*59599516SKenneth E. Jansen      fres(:,22) = one
673*59599516SKenneth E. Jansen
674*59599516SKenneth E. Jansen      do iblk = 1,nelblk
675*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
676*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
677*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
678*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
679*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
680*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
681*59599516SKenneth E. Jansen        inum  = iel + npro - 1
682*59599516SKenneth E. Jansen
683*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
684*59599516SKenneth E. Jansen
685*59599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
686*59599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
687*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
688*59599516SKenneth E. Jansen
689*59599516SKenneth E. Jansen      enddo
690*59599516SKenneth E. Jansen
691*59599516SKenneth E. Jansen
692*59599516SKenneth E. Jansen      strnrm = sqrt(
693*59599516SKenneth E. Jansen     &  two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2)
694*59599516SKenneth E. Jansen     &  + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
695*59599516SKenneth E. Jansen
696*59599516SKenneth E. Jansen      fwr = fwr1 * fres(:,22) * strnrm
697*59599516SKenneth E. Jansen
698*59599516SKenneth E. Jansen      xmij(:,1) = -fwr
699*59599516SKenneth E. Jansen     &             * fres(:,10) + fres(:,16)
700*59599516SKenneth E. Jansen      xmij(:,2) = -fwr
701*59599516SKenneth E. Jansen     &             * fres(:,11) + fres(:,17)
702*59599516SKenneth E. Jansen      xmij(:,3) = -fwr
703*59599516SKenneth E. Jansen     &             * fres(:,12) + fres(:,18)
704*59599516SKenneth E. Jansen
705*59599516SKenneth E. Jansen      xmij(:,4) = -fwr * fres(:,13) + fres(:,19)
706*59599516SKenneth E. Jansen      xmij(:,5) = -fwr * fres(:,14) + fres(:,20)
707*59599516SKenneth E. Jansen      xmij(:,6) = -fwr * fres(:,15) + fres(:,21)
708*59599516SKenneth E. Jansen
709*59599516SKenneth E. Jansen      fres(:,22) = one / fres(:,22)
710*59599516SKenneth E. Jansen
711*59599516SKenneth E. Jansen      xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1) * fres(:,22)
712*59599516SKenneth E. Jansen      xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2) * fres(:,22)
713*59599516SKenneth E. Jansen      xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3) * fres(:,22)
714*59599516SKenneth E. Jansen      xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2) * fres(:,22)
715*59599516SKenneth E. Jansen      xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3) * fres(:,22)
716*59599516SKenneth E. Jansen      xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3) * fres(:,22)
717*59599516SKenneth E. Jansen
718*59599516SKenneth E. Jansen      xnum =        xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2)
719*59599516SKenneth E. Jansen     &                                    + xlij(:,3) * xmij(:,3)
720*59599516SKenneth E. Jansen     &     + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5)
721*59599516SKenneth E. Jansen     &                                    + xlij(:,6) * xmij(:,6))
722*59599516SKenneth E. Jansen      xden =        xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2)
723*59599516SKenneth E. Jansen     &                                    + xmij(:,3) * xmij(:,3)
724*59599516SKenneth E. Jansen     &     + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5)
725*59599516SKenneth E. Jansen     &                                    + xmij(:,6) * xmij(:,6))
726*59599516SKenneth E. Jansen      xden = two * xden
727*59599516SKenneth E. Jansen
728*59599516SKenneth E. Jansenc
729*59599516SKenneth E. Jansenc don't account for periodic nodes twice
730*59599516SKenneth E. Jansenc
731*59599516SKenneth E. Jansen      do j = 1,numnp
732*59599516SKenneth E. Jansen        i = iper(j)
733*59599516SKenneth E. Jansen        if (i .ne. j) then
734*59599516SKenneth E. Jansen           xden(j) = zero
735*59599516SKenneth E. Jansen           xnum(j) = zero
736*59599516SKenneth E. Jansen        endif
737*59599516SKenneth E. Jansen      enddo
738*59599516SKenneth E. Jansen
739*59599516SKenneth E. Jansen         if(numpe.gt.1) then
740*59599516SKenneth E. Jansenc
741*59599516SKenneth E. Jansenc.... nodes treated on another processor are eliminated
742*59599516SKenneth E. Jansenc
743*59599516SKenneth E. Jansen            numtask = ilwork(1)
744*59599516SKenneth E. Jansen            itkbeg = 1
745*59599516SKenneth E. Jansen
746*59599516SKenneth E. Jansen            do itask = 1, numtask
747*59599516SKenneth E. Jansen
748*59599516SKenneth E. Jansen               iacc   = ilwork (itkbeg + 2)
749*59599516SKenneth E. Jansen               numseg = ilwork (itkbeg + 4)
750*59599516SKenneth E. Jansen
751*59599516SKenneth E. Jansen               if (iacc .eq. 0) then
752*59599516SKenneth E. Jansen                  do is = 1,numseg
753*59599516SKenneth E. Jansen                     isgbeg = ilwork (itkbeg + 3 + 2*is)
754*59599516SKenneth E. Jansen                     lenseg = ilwork (itkbeg + 4 + 2*is)
755*59599516SKenneth E. Jansen                     isgend = isgbeg + lenseg - 1
756*59599516SKenneth E. Jansen                     xnum(isgbeg:isgend) = zero
757*59599516SKenneth E. Jansen                     xden(isgbeg:isgend) = zero
758*59599516SKenneth E. Jansen                  enddo
759*59599516SKenneth E. Jansen               endif
760*59599516SKenneth E. Jansen
761*59599516SKenneth E. Jansen               itkbeg = itkbeg + 4 + 2*numseg
762*59599516SKenneth E. Jansen
763*59599516SKenneth E. Jansen            enddo
764*59599516SKenneth E. Jansen
765*59599516SKenneth E. Jansenc            if (myrank.eq.0)then
766*59599516SKenneth E. Jansenc               do i = 1, numnp
767*59599516SKenneth E. Jansenc                  write(253,*)xnum(i),xden(i),myrank
768*59599516SKenneth E. Jansenc               enddo
769*59599516SKenneth E. Jansenc            endif
770*59599516SKenneth E. Jansenc            if (myrank.eq.1)then
771*59599516SKenneth E. Jansenc               do i = 1, numnp
772*59599516SKenneth E. Jansenc                  write(254,*)xnum(i),xden(i),myrank
773*59599516SKenneth E. Jansenc               enddo
774*59599516SKenneth E. Jansenc            endif
775*59599516SKenneth E. Jansen
776*59599516SKenneth E. Jansenc            xnuml = sum(xnum)
777*59599516SKenneth E. Jansenc            xdenl = sum(xden)
778*59599516SKenneth E. Jansen
779*59599516SKenneth E. Jansen            xnuml = zero
780*59599516SKenneth E. Jansen            xdenl = zero
781*59599516SKenneth E. Jansen            do i = 1, numnp
782*59599516SKenneth E. Jansen               xnuml = xnuml + xnum(i)
783*59599516SKenneth E. Jansen               xdenl = xdenl + xden(i)
784*59599516SKenneth E. Jansen            enddo
785*59599516SKenneth E. Jansen
786*59599516SKenneth E. Jansenc            write(*,*)xnuml,xdenl,myrank
787*59599516SKenneth E. Jansen
788*59599516SKenneth E. Jansen            call drvAllreducesclr ( xnuml, xnumt )
789*59599516SKenneth E. Jansen            call drvAllreducesclr ( xdenl, xdent )
790*59599516SKenneth E. Jansencd
791*59599516SKenneth E. Jansen         else
792*59599516SKenneth E. Jansen
793*59599516SKenneth E. Jansenc            xnumt = sum(xnum)
794*59599516SKenneth E. Jansenc            xdent = sum(xden)
795*59599516SKenneth E. Jansen            xnumt = zero
796*59599516SKenneth E. Jansen            xdent = zero
797*59599516SKenneth E. Jansen            do i = 1, numnp
798*59599516SKenneth E. Jansen               xnumt = xnumt + xnum(i)
799*59599516SKenneth E. Jansen               xdent = xdent + xden(i)
800*59599516SKenneth E. Jansen            enddo
801*59599516SKenneth E. Jansen
802*59599516SKenneth E. Jansen
803*59599516SKenneth E. Jansen         endif
804*59599516SKenneth E. Jansen
805*59599516SKenneth E. Jansen         scalar = xnumt / (xdent + 1.d-09)
806*59599516SKenneth E. Jansen         xnut = scalar
807*59599516SKenneth E. Jansen
808*59599516SKenneth E. Jansen
809*59599516SKenneth E. Jansen      if (myrank .eq. 0)then
810*59599516SKenneth E. Jansen         write(*,*) 'xnut=', xnut(100)
811*59599516SKenneth E. Jansen      endif
812*59599516SKenneth E. Jansenc      do i = 1, numnp
813*59599516SKenneth E. Jansenc         write(*,*)xnumt/xdent,myrank
814*59599516SKenneth E. Jansenc      enddo
815*59599516SKenneth E. Jansenc
816*59599516SKenneth E. Jansen      do iblk = 1,nelblk
817*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
818*59599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
819*59599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
820*59599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
821*59599516SKenneth E. Jansen         inum  = iel + npro - 1
822*59599516SKenneth E. Jansen
823*59599516SKenneth E. Jansen         ngauss = nint(lcsyst)
824*59599516SKenneth E. Jansen
825*59599516SKenneth E. Jansen         call scatnu (mien(iblk)%p, strl(iel:inum,:),
826*59599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:))
827*59599516SKenneth E. Jansen      enddo
828*59599516SKenneth E. Jansenc     $$$$$$$$$$$$$$$$$$$$$$$$$$$
829*59599516SKenneth E. Jansenc$$$  tmp1 =  MINVAL(xmudmi)
830*59599516SKenneth E. Jansenc$$$  tmp2 =  MAXVAL(xmudmi)
831*59599516SKenneth E. Jansenc$$$  if(numpe>1) then
832*59599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION,
833*59599516SKenneth E. Jansenc$$$  &                 MPI_MIN, master, MPI_COMM_WORLD, ierr)
834*59599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
835*59599516SKenneth E. Jansenc$$$  &                 MPI_MAX, master, MPI_COMM_WORLD, ierr)
836*59599516SKenneth E. Jansenc$$$      tmp1=tmp3
837*59599516SKenneth E. Jansenc$$$  tmp2=tmp4
838*59599516SKenneth E. Jansenc$$$  endif
839*59599516SKenneth E. Jansenc$$$  if (myrank .EQ. master) then
840*59599516SKenneth E. Jansenc$$$  write(35,*) lstep,tmp1,tmp2
841*59599516SKenneth E. Jansenc$$$  call flush(35)
842*59599516SKenneth E. Jansenc$$$  endif
843*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
844*59599516SKenneth E. Jansen
845*59599516SKenneth E. Jansenc
846*59599516SKenneth E. Jansenc  if flag set, write a restart file with info (reuse xmij's memory)
847*59599516SKenneth E. Jansenc
848*59599516SKenneth E. Jansen      if(irs.eq.11) then
849*59599516SKenneth E. Jansen         lstep=999
850*59599516SKenneth E. Jansen         xmij(:,1)=xnum(:)
851*59599516SKenneth E. Jansen         xmij(:,2)=xden(:)
852*59599516SKenneth E. Jansen         xmij(:,3)=cdelsq(:)
853*59599516SKenneth E. Jansen         xmij(:,5)=xlij(:,4)    !leave M_{12} in 4 and put L_{12} here
854*59599516SKenneth E. Jansen         call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac
855*59599516SKenneth E. Jansen         stop
856*59599516SKenneth E. Jansen      endif
857*59599516SKenneth E. Jansenc
858*59599516SKenneth E. Jansenc  local clipping moved to scatnu with the creation of mxmudmi pointers
859*59599516SKenneth E. Jansenc
860*59599516SKenneth E. Jansenc$$$      rmu=datmat(1,2,1)
861*59599516SKenneth E. Jansenc$$$      xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu
862*59599516SKenneth E. Jansenc$$$      xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0
863*59599516SKenneth E. Jansenc      stop !uncomment to test dmod
864*59599516SKenneth E. Jansenc
865*59599516SKenneth E. Jansen
866*59599516SKenneth E. Jansen
867*59599516SKenneth E. Jansenc  write out the nodal values of xnut (estimate since we don't calc strain
868*59599516SKenneth E. Jansenc  there and must use the filtered strain).
869*59599516SKenneth E. Jansenc
870*59599516SKenneth E. Jansen
871*59599516SKenneth E. Jansen
872*59599516SKenneth E. Jansen
873*59599516SKenneth E. Jansen      return
874*59599516SKenneth E. Jansen      end
875*59599516SKenneth E. Jansen
876*59599516SKenneth E. Jansenc-----------------------------------------------------
877*59599516SKenneth E. Jansen
878*59599516SKenneth E. Jansen      subroutine getgram (x, ien, shgl, shp, em, Qwtf)
879*59599516SKenneth E. Jansen
880*59599516SKenneth E. Jansen      include "common.h"
881*59599516SKenneth E. Jansen
882*59599516SKenneth E. Jansen      dimension x(numnp,nsd),            xl(npro,nenl,nsd)
883*59599516SKenneth E. Jansen      dimension ien(npro,nshl),
884*59599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),    shp(nshl,ngauss),
885*59599516SKenneth E. Jansen     &          em(npro,nshl,nshl),      Qwtf(ngaussf)
886*59599516SKenneth E. Jansen
887*59599516SKenneth E. Jansen      call localx(x,      xl,     ien,    nsd,    'gather  ')
888*59599516SKenneth E. Jansen
889*59599516SKenneth E. Jansen      call cmass(shp,shgl,xl,em)
890*59599516SKenneth E. Jansen
891*59599516SKenneth E. Jansen
892*59599516SKenneth E. Jansen      return
893*59599516SKenneth E. Jansen
894*59599516SKenneth E. Jansen      end
895*59599516SKenneth E. Jansen
896*59599516SKenneth E. Jansenc----------------------------------------------------------------------
897*59599516SKenneth E. Jansen
898*59599516SKenneth E. Jansen
899*59599516SKenneth E. Jansen      subroutine getgram2 (x, ien, shgl, shp, shglf, shpf, em, Qwtf)
900*59599516SKenneth E. Jansen
901*59599516SKenneth E. Jansen      include "common.h"
902*59599516SKenneth E. Jansen
903*59599516SKenneth E. Jansen      dimension x(numnp,nsd),            xl(npro,nenl,nsd)
904*59599516SKenneth E. Jansen      dimension ien(npro,nshl),
905*59599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),    shp(nshl,ngauss),
906*59599516SKenneth E. Jansen     &          shglf(nsd,nshl,ngauss),   shpf(nshl,ngauss),
907*59599516SKenneth E. Jansen     &          em(npro,nshl,nshl),      Qwtf(ngaussf)
908*59599516SKenneth E. Jansen
909*59599516SKenneth E. Jansen
910*59599516SKenneth E. Jansen      call localx(x,      xl,     ien,    nsd,    'gather  ')
911*59599516SKenneth E. Jansen
912*59599516SKenneth E. Jansen      call cmassl(shp,shgl,shpf,shglf,xl,em,Qwtf)
913*59599516SKenneth E. Jansen
914*59599516SKenneth E. Jansen
915*59599516SKenneth E. Jansen      return
916*59599516SKenneth E. Jansen
917*59599516SKenneth E. Jansen      end
918*59599516SKenneth E. Jansen
919*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
920*59599516SKenneth E. Jansen
921*59599516SKenneth E. Jansen      subroutine getgram3 (x, ien, shgl, shp, shglf, shpf, em, Qwtf)
922*59599516SKenneth E. Jansen
923*59599516SKenneth E. Jansen      include "common.h"
924*59599516SKenneth E. Jansen
925*59599516SKenneth E. Jansen      dimension x(numnp,nsd),            xl(npro,nenl,nsd)
926*59599516SKenneth E. Jansen      dimension ien(npro,nshl),
927*59599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),    shp(nshl,ngauss),
928*59599516SKenneth E. Jansen     &          shglf(nsd,nshl,ngauss),   shpf(nshl,ngauss),
929*59599516SKenneth E. Jansen     &          em(npro,nshl,nshl),      Qwtf(ngaussf)
930*59599516SKenneth E. Jansen
931*59599516SKenneth E. Jansen
932*59599516SKenneth E. Jansen      call localx(x,      xl,     ien,    nsd,    'gather  ')
933*59599516SKenneth E. Jansen
934*59599516SKenneth E. Jansen      call cmasstl(shp,shgl,shpf,shglf,xl,em,Qwtf)
935*59599516SKenneth E. Jansen
936*59599516SKenneth E. Jansen
937*59599516SKenneth E. Jansen      return
938*59599516SKenneth E. Jansen
939*59599516SKenneth E. Jansen      end
940*59599516SKenneth E. Jansen      subroutine cdelBHsq (y,      shgl,      shp,
941*59599516SKenneth E. Jansen     &                   iper,   ilwork,
942*59599516SKenneth E. Jansen     &                   nsons,  ifath,     x, cdelsq1)
943*59599516SKenneth E. Jansen
944*59599516SKenneth E. Jansen      use pointer_data
945*59599516SKenneth E. Jansen
946*59599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
947*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
948*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
949*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
950*59599516SKenneth E. Jansenc                    for computing the dmod. Qwtf contains the weights of the
951*59599516SKenneth E. Jansenc                    quad. points.
952*59599516SKenneth E. Jansen
953*59599516SKenneth E. Jansen      include "common.h"
954*59599516SKenneth E. Jansen      include "mpif.h"
955*59599516SKenneth E. Jansen      include "auxmpi.h"
956*59599516SKenneth E. Jansen
957*59599516SKenneth E. Jansenc
958*59599516SKenneth E. Jansen      dimension fres(nshg,33),         fwr(nshg),
959*59599516SKenneth E. Jansen     &          strnrm(nshg),         cdelsq1(nfath),
960*59599516SKenneth E. Jansen     &          xnum(nshg),           xden(nshg),
961*59599516SKenneth E. Jansen     &          xmij(nshg,6),         xlij(nshg,6),
962*59599516SKenneth E. Jansen     &          xnude(nfath,2),        xnuder(nfath,2),
963*59599516SKenneth E. Jansen     &          nsons(nshg),
964*59599516SKenneth E. Jansen     &          strl(numel,ngauss),
965*59599516SKenneth E. Jansen     &          y(nshg,5),            yold(nshg,5),
966*59599516SKenneth E. Jansen     &          ifath(nshg),          iper(nshg),
967*59599516SKenneth E. Jansen     &          ilwork(nlwork),
968*59599516SKenneth E. Jansen     &          x(numnp,3),
969*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
970*59599516SKenneth E. Jansen     &          xnutf(nfath),
971*59599516SKenneth E. Jansen     &          hfres(nshg,16)
972*59599516SKenneth E. Jansen
973*59599516SKenneth E. Jansenc
974*59599516SKenneth E. Jansen
975*59599516SKenneth E. Jansen      fres = zero
976*59599516SKenneth E. Jansen      hfres = zero
977*59599516SKenneth E. Jansen
978*59599516SKenneth E. Jansen      yold(:,1)=y(:,4)
979*59599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
980*59599516SKenneth E. Jansen
981*59599516SKenneth E. Jansenc
982*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
983*59599516SKenneth E. Jansenc
984*59599516SKenneth E. Jansenc      yold(:,5) = 1.0  ! Debugging
985*59599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2)
986*59599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
987*59599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
988*59599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
989*59599516SKenneth E. Jansenc                               suitable for the
990*59599516SKenneth E. Jansen
991*59599516SKenneth E. Jansen      do iblk = 1,nelblk
992*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
993*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
994*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
995*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
996*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
997*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
998*59599516SKenneth E. Jansen        inum  = iel + npro - 1
999*59599516SKenneth E. Jansen
1000*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
1001*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
1002*59599516SKenneth E. Jansen
1003*59599516SKenneth E. Jansenc        call hfilterB (yold, x, mien(iblk)%p, hfres,
1004*59599516SKenneth E. Jansenc     &               shglf(lcsyst,:,1:nshl,:),
1005*59599516SKenneth E. Jansenc     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
1006*59599516SKenneth E. Jansen
1007*59599516SKenneth E. Jansen        call hfilterC (yold, x, mien(iblk)%p, hfres,
1008*59599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
1009*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
1010*59599516SKenneth E. Jansen
1011*59599516SKenneth E. Jansen      enddo
1012*59599516SKenneth E. Jansen
1013*59599516SKenneth E. Jansen      if(numpe>1) call commu (hfres, ilwork, 16, 'in ')
1014*59599516SKenneth E. Jansenc
1015*59599516SKenneth E. Jansenc... account for periodicity in filtered variables
1016*59599516SKenneth E. Jansenc
1017*59599516SKenneth E. Jansen      do j = 1,nshg  !    Add on-processor slave contribution to masters
1018*59599516SKenneth E. Jansen        i = iper(j)
1019*59599516SKenneth E. Jansen        if (i .ne. j) then
1020*59599516SKenneth E. Jansen           hfres(i,:) = hfres(i,:) + hfres(j,:)
1021*59599516SKenneth E. Jansen        endif
1022*59599516SKenneth E. Jansen      enddo
1023*59599516SKenneth E. Jansen      do j = 1,nshg ! Set on-processor slaves to be the same as masters
1024*59599516SKenneth E. Jansen        i = iper(j)
1025*59599516SKenneth E. Jansen        if (i .ne. j) then
1026*59599516SKenneth E. Jansen           hfres(j,:) = hfres(i,:)
1027*59599516SKenneth E. Jansen        endif
1028*59599516SKenneth E. Jansen      enddo
1029*59599516SKenneth E. Jansen
1030*59599516SKenneth E. Jansenc... Set off-processor slaves to be the same as their masters
1031*59599516SKenneth E. Jansen
1032*59599516SKenneth E. Jansen      if(numpe>1)   call commu (hfres, ilwork, 16, 'out')
1033*59599516SKenneth E. Jansen
1034*59599516SKenneth E. Jansen
1035*59599516SKenneth E. Jansen      hfres(:,16) = one / hfres(:,16) ! one/(volume of hat filter kernel)
1036*59599516SKenneth E. Jansen
1037*59599516SKenneth E. Jansen      do j = 1, 15
1038*59599516SKenneth E. Jansen	hfres(:,j) = hfres(:,j) * hfres(:,16)
1039*59599516SKenneth E. Jansen      enddo
1040*59599516SKenneth E. Jansen
1041*59599516SKenneth E. Jansenc... For debugging
1042*59599516SKenneth E. Jansen
1043*59599516SKenneth E. Jansenc      hfres(:,1) = 2.0*x(:,1) - 3.0*x(:,2)
1044*59599516SKenneth E. Jansenc      hfres(:,2) = 3.0*x(:,1) + 4.0*x(:,2)
1045*59599516SKenneth E. Jansenc      hfres(:,3) = 4.0*x(:,1) + x(:,2) + x(:,3)
1046*59599516SKenneth E. Jansen
1047*59599516SKenneth E. Jansenc... Done w/ h-filtering. Begin 2h-filtering.
1048*59599516SKenneth E. Jansen
1049*59599516SKenneth E. Jansen      do iblk = 1,nelblk
1050*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
1051*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
1052*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
1053*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
1054*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
1055*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
1056*59599516SKenneth E. Jansen        inum  = iel + npro - 1
1057*59599516SKenneth E. Jansen
1058*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
1059*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
1060*59599516SKenneth E. Jansen
1061*59599516SKenneth E. Jansen        call twohfilterB (yold, x, strl(iel:inum,:), mien(iblk)%p,
1062*59599516SKenneth E. Jansen     &               fres, hfres, shgl(lcsyst,:,1:nshl,:),
1063*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
1064*59599516SKenneth E. Jansen
1065*59599516SKenneth E. Jansen      enddo
1066*59599516SKenneth E. Jansenc
1067*59599516SKenneth E. Jansen
1068*59599516SKenneth E. Jansen
1069*59599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 33, 'in ')
1070*59599516SKenneth E. Jansenc
1071*59599516SKenneth E. Jansenc account for periodicity in filtered variables
1072*59599516SKenneth E. Jansenc
1073*59599516SKenneth E. Jansen      do j = 1,nshg
1074*59599516SKenneth E. Jansen        i = iper(j)
1075*59599516SKenneth E. Jansen        if (i .ne. j) then
1076*59599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
1077*59599516SKenneth E. Jansen        endif
1078*59599516SKenneth E. Jansen      enddo
1079*59599516SKenneth E. Jansen
1080*59599516SKenneth E. Jansen      do j = 1,nshg
1081*59599516SKenneth E. Jansen        i = iper(j)
1082*59599516SKenneth E. Jansen        if (i .ne. j) then
1083*59599516SKenneth E. Jansen           fres(j,:) = fres(i,:)
1084*59599516SKenneth E. Jansen        endif
1085*59599516SKenneth E. Jansen      enddo
1086*59599516SKenneth E. Jansen
1087*59599516SKenneth E. Jansen      if(numpe>1)then
1088*59599516SKenneth E. Jansen         call commu (fres, ilwork, 33, 'out')
1089*59599516SKenneth E. Jansen      endif
1090*59599516SKenneth E. Jansen
1091*59599516SKenneth E. Jansen      fres(:,22) = one / fres(:,22)
1092*59599516SKenneth E. Jansen      do j = 1,21
1093*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,22)
1094*59599516SKenneth E. Jansen      enddo
1095*59599516SKenneth E. Jansen      do j = 23,33
1096*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,22)
1097*59599516SKenneth E. Jansen      enddo
1098*59599516SKenneth E. Jansen
1099*59599516SKenneth E. Jansen
1100*59599516SKenneth E. Jansen      do iblk = 1,nelblk
1101*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
1102*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
1103*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
1104*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
1105*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
1106*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
1107*59599516SKenneth E. Jansen        inum  = iel + npro - 1
1108*59599516SKenneth E. Jansen
1109*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
1110*59599516SKenneth E. Jansen
1111*59599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
1112*59599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
1113*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
1114*59599516SKenneth E. Jansen
1115*59599516SKenneth E. Jansen      enddo
1116*59599516SKenneth E. Jansen
1117*59599516SKenneth E. Jansenc
1118*59599516SKenneth E. Jansenc... Obtain the hat-tilde strain rate norm at the nodes
1119*59599516SKenneth E. Jansenc
1120*59599516SKenneth E. Jansen
1121*59599516SKenneth E. Jansen      strnrm = sqrt(
1122*59599516SKenneth E. Jansen     &  two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2)
1123*59599516SKenneth E. Jansen     &  + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
1124*59599516SKenneth E. Jansen
1125*59599516SKenneth E. Jansen      fwr = fwr1 * strnrm
1126*59599516SKenneth E. Jansen
1127*59599516SKenneth E. Jansen      xmij(:,1) = -fwr
1128*59599516SKenneth E. Jansen     &             * fres(:,10) + fres(:,16)
1129*59599516SKenneth E. Jansen      xmij(:,2) = -fwr
1130*59599516SKenneth E. Jansen     &             * fres(:,11) + fres(:,17)
1131*59599516SKenneth E. Jansen      xmij(:,3) = -fwr
1132*59599516SKenneth E. Jansen     &             * fres(:,12) + fres(:,18)
1133*59599516SKenneth E. Jansen
1134*59599516SKenneth E. Jansen      xmij(:,4) = -fwr * fres(:,13) + fres(:,19)
1135*59599516SKenneth E. Jansen      xmij(:,5) = -fwr * fres(:,14) + fres(:,20)
1136*59599516SKenneth E. Jansen      xmij(:,6) = -fwr * fres(:,15) + fres(:,21)
1137*59599516SKenneth E. Jansen
1138*59599516SKenneth E. Jansen
1139*59599516SKenneth E. Jansen      xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1)
1140*59599516SKenneth E. Jansen      xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2)
1141*59599516SKenneth E. Jansen      xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3)
1142*59599516SKenneth E. Jansen      xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2)
1143*59599516SKenneth E. Jansen      xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3)
1144*59599516SKenneth E. Jansen      xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3)
1145*59599516SKenneth E. Jansen
1146*59599516SKenneth E. Jansen      xnum =        xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2)
1147*59599516SKenneth E. Jansen     &                                    + xlij(:,3) * xmij(:,3)
1148*59599516SKenneth E. Jansen     &     + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5)
1149*59599516SKenneth E. Jansen     &                                    + xlij(:,6) * xmij(:,6))
1150*59599516SKenneth E. Jansen      xden =        xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2)
1151*59599516SKenneth E. Jansen     &                                    + xmij(:,3) * xmij(:,3)
1152*59599516SKenneth E. Jansen     &     + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5)
1153*59599516SKenneth E. Jansen     &                                    + xmij(:,6) * xmij(:,6))
1154*59599516SKenneth E. Jansen      xden = two * xden
1155*59599516SKenneth E. Jansen
1156*59599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
1157*59599516SKenneth E. Jansen        do j = 1,numnp
1158*59599516SKenneth E. Jansen          i = iper(j)
1159*59599516SKenneth E. Jansen          if (i .ne. j) then
1160*59599516SKenneth E. Jansen            xnum(j) = zero
1161*59599516SKenneth E. Jansen            xden(j) = zero
1162*59599516SKenneth E. Jansen          endif
1163*59599516SKenneth E. Jansen        enddo
1164*59599516SKenneth E. Jansen
1165*59599516SKenneth E. Jansen      if (numpe.gt.1) then
1166*59599516SKenneth E. Jansen
1167*59599516SKenneth E. Jansen         numtask = ilwork(1)
1168*59599516SKenneth E. Jansen         itkbeg = 1
1169*59599516SKenneth E. Jansen
1170*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
1171*59599516SKenneth E. Jansen         do itask = 1, numtask
1172*59599516SKenneth E. Jansen
1173*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
1174*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
1175*59599516SKenneth E. Jansen
1176*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
1177*59599516SKenneth E. Jansen               do is = 1,numseg
1178*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
1179*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
1180*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
1181*59599516SKenneth E. Jansen                  xnum(isgbeg:isgend) = zero
1182*59599516SKenneth E. Jansen                  xden(isgbeg:isgend) = zero
1183*59599516SKenneth E. Jansen               enddo
1184*59599516SKenneth E. Jansen            endif
1185*59599516SKenneth E. Jansen
1186*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
1187*59599516SKenneth E. Jansen
1188*59599516SKenneth E. Jansen         enddo
1189*59599516SKenneth E. Jansen
1190*59599516SKenneth E. Jansen      endif
1191*59599516SKenneth E. Jansenc
1192*59599516SKenneth E. Jansenc Description of arrays.   Each processor has an array of length equal
1193*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect
1194*59599516SKenneth E. Jansenc the numerator and one to collect the denominator.  There is also an array
1195*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each
1196*59599516SKenneth E. Jansenc on processor node, ifath(nnshg).  Finally, there is an arry of length
1197*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons
1198*59599516SKenneth E. Jansenc for each father.
1199*59599516SKenneth E. Jansenc
1200*59599516SKenneth E. Jansenc  Now loop over nodes and accumlate the numerator and the denominator
1201*59599516SKenneth E. Jansenc  to the father nodes.  Only on processor addition at this point.
1202*59599516SKenneth E. Jansenc  Note that serrogate fathers are collect some for the case where some
1203*59599516SKenneth E. Jansenc  sons are on another processor
1204*59599516SKenneth E. Jansenc
1205*59599516SKenneth E. Jansen      xnude = zero
1206*59599516SKenneth E. Jansen      do i = 1,nshg
1207*59599516SKenneth E. Jansen         xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i)
1208*59599516SKenneth E. Jansen         xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i)
1209*59599516SKenneth E. Jansen      enddo
1210*59599516SKenneth E. Jansen
1211*59599516SKenneth E. Jansenc
1212*59599516SKenneth E. Jansenc Now  the true fathers and serrogates combine results and update
1213*59599516SKenneth E. Jansenc each other.
1214*59599516SKenneth E. Jansenc
1215*59599516SKenneth E. Jansen      if(numpe .gt. 1)then
1216*59599516SKenneth E. Jansen         call drvAllreduce(xnude, xnuder,2*nfath)
1217*59599516SKenneth E. Jansenc
1218*59599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
1219*59599516SKenneth E. Jansenc
1220*59599516SKenneth E. Jansenc  xnuder is the sum of the sons for each father on all processor combined
1221*59599516SKenneth E. Jansenc  (the same as if we had not partitioned the mesh for each processor)
1222*59599516SKenneth E. Jansenc
1223*59599516SKenneth E. Jansenc   For each father we have precomputed the number of sons (including
1224*59599516SKenneth E. Jansenc   the sons off processor).
1225*59599516SKenneth E. Jansenc
1226*59599516SKenneth E. Jansenc   Now divide by number of sons to get the average (not really necessary
1227*59599516SKenneth E. Jansenc   for dynamic model since ratio will cancel nsons at each father)
1228*59599516SKenneth E. Jansenc
1229*59599516SKenneth E. Jansenc         xnuder(:,1) = xnuder(:,1) ! / nsons(:)
1230*59599516SKenneth E. Jansenc         xnuder(:,2) = xnuder(:,2) ! / nsons(:)
1231*59599516SKenneth E. Jansenc
1232*59599516SKenneth E. Jansenc  the next line is c \Delta^2
1233*59599516SKenneth E. Jansenc
1234*59599516SKenneth E. Jansen         xnuder(:,1) = xnuder(:,1) / (xnuder(:,2) + 1.d-09)
1235*59599516SKenneth E. Jansen         do i = 1,nfath
1236*59599516SKenneth E. Jansen            cdelsq1(i) = xnuder(i,1)
1237*59599516SKenneth E. Jansen         enddo
1238*59599516SKenneth E. Jansen      else
1239*59599516SKenneth E. Jansenc
1240*59599516SKenneth E. Jansenc     the next line is c \Delta^2, not nu_T but we want to save the
1241*59599516SKenneth E. Jansenc     memory
1242*59599516SKenneth E. Jansenc
1243*59599516SKenneth E. Jansen         xnude(:,1) = xnude(:,1) / (xnude(:,2) + 1.d-09)
1244*59599516SKenneth E. Jansen         do i = 1,nfath
1245*59599516SKenneth E. Jansen            cdelsq1(i) = xnude(i,1)
1246*59599516SKenneth E. Jansen         enddo
1247*59599516SKenneth E. Jansen      endif
1248*59599516SKenneth E. Jansen
1249*59599516SKenneth E. Jansen      if (myrank .eq. master) then
1250*59599516SKenneth E. Jansen         if (numpe .gt. 1) then
1251*59599516SKenneth E. Jansen            do i = 1, nfath
1252*59599516SKenneth E. Jansen               write(22,*)i, xnuder(i,1)
1253*59599516SKenneth E. Jansen            enddo
1254*59599516SKenneth E. Jansen         else
1255*59599516SKenneth E. Jansen            do i = 1, nfath
1256*59599516SKenneth E. Jansen               write(22,*)i, xnude(i,1)
1257*59599516SKenneth E. Jansen            enddo
1258*59599516SKenneth E. Jansen         endif
1259*59599516SKenneth E. Jansen      endif
1260*59599516SKenneth E. Jansen      call flush(22)
1261*59599516SKenneth E. Jansen
1262*59599516SKenneth E. Jansen      do i = 1, nfath
1263*59599516SKenneth E. Jansen         if (cdelsq1(i) .lt. zero) then
1264*59599516SKenneth E. Jansen            cdelsq1(i) = zero
1265*59599516SKenneth E. Jansen         endif
1266*59599516SKenneth E. Jansen      enddo
1267*59599516SKenneth E. Jansen
1268*59599516SKenneth E. Jansen      return
1269*59599516SKenneth E. Jansen      end
1270*59599516SKenneth E. Jansen      subroutine SUPGdis (y,           ac,         shgl,
1271*59599516SKenneth E. Jansen     &                  shp,         iper,       ilwork,
1272*59599516SKenneth E. Jansen     &                  nsons,       ifath,      x,
1273*59599516SKenneth E. Jansen     &                  iBC,    BC,  stabdis,    xavegt)
1274*59599516SKenneth E. Jansen
1275*59599516SKenneth E. Jansen
1276*59599516SKenneth E. Jansen      use stats            !
1277*59599516SKenneth E. Jansen      use pointer_data     ! brings in the pointers for the blocked arrays
1278*59599516SKenneth E. Jansen      use local_mass
1279*59599516SKenneth E. Jansen      use rlssave  ! Use the resolved Leonard stresses at the nodes.
1280*59599516SKenneth E. Jansen      use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
1281*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
1282*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
1283*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
1284*59599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
1285*59599516SKenneth E. Jansenc                    quad. points.
1286*59599516SKenneth E. Jansen
1287*59599516SKenneth E. Jansen
1288*59599516SKenneth E. Jansen
1289*59599516SKenneth E. Jansen      include "common.h"
1290*59599516SKenneth E. Jansen      include "mpif.h"
1291*59599516SKenneth E. Jansen      include "auxmpi.h"
1292*59599516SKenneth E. Jansen
1293*59599516SKenneth E. Jansen
1294*59599516SKenneth E. Jansen      dimension y(nshg,ndof),                  ac(nshg,ndof),
1295*59599516SKenneth E. Jansen     &          yold(nshg,ndof),
1296*59599516SKenneth E. Jansen     &          ifath(nshg),                   nsons(nshg),
1297*59599516SKenneth E. Jansen     &          iper(nshg),                    ilwork(nlwork),
1298*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
1299*59599516SKenneth E. Jansen     &          x(numnp,3),
1300*59599516SKenneth E. Jansen     &          qres(nshg,nsd*nsd),             rmass(nshg),
1301*59599516SKenneth E. Jansen     &          iBC(nshg),                      BC(nshg,ndofBC),
1302*59599516SKenneth E. Jansen     &          cdelsq(nshg),                   vol(nshg),
1303*59599516SKenneth E. Jansen     &          stress(nshg,9),                 diss(nshg,3),
1304*59599516SKenneth E. Jansen     &          xave(nshg,12),                  xaveg(nfath,12),
1305*59599516SKenneth E. Jansen     &          xavegr(nfath,12),               stabdis(nfath),
1306*59599516SKenneth E. Jansen     &          dmodc(nfath),                   strl(numel,ngauss),
1307*59599516SKenneth E. Jansen     &          xavegt(nfath,12)
1308*59599516SKenneth E. Jansen
1309*59599516SKenneth E. Jansen      character*5  cname
1310*59599516SKenneth E. Jansen      character*30 fname
1311*59599516SKenneth E. Jansen
1312*59599516SKenneth E. Jansen      yold(:,1)=y(:,4)
1313*59599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
1314*59599516SKenneth E. Jansen
1315*59599516SKenneth E. Jansenc
1316*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
1317*59599516SKenneth E. Jansenc
1318*59599516SKenneth E. Jansenc      yold(:,5) = 1.0  ! Debugging
1319*59599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2)
1320*59599516SKenneth E. Jansenc      yold(:,2) = 2.0
1321*59599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
1322*59599516SKenneth E. Jansenc      yold(:,3) = 3.0
1323*59599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
1324*59599516SKenneth E. Jansenc      yold(:,4) = 4.0
1325*59599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
1326*59599516SKenneth E. Jansenc                               suitable for the
1327*59599516SKenneth E. Jansen
1328*59599516SKenneth E. Jansenc.... First let us obtain cdelsq at each node in the domain.
1329*59599516SKenneth E. Jansenc.... We use numNden which lives in the quadfilt module.
1330*59599516SKenneth E. Jansen
1331*59599516SKenneth E. Jansen      if ( (istep .eq. 0) ) then
1332*59599516SKenneth E. Jansen         fname =  'dmodc.dat' // cname (myrank+1)
1333*59599516SKenneth E. Jansen         open (99,file=fname,form='unformatted',status='unknown')
1334*59599516SKenneth E. Jansen         read(99) dmodc
1335*59599516SKenneth E. Jansen         close(99)
1336*59599516SKenneth E. Jansen         cdelsq(:) = dmodc(ifath(:))
1337*59599516SKenneth E. Jansen      else
1338*59599516SKenneth E. Jansen         cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
1339*59599516SKenneth E. Jansen      endif
1340*59599516SKenneth E. Jansen
1341*59599516SKenneth E. Jansenc      if (myrank .eq. master) then
1342*59599516SKenneth E. Jansenc         do i = 1, nfath
1343*59599516SKenneth E. Jansenc            write(*,*)'dmod=', dmodc(i)
1344*59599516SKenneth E. Jansenc         enddo
1345*59599516SKenneth E. Jansenc      endif
1346*59599516SKenneth E. Jansen
1347*59599516SKenneth E. Jansen      if ( istep .eq. (nstep(1)-1) ) then
1348*59599516SKenneth E. Jansen         dmodc(ifath(:)) = cdelsq(:)
1349*59599516SKenneth E. Jansen         fname =  'dmodc.dat' // cname (myrank+1)
1350*59599516SKenneth E. Jansen         open (99,file=fname,form='unformatted', status='replace')
1351*59599516SKenneth E. Jansen         write(99) dmodc
1352*59599516SKenneth E. Jansen         close(99)
1353*59599516SKenneth E. Jansenc         if (myrank .eq. master) then
1354*59599516SKenneth E. Jansenc            do i = 1, nfath
1355*59599516SKenneth E. Jansenc               write(*,*)'dmod=', dmodc(i)
1356*59599516SKenneth E. Jansenc            enddo
1357*59599516SKenneth E. Jansenc         endif
1358*59599516SKenneth E. Jansen
1359*59599516SKenneth E. Jansen      endif
1360*59599516SKenneth E. Jansen
1361*59599516SKenneth E. Jansenc      if (istep .eq. 0)
1362*59599516SKenneth E. Jansen      do iblk = 1,nelblk
1363*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
1364*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
1365*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
1366*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
1367*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
1368*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
1369*59599516SKenneth E. Jansen        inum  = iel + npro - 1
1370*59599516SKenneth E. Jansen
1371*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
1372*59599516SKenneth E. Jansen
1373*59599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
1374*59599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
1375*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
1376*59599516SKenneth E. Jansen
1377*59599516SKenneth E. Jansen      enddo
1378*59599516SKenneth E. Jansen
1379*59599516SKenneth E. Jansen      do iblk = 1,nelblk
1380*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
1381*59599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
1382*59599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
1383*59599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
1384*59599516SKenneth E. Jansen         inum  = iel + npro - 1
1385*59599516SKenneth E. Jansen
1386*59599516SKenneth E. Jansen         ngauss = nint(lcsyst)
1387*59599516SKenneth E. Jansen
1388*59599516SKenneth E. Jansen         call scatnu (mien(iblk)%p, strl(iel:inum,:),
1389*59599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:))
1390*59599516SKenneth E. Jansen      enddo
1391*59599516SKenneth E. Jansenc      endif
1392*59599516SKenneth E. Jansen
1393*59599516SKenneth E. Jansen
1394*59599516SKenneth E. Jansen
1395*59599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3) then ! global reconstruction of qdiff
1396*59599516SKenneth E. Jansenc
1397*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
1398*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
1399*59599516SKenneth E. Jansenc
1400*59599516SKenneth E. Jansen           qres = zero
1401*59599516SKenneth E. Jansen           rmass = zero
1402*59599516SKenneth E. Jansen
1403*59599516SKenneth E. Jansen           do iblk = 1, nelblk
1404*59599516SKenneth E. Jansen              iel    = lcblk(1,iblk)
1405*59599516SKenneth E. Jansen              lelCat = lcblk(2,iblk)
1406*59599516SKenneth E. Jansen              lcsyst = lcblk(3,iblk)
1407*59599516SKenneth E. Jansen              iorder = lcblk(4,iblk)
1408*59599516SKenneth E. Jansen              nenl   = lcblk(5,iblk) ! no. of vertices per element
1409*59599516SKenneth E. Jansen              nshl   = lcblk(10,iblk)
1410*59599516SKenneth E. Jansen              mattyp = lcblk(7,iblk)
1411*59599516SKenneth E. Jansen              ndofl  = lcblk(8,iblk)
1412*59599516SKenneth E. Jansen              nsymdl = lcblk(9,iblk)
1413*59599516SKenneth E. Jansen              npro   = lcblk(1,iblk+1) - iel
1414*59599516SKenneth E. Jansen              ngauss = nint(lcsyst)
1415*59599516SKenneth E. Jansenc
1416*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
1417*59599516SKenneth E. Jansenc     and lumped mass matrix, rmass
1418*59599516SKenneth E. Jansen
1419*59599516SKenneth E. Jansen              call AsIq (y,                x,
1420*59599516SKenneth E. Jansen     &                   shp(lcsyst,1:nshl,:),
1421*59599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:),
1422*59599516SKenneth E. Jansen     &                   mien(iblk)%p,     mxmudmi(iblk)%p,
1423*59599516SKenneth E. Jansen     &                   qres,             rmass )
1424*59599516SKenneth E. Jansen           enddo
1425*59599516SKenneth E. Jansen
1426*59599516SKenneth E. Jansenc
1427*59599516SKenneth E. Jansenc.... form the diffusive flux approximation
1428*59599516SKenneth E. Jansenc
1429*59599516SKenneth E. Jansen           call qpbc( rmass, qres, iBC, BC, iper, ilwork )
1430*59599516SKenneth E. Jansenc
1431*59599516SKenneth E. Jansen        endif
1432*59599516SKenneth E. Jansen
1433*59599516SKenneth E. Jansen
1434*59599516SKenneth E. Jansenc.... form the SUPG stresses well as dissipation due to eddy viscosity,
1435*59599516SKenneth E. Jansenc...  and SUPG stabilization.
1436*59599516SKenneth E. Jansen
1437*59599516SKenneth E. Jansen
1438*59599516SKenneth E. Jansen        stress = zero
1439*59599516SKenneth E. Jansen        vol    = zero
1440*59599516SKenneth E. Jansen        diss   = zero
1441*59599516SKenneth E. Jansen
1442*59599516SKenneth E. Jansen      do iblk = 1,nelblk
1443*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
1444*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
1445*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
1446*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
1447*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
1448*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
1449*59599516SKenneth E. Jansen        inum  = iel + npro - 1
1450*59599516SKenneth E. Jansen
1451*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
1452*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
1453*59599516SKenneth E. Jansen
1454*59599516SKenneth E. Jansen        call SUPGstress (y, ac, x, qres, mien(iblk)%p, mxmudmi(iblk)%p,
1455*59599516SKenneth E. Jansen     &                   cdelsq, shglf(lcsyst,:,1:nshl,:),
1456*59599516SKenneth E. Jansen     &                   shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf),
1457*59599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:), shp(lcsyst,1:nshl,:),
1458*59599516SKenneth E. Jansen     &                   stress, diss, vol)
1459*59599516SKenneth E. Jansen
1460*59599516SKenneth E. Jansen      enddo
1461*59599516SKenneth E. Jansen
1462*59599516SKenneth E. Jansen      if(numpe>1) call commu (stress, ilwork, 9, 'in ')
1463*59599516SKenneth E. Jansen      if(numpe>1) call commu (diss, ilwork, 3, 'in ')
1464*59599516SKenneth E. Jansen      if(numpe>1) call commu (vol, ilwork, 1, 'in ')
1465*59599516SKenneth E. Jansen
1466*59599516SKenneth E. Jansenc
1467*59599516SKenneth E. Jansenc account for periodicity
1468*59599516SKenneth E. Jansenc
1469*59599516SKenneth E. Jansen      do j = 1,nshg
1470*59599516SKenneth E. Jansen        i = iper(j)
1471*59599516SKenneth E. Jansen        if (i .ne. j) then
1472*59599516SKenneth E. Jansen           stress(i,:) = stress(i,:) + stress(j,:)
1473*59599516SKenneth E. Jansen           diss(i,:)   = diss(i,:)   + diss(j,:)
1474*59599516SKenneth E. Jansen           vol(i)      = vol(i)      + vol(j)
1475*59599516SKenneth E. Jansen        endif
1476*59599516SKenneth E. Jansen      enddo
1477*59599516SKenneth E. Jansen
1478*59599516SKenneth E. Jansen      do j = 1,nshg
1479*59599516SKenneth E. Jansen        i = iper(j)
1480*59599516SKenneth E. Jansen        if (i .ne. j) then
1481*59599516SKenneth E. Jansen           stress(j,:) = stress(i,:)
1482*59599516SKenneth E. Jansen           diss(j,:)   = diss(i,:)
1483*59599516SKenneth E. Jansen           vol(j)      = vol(i)
1484*59599516SKenneth E. Jansen        endif
1485*59599516SKenneth E. Jansen      enddo
1486*59599516SKenneth E. Jansen
1487*59599516SKenneth E. Jansen      if(numpe>1) call commu (stress, ilwork, 9, 'out ')
1488*59599516SKenneth E. Jansen      if(numpe>1) call commu (diss, ilwork, 3, 'out ')
1489*59599516SKenneth E. Jansen      if(numpe>1) call commu (vol, ilwork, 1, 'out ')
1490*59599516SKenneth E. Jansen
1491*59599516SKenneth E. Jansen      vol = one / vol
1492*59599516SKenneth E. Jansen      do i = 1, 9
1493*59599516SKenneth E. Jansen         stress(:,i) = stress(:,i)*vol(:)
1494*59599516SKenneth E. Jansen      enddo
1495*59599516SKenneth E. Jansen      do i = 1, 3
1496*59599516SKenneth E. Jansen         diss(:,i) = diss(:,i)*vol(:)
1497*59599516SKenneth E. Jansen      enddo
1498*59599516SKenneth E. Jansen
1499*59599516SKenneth E. Jansenc---------- > Begin averaging dissipations and SUPG stress <--------------
1500*59599516SKenneth E. Jansen
1501*59599516SKenneth E. Jansen      do i = 1, 9
1502*59599516SKenneth E. Jansen         xave(:,i) = stress(:,i)
1503*59599516SKenneth E. Jansen      enddo
1504*59599516SKenneth E. Jansen      xave(:,10) = diss(:,1)
1505*59599516SKenneth E. Jansen      xave(:,11) = diss(:,2)
1506*59599516SKenneth E. Jansen      xave(:,12) = diss(:,3)
1507*59599516SKenneth E. Jansen
1508*59599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
1509*59599516SKenneth E. Jansen        do j = 1,numnp
1510*59599516SKenneth E. Jansen          i = iper(j)
1511*59599516SKenneth E. Jansen          if (i .ne. j) then
1512*59599516SKenneth E. Jansen            xave(j,:) = zero
1513*59599516SKenneth E. Jansen          endif
1514*59599516SKenneth E. Jansen        enddo
1515*59599516SKenneth E. Jansen
1516*59599516SKenneth E. Jansen      if (numpe.gt.1) then
1517*59599516SKenneth E. Jansen
1518*59599516SKenneth E. Jansen         numtask = ilwork(1)
1519*59599516SKenneth E. Jansen         itkbeg = 1
1520*59599516SKenneth E. Jansen
1521*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
1522*59599516SKenneth E. Jansen         do itask = 1, numtask
1523*59599516SKenneth E. Jansen
1524*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
1525*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
1526*59599516SKenneth E. Jansen
1527*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
1528*59599516SKenneth E. Jansen               do is = 1,numseg
1529*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
1530*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
1531*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
1532*59599516SKenneth E. Jansen                  xave(isgbeg:isgend,:) = zero
1533*59599516SKenneth E. Jansen               enddo
1534*59599516SKenneth E. Jansen            endif
1535*59599516SKenneth E. Jansen
1536*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
1537*59599516SKenneth E. Jansen
1538*59599516SKenneth E. Jansen         enddo
1539*59599516SKenneth E. Jansen
1540*59599516SKenneth E. Jansen      endif
1541*59599516SKenneth E. Jansenc
1542*59599516SKenneth E. Jansen
1543*59599516SKenneth E. Jansen      xaveg = zero
1544*59599516SKenneth E. Jansen      do i = 1,nshg
1545*59599516SKenneth E. Jansen         xaveg(ifath(i),:) = xaveg(ifath(i),:) + xave(i,:)
1546*59599516SKenneth E. Jansen      enddo
1547*59599516SKenneth E. Jansen
1548*59599516SKenneth E. Jansen      if(numpe .gt. 1)then
1549*59599516SKenneth E. Jansen         call drvAllreduce(xaveg, xavegr,12*nfath)
1550*59599516SKenneth E. Jansen
1551*59599516SKenneth E. Jansen         do m = 1, 12
1552*59599516SKenneth E. Jansen            xavegr(:,m) = xavegr(:,m)/nsons(:)
1553*59599516SKenneth E. Jansen         enddo
1554*59599516SKenneth E. Jansen
1555*59599516SKenneth E. Jansenc         if (myrank .eq. master) then
1556*59599516SKenneth E. Jansenc            write(*,*)'diss=', xavegt(14,11), xavegr(14,11)
1557*59599516SKenneth E. Jansenc         endif
1558*59599516SKenneth E. Jansen
1559*59599516SKenneth E. Jansen         do m = 1, 12
1560*59599516SKenneth E. Jansen            xavegt(:,m) = xavegt(:,m) + xavegr(:,m)
1561*59599516SKenneth E. Jansen         enddo
1562*59599516SKenneth E. Jansen
1563*59599516SKenneth E. Jansen         stabdis(:) = xavegr(:,10)
1564*59599516SKenneth E. Jansen
1565*59599516SKenneth E. Jansen      else
1566*59599516SKenneth E. Jansen
1567*59599516SKenneth E. Jansen         do m = 1, 12
1568*59599516SKenneth E. Jansen            xaveg(:,m) = xaveg(:,m)/nsons(:)
1569*59599516SKenneth E. Jansen         enddo
1570*59599516SKenneth E. Jansen
1571*59599516SKenneth E. Jansen         do m = 1, 12
1572*59599516SKenneth E. Jansen            xavegt(:,m) = xavegt(:,m) + xaveg(:,m)
1573*59599516SKenneth E. Jansen         enddo
1574*59599516SKenneth E. Jansen
1575*59599516SKenneth E. Jansen         stabdis(:) = xaveg(:,10)
1576*59599516SKenneth E. Jansen
1577*59599516SKenneth E. Jansen      endif
1578*59599516SKenneth E. Jansen
1579*59599516SKenneth E. Jansenc      if (myrank .eq. master) then
1580*59599516SKenneth E. Jansenc         write(*,*)'diss=', xavegt(14,11), xavegr(14,11)
1581*59599516SKenneth E. Jansenc      endif
1582*59599516SKenneth E. Jansen
1583*59599516SKenneth E. Jansen       if ( istep .eq. (nstep(1)-1) ) then
1584*59599516SKenneth E. Jansen          if ( myrank .eq. master) then
1585*59599516SKenneth E. Jansen
1586*59599516SKenneth E. Jansen             do i = 1, nfath
1587*59599516SKenneth E. Jansenc               write(376,*)xavegt(i,1),xavegt(i,2),xavegt(i,3)
1588*59599516SKenneth E. Jansenc               write(377,*)xavegt(i,4),xavegt(i,5),xavegt(i,6)
1589*59599516SKenneth E. Jansenc               write(378,*)xavegt(i,7),xavegt(i,8),xavegt(i,9)
1590*59599516SKenneth E. Jansen                write(380,*)xavegt(i,10),xavegt(i,11),xavegt(i,12)
1591*59599516SKenneth E. Jansen            enddo
1592*59599516SKenneth E. Jansen
1593*59599516SKenneth E. Jansenc            call flush(376)
1594*59599516SKenneth E. Jansenc            call flush(377)
1595*59599516SKenneth E. Jansenc            call flush(378)
1596*59599516SKenneth E. Jansen            call flush(380)
1597*59599516SKenneth E. Jansen
1598*59599516SKenneth E. Jansen         endif
1599*59599516SKenneth E. Jansen      endif
1600*59599516SKenneth E. Jansen
1601*59599516SKenneth E. Jansen
1602*59599516SKenneth E. Jansen      return
1603*59599516SKenneth E. Jansen
1604*59599516SKenneth E. Jansen      end
1605*59599516SKenneth E. Jansen      subroutine dmcSUPG(y,           ac,         shgl,
1606*59599516SKenneth E. Jansen     &                  shp,         iper,       ilwork,
1607*59599516SKenneth E. Jansen     &                  nsons,       ifath,      x,
1608*59599516SKenneth E. Jansen     &                  iBC,    BC,  rowp,       colm,
1609*59599516SKenneth E. Jansen     &                  xavegt, stabdis)
1610*59599516SKenneth E. Jansen
1611*59599516SKenneth E. Jansen      use lhsGkeep ! This module stores the mass (Gram) matrix.
1612*59599516SKenneth E. Jansen      use stats            !
1613*59599516SKenneth E. Jansen      use pointer_data     ! brings in the pointers for the blocked arrays
1614*59599516SKenneth E. Jansen      use local_mass
1615*59599516SKenneth E. Jansen      use rlssave  ! Use the resolved Leonard stresses at the nodes.
1616*59599516SKenneth E. Jansen      use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
1617*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
1618*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
1619*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
1620*59599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
1621*59599516SKenneth E. Jansenc                    quad. points.
1622*59599516SKenneth E. Jansen
1623*59599516SKenneth E. Jansen
1624*59599516SKenneth E. Jansen
1625*59599516SKenneth E. Jansen      include "common.h"
1626*59599516SKenneth E. Jansen      include "mpif.h"
1627*59599516SKenneth E. Jansen      include "auxmpi.h"
1628*59599516SKenneth E. Jansen
1629*59599516SKenneth E. Jansen
1630*59599516SKenneth E. Jansen      dimension y(nshg,ndof),                  ac(nshg,ndof),
1631*59599516SKenneth E. Jansen     &          ifath(nshg),                   nsons(nshg),
1632*59599516SKenneth E. Jansen     &          iper(nshg),                    ilwork(nlwork),
1633*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
1634*59599516SKenneth E. Jansen     &          x(numnp,3),
1635*59599516SKenneth E. Jansen     &          qres(nshg,nsd*nsd),             rmass(nshg),
1636*59599516SKenneth E. Jansen     &          iBC(nshg),                      BC(nshg,ndofBC),
1637*59599516SKenneth E. Jansen     &          cdelsq(nshg),                   vol(nshg),
1638*59599516SKenneth E. Jansen     &          stress(nshg,9),                 diss(nshg,3),
1639*59599516SKenneth E. Jansen     &          xave(nshg,12),                  xaveg(nfath,12),
1640*59599516SKenneth E. Jansen     &          xavegr(nfath,12),               stabdis(nfath),
1641*59599516SKenneth E. Jansen     &          yold(nshg,ndof),                xavegt(nfath,12),
1642*59599516SKenneth E. Jansen     &          fres(nshg,24),                  pfres(nshg,24),
1643*59599516SKenneth E. Jansen     &          cdel(nfath),                    xnume(nfath),
1644*59599516SKenneth E. Jansen     &          xdeno(nfath),                    strl(numel,ngauss),
1645*59599516SKenneth E. Jansen     &          rden(nshg),                     rnum(nshg)
1646*59599516SKenneth E. Jansen
1647*59599516SKenneth E. Jansen
1648*59599516SKenneth E. Jansen      integer   rowp(nshg*nnz),         colm(nshg+1)
1649*59599516SKenneth E. Jansen
1650*59599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:,:) :: em
1651*59599516SKenneth E. Jansen
1652*59599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:) :: fakexmu
1653*59599516SKenneth E. Jansen
1654*59599516SKenneth E. Jansen
1655*59599516SKenneth E. Jansen      yold(:,1)=y(:,4)
1656*59599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
1657*59599516SKenneth E. Jansen      fres = zero
1658*59599516SKenneth E. Jansen
1659*59599516SKenneth E. Jansenc
1660*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
1661*59599516SKenneth E. Jansenc
1662*59599516SKenneth E. Jansenc      yold(:,5) = 1.0  ! Debugging
1663*59599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2)
1664*59599516SKenneth E. Jansenc      yold(:,2) = 2.0
1665*59599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
1666*59599516SKenneth E. Jansenc      yold(:,3) = 3.0
1667*59599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
1668*59599516SKenneth E. Jansenc      yold(:,4) = 4.0
1669*59599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
1670*59599516SKenneth E. Jansenc                               suitable for the
1671*59599516SKenneth E. Jansen
1672*59599516SKenneth E. Jansen
1673*59599516SKenneth E. Jansen      intrul=intg(1,itseq)
1674*59599516SKenneth E. Jansen      intind=intpt(intrul)
1675*59599516SKenneth E. Jansen
1676*59599516SKenneth E. Jansen      do iblk = 1,nelblk
1677*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
1678*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
1679*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
1680*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
1681*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
1682*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
1683*59599516SKenneth E. Jansen        inum  = iel + npro - 1
1684*59599516SKenneth E. Jansen
1685*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
1686*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
1687*59599516SKenneth E. Jansen
1688*59599516SKenneth E. Jansen        call resSij (yold, x, mien(iblk)%p, fres,
1689*59599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
1690*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
1691*59599516SKenneth E. Jansen
1692*59599516SKenneth E. Jansen        if ( istep.eq.0 ) then
1693*59599516SKenneth E. Jansen
1694*59599516SKenneth E. Jansen           allocate ( em(npro,nshl,nshl) )
1695*59599516SKenneth E. Jansen
1696*59599516SKenneth E. Jansen           call getgram2 (x, mien(iblk)%p,
1697*59599516SKenneth E. Jansen     &          shgl(lcsyst,:,1:nshl,:),  shp(lcsyst,1:nshl,:),
1698*59599516SKenneth E. Jansen     &          shglf(lcsyst,:,1:nshl,:), shpf(lcsyst,1:nshl,:), em,
1699*59599516SKenneth E. Jansen     &          Qwtf(lcsyst,1:ngaussf))
1700*59599516SKenneth E. Jansen
1701*59599516SKenneth E. Jansenc           call getgram (x, mien(iblk)%p,
1702*59599516SKenneth E. Jansenc     &          shgl(lcsyst,:,1:nshl,:),  shp(lcsyst,1:nshl,:),
1703*59599516SKenneth E. Jansenc     &          em, Qwtf(lcsyst,1:ngaussf))
1704*59599516SKenneth E. Jansen
1705*59599516SKenneth E. Jansen           call fillsparseSclr (mien(iblk)%p,
1706*59599516SKenneth E. Jansen     &                          em,            lhsG,
1707*59599516SKenneth E. Jansen     &                          rowp,          colm)
1708*59599516SKenneth E. Jansen
1709*59599516SKenneth E. Jansen
1710*59599516SKenneth E. Jansen           deallocate ( em )
1711*59599516SKenneth E. Jansen
1712*59599516SKenneth E. Jansen        endif
1713*59599516SKenneth E. Jansen
1714*59599516SKenneth E. Jansen      enddo   ! End loop over element blocks
1715*59599516SKenneth E. Jansenc
1716*59599516SKenneth E. Jansen
1717*59599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 24, 'in ')
1718*59599516SKenneth E. Jansenc
1719*59599516SKenneth E. Jansenc account for periodicity in filtered variables
1720*59599516SKenneth E. Jansenc
1721*59599516SKenneth E. Jansen      do j = 1,nshg
1722*59599516SKenneth E. Jansen        i = iper(j)
1723*59599516SKenneth E. Jansen        if (i .ne. j) then
1724*59599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
1725*59599516SKenneth E. Jansen        endif
1726*59599516SKenneth E. Jansen      enddo
1727*59599516SKenneth E. Jansen      do j = 1,nshg
1728*59599516SKenneth E. Jansen        i = iper(j)
1729*59599516SKenneth E. Jansen        if (i .ne. j) then
1730*59599516SKenneth E. Jansen           fres(j,:) = fres(i,:)
1731*59599516SKenneth E. Jansen        endif
1732*59599516SKenneth E. Jansen      enddo
1733*59599516SKenneth E. Jansen
1734*59599516SKenneth E. Jansen      if(numpe>1)   call commu (fres, ilwork, 24, 'out')
1735*59599516SKenneth E. Jansen
1736*59599516SKenneth E. Jansen      fres(:,22) = one / fres(:,22)
1737*59599516SKenneth E. Jansen      do j = 1,21
1738*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,22)
1739*59599516SKenneth E. Jansen      enddo
1740*59599516SKenneth E. Jansen      pfres = fres
1741*59599516SKenneth E. Jansen
1742*59599516SKenneth E. Jansenc---- Needed for consistent projection
1743*59599516SKenneth E. Jansen
1744*59599516SKenneth E. Jansenc      if(numpe>1) call commu (fres, ilwork, 24, 'in ')
1745*59599516SKenneth E. Jansenc
1746*59599516SKenneth E. Jansenc account for periodicity in filtered variables
1747*59599516SKenneth E. Jansenc
1748*59599516SKenneth E. Jansenc      do j = 1,nshg
1749*59599516SKenneth E. Jansenc        i = iper(j)
1750*59599516SKenneth E. Jansenc        if (i .ne. j) then
1751*59599516SKenneth E. Jansenc           fres(i,:) = fres(i,:) + fres(j,:)
1752*59599516SKenneth E. Jansenc        endif
1753*59599516SKenneth E. Jansenc      enddo
1754*59599516SKenneth E. Jansen
1755*59599516SKenneth E. Jansenc      do j = 1,nshg
1756*59599516SKenneth E. Jansenc        i = iper(j)
1757*59599516SKenneth E. Jansenc        if (i .ne. j) then
1758*59599516SKenneth E. Jansenc           fres(j,:) = zero
1759*59599516SKenneth E. Jansenc        endif
1760*59599516SKenneth E. Jansenc      enddo
1761*59599516SKenneth E. Jansen
1762*59599516SKenneth E. Jansenc     Need to zero off-processor slaves as well.
1763*59599516SKenneth E. Jansen
1764*59599516SKenneth E. Jansenc      if (numpe.gt.1 .and. nsons(1).gt.1) then
1765*59599516SKenneth E. Jansen
1766*59599516SKenneth E. Jansenc         numtask = ilwork(1)
1767*59599516SKenneth E. Jansenc         itkbeg = 1
1768*59599516SKenneth E. Jansen
1769*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
1770*59599516SKenneth E. Jansen
1771*59599516SKenneth E. Jansenc         do itask = 1, numtask
1772*59599516SKenneth E. Jansen
1773*59599516SKenneth E. Jansenc            iacc   = ilwork (itkbeg + 2)
1774*59599516SKenneth E. Jansenc            numseg = ilwork (itkbeg + 4)
1775*59599516SKenneth E. Jansen
1776*59599516SKenneth E. Jansenc            if (iacc .eq. 0) then
1777*59599516SKenneth E. Jansenc               do is = 1,numseg
1778*59599516SKenneth E. Jansenc                  isgbeg = ilwork (itkbeg + 3 + 2*is)
1779*59599516SKenneth E. Jansenc                  lenseg = ilwork (itkbeg + 4 + 2*is)
1780*59599516SKenneth E. Jansenc                  isgend = isgbeg + lenseg - 1
1781*59599516SKenneth E. Jansenc                  fres(isgbeg:isgend,:) = zero
1782*59599516SKenneth E. Jansenc               enddo
1783*59599516SKenneth E. Jansenc            endif
1784*59599516SKenneth E. Jansen
1785*59599516SKenneth E. Jansenc            itkbeg = itkbeg + 4 + 2*numseg
1786*59599516SKenneth E. Jansen
1787*59599516SKenneth E. Jansenc         enddo
1788*59599516SKenneth E. Jansen
1789*59599516SKenneth E. Jansenc      endif
1790*59599516SKenneth E. Jansen
1791*59599516SKenneth E. Jansenc... At this point fres has the right hand side vector (b) and lhsG has
1792*59599516SKenneth E. Jansenc... the Gram matrix (M_{AB}) (in sparse storage). Now we need to solve
1793*59599516SKenneth E. Jansenc... Ax = b using the conjugate gradient method to finish off the
1794*59599516SKenneth E. Jansenc... L2-projection.
1795*59599516SKenneth E. Jansen
1796*59599516SKenneth E. Jansen
1797*59599516SKenneth E. Jansenc      do i = 16, 16
1798*59599516SKenneth E. Jansenc         call sparseCG (fres(:,i), pfres(:,i), lhsG,
1799*59599516SKenneth E. Jansenc     &        rowp, colm, iper, ilwork,
1800*59599516SKenneth E. Jansenc     &        iBC,  BC)
1801*59599516SKenneth E. Jansenc         write(*,*) 'i=', i
1802*59599516SKenneth E. Jansenc      enddo
1803*59599516SKenneth E. Jansen
1804*59599516SKenneth E. Jansen
1805*59599516SKenneth E. Jansenc      write(*,*)'Done with least-squares projection'
1806*59599516SKenneth E. Jansen
1807*59599516SKenneth E. Jansen
1808*59599516SKenneth E. Jansen
1809*59599516SKenneth E. Jansen
1810*59599516SKenneth E. Jansen
1811*59599516SKenneth E. Jansenc.... First let us obtain cdelsq at each node in the domain.
1812*59599516SKenneth E. Jansenc.... We use numNden which lives in the quadfilt module.
1813*59599516SKenneth E. Jansen
1814*59599516SKenneth E. Jansen      cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
1815*59599516SKenneth E. Jansenc      cdelsq(:) = zero ! Debugging
1816*59599516SKenneth E. Jansen
1817*59599516SKenneth E. Jansen      if (istep .eq. 0) then
1818*59599516SKenneth E. Jansen         xavegt = zero  ! For averaging dissipations and SUPG stresses
1819*59599516SKenneth E. Jansen      endif
1820*59599516SKenneth E. Jansen
1821*59599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3) then ! global reconstruction of qdiff
1822*59599516SKenneth E. Jansenc
1823*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
1824*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
1825*59599516SKenneth E. Jansenc
1826*59599516SKenneth E. Jansen           qres = zero
1827*59599516SKenneth E. Jansen           rmass = zero
1828*59599516SKenneth E. Jansen
1829*59599516SKenneth E. Jansen           do iblk = 1, nelblk
1830*59599516SKenneth E. Jansen              iel    = lcblk(1,iblk)
1831*59599516SKenneth E. Jansen              lelCat = lcblk(2,iblk)
1832*59599516SKenneth E. Jansen              lcsyst = lcblk(3,iblk)
1833*59599516SKenneth E. Jansen              iorder = lcblk(4,iblk)
1834*59599516SKenneth E. Jansen              nenl   = lcblk(5,iblk) ! no. of vertices per element
1835*59599516SKenneth E. Jansen              nshl   = lcblk(10,iblk)
1836*59599516SKenneth E. Jansen              mattyp = lcblk(7,iblk)
1837*59599516SKenneth E. Jansen              ndofl  = lcblk(8,iblk)
1838*59599516SKenneth E. Jansen              nsymdl = lcblk(9,iblk)
1839*59599516SKenneth E. Jansen              npro   = lcblk(1,iblk+1) - iel
1840*59599516SKenneth E. Jansen              ngauss = nint(lcsyst)
1841*59599516SKenneth E. Jansen
1842*59599516SKenneth E. Jansen              allocate ( fakexmu(npro,ngauss) )
1843*59599516SKenneth E. Jansen              fakexmu = zero
1844*59599516SKenneth E. Jansen
1845*59599516SKenneth E. Jansenc
1846*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
1847*59599516SKenneth E. Jansenc     and lumped mass matrix, rmass
1848*59599516SKenneth E. Jansen
1849*59599516SKenneth E. Jansen              call AsIq (y,                x,
1850*59599516SKenneth E. Jansen     &                   shp(lcsyst,1:nshl,:),
1851*59599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:),
1852*59599516SKenneth E. Jansen     &                   mien(iblk)%p,     mxmudmi(iblk)%p,
1853*59599516SKenneth E. Jansen     &                   qres,             rmass )
1854*59599516SKenneth E. Jansen
1855*59599516SKenneth E. Jansen              deallocate ( fakexmu )
1856*59599516SKenneth E. Jansen           enddo
1857*59599516SKenneth E. Jansen
1858*59599516SKenneth E. Jansenc
1859*59599516SKenneth E. Jansenc.... form the diffusive flux approximation
1860*59599516SKenneth E. Jansenc
1861*59599516SKenneth E. Jansen           call qpbc( rmass, qres, iBC, BC, iper, ilwork )
1862*59599516SKenneth E. Jansenc
1863*59599516SKenneth E. Jansen        endif
1864*59599516SKenneth E. Jansen
1865*59599516SKenneth E. Jansen
1866*59599516SKenneth E. Jansenc.... form the SUPG stresses well as dissipation due to eddy viscosity,
1867*59599516SKenneth E. Jansenc...  and SUPG stabilization.
1868*59599516SKenneth E. Jansen
1869*59599516SKenneth E. Jansen
1870*59599516SKenneth E. Jansen        stress = zero
1871*59599516SKenneth E. Jansen        vol    = zero
1872*59599516SKenneth E. Jansen        diss   = zero
1873*59599516SKenneth E. Jansen
1874*59599516SKenneth E. Jansen      do iblk = 1,nelblk
1875*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
1876*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
1877*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
1878*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
1879*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
1880*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
1881*59599516SKenneth E. Jansen        inum  = iel + npro - 1
1882*59599516SKenneth E. Jansen
1883*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
1884*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
1885*59599516SKenneth E. Jansen
1886*59599516SKenneth E. Jansen        allocate ( fakexmu(npro,ngauss) )
1887*59599516SKenneth E. Jansen        fakexmu = zero
1888*59599516SKenneth E. Jansen
1889*59599516SKenneth E. Jansen        call SUPGstress (y, ac, x, qres, mien(iblk)%p, fakexmu,
1890*59599516SKenneth E. Jansen     &                   cdelsq, shglf(lcsyst,:,1:nshl,:),
1891*59599516SKenneth E. Jansen     &                   shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf),
1892*59599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:), shp(lcsyst,1:nshl,:),
1893*59599516SKenneth E. Jansen     &                   stress, diss, vol)
1894*59599516SKenneth E. Jansen
1895*59599516SKenneth E. Jansen        deallocate ( fakexmu )
1896*59599516SKenneth E. Jansen      enddo
1897*59599516SKenneth E. Jansen
1898*59599516SKenneth E. Jansen      if(numpe>1) call commu (stress, ilwork, 9, 'in ')
1899*59599516SKenneth E. Jansen      if(numpe>1) call commu (diss, ilwork, 3, 'in ')
1900*59599516SKenneth E. Jansen      if(numpe>1) call commu (vol, ilwork, 1, 'in ')
1901*59599516SKenneth E. Jansen
1902*59599516SKenneth E. Jansenc
1903*59599516SKenneth E. Jansenc account for periodicity
1904*59599516SKenneth E. Jansenc
1905*59599516SKenneth E. Jansen      do j = 1,nshg
1906*59599516SKenneth E. Jansen        i = iper(j)
1907*59599516SKenneth E. Jansen        if (i .ne. j) then
1908*59599516SKenneth E. Jansen           stress(i,:) = stress(i,:) + stress(j,:)
1909*59599516SKenneth E. Jansen           diss(i,:)   = diss(i,:)   + diss(j,:)
1910*59599516SKenneth E. Jansen           vol(i)      = vol(i)      + vol(j)
1911*59599516SKenneth E. Jansen        endif
1912*59599516SKenneth E. Jansen      enddo
1913*59599516SKenneth E. Jansen
1914*59599516SKenneth E. Jansen      do j = 1,nshg
1915*59599516SKenneth E. Jansen        i = iper(j)
1916*59599516SKenneth E. Jansen        if (i .ne. j) then
1917*59599516SKenneth E. Jansen           stress(j,:) = stress(i,:)
1918*59599516SKenneth E. Jansen           diss(j,:)   = diss(i,:)
1919*59599516SKenneth E. Jansen           vol(j)      = vol(i)
1920*59599516SKenneth E. Jansen        endif
1921*59599516SKenneth E. Jansen      enddo
1922*59599516SKenneth E. Jansen
1923*59599516SKenneth E. Jansen      if(numpe>1) call commu (stress, ilwork, 9, 'out ')
1924*59599516SKenneth E. Jansen      if(numpe>1) call commu (diss, ilwork, 3, 'out ')
1925*59599516SKenneth E. Jansen      if(numpe>1) call commu (vol, ilwork, 1, 'out ')
1926*59599516SKenneth E. Jansen
1927*59599516SKenneth E. Jansen      vol = one / vol
1928*59599516SKenneth E. Jansen      do i = 1, 9
1929*59599516SKenneth E. Jansen         stress(:,i) = stress(:,i)*vol(:)
1930*59599516SKenneth E. Jansen      enddo
1931*59599516SKenneth E. Jansen      do i = 1, 3
1932*59599516SKenneth E. Jansen         diss(:,i) = diss(:,i)*vol(:)
1933*59599516SKenneth E. Jansen      enddo
1934*59599516SKenneth E. Jansen
1935*59599516SKenneth E. Jansenc---------- > Begin averaging dissipations and SUPG stress <--------------
1936*59599516SKenneth E. Jansen
1937*59599516SKenneth E. Jansen      do i = 1, 9
1938*59599516SKenneth E. Jansen         xave(:,i) = stress(:,i)
1939*59599516SKenneth E. Jansen      enddo
1940*59599516SKenneth E. Jansen      xave(:,10) = diss(:,1)
1941*59599516SKenneth E. Jansen      xave(:,11) = diss(:,2)
1942*59599516SKenneth E. Jansen      xave(:,12) = pfres(:,16)
1943*59599516SKenneth E. Jansen
1944*59599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
1945*59599516SKenneth E. Jansen        do j = 1,numnp
1946*59599516SKenneth E. Jansen          i = iper(j)
1947*59599516SKenneth E. Jansen          if (i .ne. j) then
1948*59599516SKenneth E. Jansen            xave(j,:) = zero
1949*59599516SKenneth E. Jansen          endif
1950*59599516SKenneth E. Jansen        enddo
1951*59599516SKenneth E. Jansen
1952*59599516SKenneth E. Jansen      if (numpe.gt.1) then
1953*59599516SKenneth E. Jansen
1954*59599516SKenneth E. Jansen         numtask = ilwork(1)
1955*59599516SKenneth E. Jansen         itkbeg = 1
1956*59599516SKenneth E. Jansen
1957*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
1958*59599516SKenneth E. Jansen         do itask = 1, numtask
1959*59599516SKenneth E. Jansen
1960*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
1961*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
1962*59599516SKenneth E. Jansen
1963*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
1964*59599516SKenneth E. Jansen               do is = 1,numseg
1965*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
1966*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
1967*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
1968*59599516SKenneth E. Jansen                  xave(isgbeg:isgend,:) = zero
1969*59599516SKenneth E. Jansen               enddo
1970*59599516SKenneth E. Jansen            endif
1971*59599516SKenneth E. Jansen
1972*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
1973*59599516SKenneth E. Jansen
1974*59599516SKenneth E. Jansen         enddo
1975*59599516SKenneth E. Jansen
1976*59599516SKenneth E. Jansen      endif
1977*59599516SKenneth E. Jansenc
1978*59599516SKenneth E. Jansen
1979*59599516SKenneth E. Jansen      xaveg = zero
1980*59599516SKenneth E. Jansen      do i = 1,nshg
1981*59599516SKenneth E. Jansen         xaveg(ifath(i),:) = xaveg(ifath(i),:) + xave(i,:)
1982*59599516SKenneth E. Jansen      enddo
1983*59599516SKenneth E. Jansen
1984*59599516SKenneth E. Jansen      if(numpe .gt. 1)then
1985*59599516SKenneth E. Jansen         call drvAllreduce(xaveg, xavegr,12*nfath)
1986*59599516SKenneth E. Jansen
1987*59599516SKenneth E. Jansen         do m = 1, 12
1988*59599516SKenneth E. Jansen            xavegr(:,m) = xavegr(:,m)/nsons(:)
1989*59599516SKenneth E. Jansen         enddo
1990*59599516SKenneth E. Jansen
1991*59599516SKenneth E. Jansenc         if (myrank .eq. master) then
1992*59599516SKenneth E. Jansenc            write(*,*)'diss=', xavegt(14,11), xavegr(14,11)
1993*59599516SKenneth E. Jansenc         endif
1994*59599516SKenneth E. Jansen
1995*59599516SKenneth E. Jansen         do m = 1, 12
1996*59599516SKenneth E. Jansen            xavegt(:,m) = xavegt(:,m) + xavegr(:,m)
1997*59599516SKenneth E. Jansen         enddo
1998*59599516SKenneth E. Jansen
1999*59599516SKenneth E. Jansen      else
2000*59599516SKenneth E. Jansen
2001*59599516SKenneth E. Jansen         do m = 1, 12
2002*59599516SKenneth E. Jansen            xaveg(:,m) = xaveg(:,m)/nsons(:)
2003*59599516SKenneth E. Jansen         enddo
2004*59599516SKenneth E. Jansen
2005*59599516SKenneth E. Jansen         do m = 1, 12
2006*59599516SKenneth E. Jansen            xavegt(:,m) = xavegt(:,m) + xaveg(:,m)
2007*59599516SKenneth E. Jansen         enddo
2008*59599516SKenneth E. Jansen
2009*59599516SKenneth E. Jansen      endif
2010*59599516SKenneth E. Jansen
2011*59599516SKenneth E. Jansen      if (myrank .eq. master) then
2012*59599516SKenneth E. Jansen         write(*,*)'diss0=', xavegt(14,11), xavegr(14,11)
2013*59599516SKenneth E. Jansen      endif
2014*59599516SKenneth E. Jansen
2015*59599516SKenneth E. Jansen      if ( istep .eq. (nstep(1)-1) ) then
2016*59599516SKenneth E. Jansen         if ( myrank .eq. master) then
2017*59599516SKenneth E. Jansen
2018*59599516SKenneth E. Jansen            do i = 1, nfath
2019*59599516SKenneth E. Jansenc               write(376,*)xavegt(i,1),xavegt(i,2),xavegt(i,3)
2020*59599516SKenneth E. Jansenc               write(377,*)xavegt(i,4),xavegt(i,5),xavegt(i,6)
2021*59599516SKenneth E. Jansenc               write(378,*)xavegt(i,7),xavegt(i,8),xavegt(i,9)
2022*59599516SKenneth E. Jansen               write(381,*)xavegt(i,10),xavegt(i,11),xavegt(i,12)
2023*59599516SKenneth E. Jansen            enddo
2024*59599516SKenneth E. Jansen
2025*59599516SKenneth E. Jansenc            call flush(376)
2026*59599516SKenneth E. Jansenc            call flush(377)
2027*59599516SKenneth E. Jansenc            call flush(378)
2028*59599516SKenneth E. Jansenc            call flush(379)
2029*59599516SKenneth E. Jansen            call flush(381)
2030*59599516SKenneth E. Jansen         endif
2031*59599516SKenneth E. Jansen      endif
2032*59599516SKenneth E. Jansen
2033*59599516SKenneth E. Jansen      rnum(ifath(:)) = numNden(:,1)
2034*59599516SKenneth E. Jansen      rden(ifath(:)) = numNden(:,2)
2035*59599516SKenneth E. Jansen
2036*59599516SKenneth E. Jansen      if (numpe .gt. 1) then
2037*59599516SKenneth E. Jansen      do i = 1, nfath
2038*59599516SKenneth E. Jansen         if (stabdis(i) .gt. zero) then
2039*59599516SKenneth E. Jansen            cdel(i) = (two*xavegr(i,11)-stabdis(i))/xavegr(i,12)
2040*59599516SKenneth E. Jansen            xnume(i) = two*xavegr(i,11)-stabdis(i)
2041*59599516SKenneth E. Jansen            xdeno(i) = xavegr(i,12)
2042*59599516SKenneth E. Jansen         else
2043*59599516SKenneth E. Jansen            xnume(i) = rnum(i)
2044*59599516SKenneth E. Jansen            xdeno(i) = rden(i)
2045*59599516SKenneth E. Jansen         endif
2046*59599516SKenneth E. Jansen      enddo
2047*59599516SKenneth E. Jansen      else
2048*59599516SKenneth E. Jansen      do i = 1, nfath
2049*59599516SKenneth E. Jansen         if (stabdis(i) .gt. zero) then
2050*59599516SKenneth E. Jansen            cdel(i) = (two*xaveg(i,11)-stabdis(i))/xaveg(i,12)
2051*59599516SKenneth E. Jansen            xnume(i) = two*xaveg(i,11)-stabdis(i)
2052*59599516SKenneth E. Jansen            xdeno(i) = xaveg(i,12)
2053*59599516SKenneth E. Jansen         else
2054*59599516SKenneth E. Jansen            xnume(i) = rnum(i)
2055*59599516SKenneth E. Jansen            xdeno(i) = rden(i)
2056*59599516SKenneth E. Jansen         endif
2057*59599516SKenneth E. Jansen      enddo
2058*59599516SKenneth E. Jansen      endif
2059*59599516SKenneth E. Jansen
2060*59599516SKenneth E. Jansen      do i = 1, nfath
2061*59599516SKenneth E. Jansen         if (xnume(i) .lt. zero) then
2062*59599516SKenneth E. Jansen            xnume(i) = rnum(i)
2063*59599516SKenneth E. Jansen            xdeno(i) = rden(i)
2064*59599516SKenneth E. Jansen         endif
2065*59599516SKenneth E. Jansen      enddo
2066*59599516SKenneth E. Jansen
2067*59599516SKenneth E. Jansen      do i = 1, nshg
2068*59599516SKenneth E. Jansen            numNden(i,1) = xnume(ifath(i))
2069*59599516SKenneth E. Jansen            numNden(i,2) = xdeno(ifath(i))
2070*59599516SKenneth E. Jansen      enddo
2071*59599516SKenneth E. Jansen
2072*59599516SKenneth E. Jansen      cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
2073*59599516SKenneth E. Jansen
2074*59599516SKenneth E. Jansen      do iblk = 1,nelblk
2075*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
2076*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
2077*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
2078*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
2079*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
2080*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
2081*59599516SKenneth E. Jansen        inum  = iel + npro - 1
2082*59599516SKenneth E. Jansen
2083*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
2084*59599516SKenneth E. Jansen
2085*59599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
2086*59599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
2087*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
2088*59599516SKenneth E. Jansen
2089*59599516SKenneth E. Jansen      enddo
2090*59599516SKenneth E. Jansen
2091*59599516SKenneth E. Jansen
2092*59599516SKenneth E. Jansen      do iblk = 1,nelblk
2093*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
2094*59599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
2095*59599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
2096*59599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
2097*59599516SKenneth E. Jansen         inum  = iel + npro - 1
2098*59599516SKenneth E. Jansen
2099*59599516SKenneth E. Jansen         ngauss = nint(lcsyst)
2100*59599516SKenneth E. Jansen
2101*59599516SKenneth E. Jansen         call scatnu (mien(iblk)%p, strl(iel:inum,:),
2102*59599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:))
2103*59599516SKenneth E. Jansen      enddo
2104*59599516SKenneth E. Jansen
2105*59599516SKenneth E. Jansen      return
2106*59599516SKenneth E. Jansen
2107*59599516SKenneth E. Jansen      end
2108*59599516SKenneth E. Jansen      subroutine FiltRat (y,      shgl,      shp,
2109*59599516SKenneth E. Jansen     &                   iper,   ilwork,
2110*59599516SKenneth E. Jansen     &                   nsons,  ifath,     x,   cdelsq1, fwr4,
2111*59599516SKenneth E. Jansen     &                   fwr3)
2112*59599516SKenneth E. Jansen
2113*59599516SKenneth E. Jansen      use pointer_data
2114*59599516SKenneth E. Jansen
2115*59599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
2116*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
2117*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
2118*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
2119*59599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
2120*59599516SKenneth E. Jansenc                    quad. points.
2121*59599516SKenneth E. Jansen
2122*59599516SKenneth E. Jansen      include "common.h"
2123*59599516SKenneth E. Jansen      include "mpif.h"
2124*59599516SKenneth E. Jansen      include "auxmpi.h"
2125*59599516SKenneth E. Jansen
2126*59599516SKenneth E. Jansenc
2127*59599516SKenneth E. Jansen      dimension fres(nshg,24),         fwr(nshg),
2128*59599516SKenneth E. Jansen     &          strnrm(nshg),         cdelsq1(nfath),
2129*59599516SKenneth E. Jansen     &          xnum(nshg),           xden(nshg),
2130*59599516SKenneth E. Jansen     &          xmij(nshg,6),         xlij(nshg,6),
2131*59599516SKenneth E. Jansen     &          xnude(nfath,5),        xnuder(nfath,5),
2132*59599516SKenneth E. Jansen     &          nsons(nshg),           xfac(nshg,5),
2133*59599516SKenneth E. Jansen     &          strl(numel,ngauss),     xa(nfath,3),
2134*59599516SKenneth E. Jansen     &          y(nshg,5),            yold(nshg,5),
2135*59599516SKenneth E. Jansen     &          ifath(nshg),          iper(nshg),
2136*59599516SKenneth E. Jansen     &          ilwork(nlwork),!        xmudmi(numel,ngauss),
2137*59599516SKenneth E. Jansen     &          x(numnp,3),
2138*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
2139*59599516SKenneth E. Jansen     &          xnutf(nfath),          xkap(nfath),
2140*59599516SKenneth E. Jansen     &          fwr2(nshg),            fwr3(nshg),
2141*59599516SKenneth E. Jansen     &          xlamb1(nfath),         xlamb2(nfath),
2142*59599516SKenneth E. Jansen     &          fwr4(nshg)
2143*59599516SKenneth E. Jansenc
2144*59599516SKenneth E. Jansen
2145*59599516SKenneth E. Jansen      fres = zero
2146*59599516SKenneth E. Jansen      yold(:,1)=y(:,4)
2147*59599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
2148*59599516SKenneth E. Jansenc
2149*59599516SKenneth E. Jansenc
2150*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
2151*59599516SKenneth E. Jansenc
2152*59599516SKenneth E. Jansenc      yold(:,5) = 1.0  ! Debugging
2153*59599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2)
2154*59599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
2155*59599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
2156*59599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
2157*59599516SKenneth E. Jansenc                               suitable for the
2158*59599516SKenneth E. Jansen
2159*59599516SKenneth E. Jansen
2160*59599516SKenneth E. Jansen      intrul=intg(1,itseq)
2161*59599516SKenneth E. Jansen      intind=intpt(intrul)
2162*59599516SKenneth E. Jansen
2163*59599516SKenneth E. Jansen      do iblk = 1,nelblk
2164*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
2165*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
2166*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
2167*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
2168*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
2169*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
2170*59599516SKenneth E. Jansen        inum  = iel + npro - 1
2171*59599516SKenneth E. Jansen
2172*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
2173*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
2174*59599516SKenneth E. Jansen
2175*59599516SKenneth E. Jansen        call asithf (yold, x, strl(iel:inum,:), mien(iblk)%p, fres,
2176*59599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
2177*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
2178*59599516SKenneth E. Jansen
2179*59599516SKenneth E. Jansen      enddo
2180*59599516SKenneth E. Jansenc
2181*59599516SKenneth E. Jansen
2182*59599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 24, 'in ')
2183*59599516SKenneth E. Jansenc
2184*59599516SKenneth E. Jansenc account for periodicity in filtered variables
2185*59599516SKenneth E. Jansenc
2186*59599516SKenneth E. Jansen      do j = 1,nshg
2187*59599516SKenneth E. Jansen        i = iper(j)
2188*59599516SKenneth E. Jansen        if (i .ne. j) then
2189*59599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
2190*59599516SKenneth E. Jansen        endif
2191*59599516SKenneth E. Jansen      enddo
2192*59599516SKenneth E. Jansen      do j = 1,nshg
2193*59599516SKenneth E. Jansen        i = iper(j)
2194*59599516SKenneth E. Jansen        if (i .ne. j) then
2195*59599516SKenneth E. Jansen           fres(j,:) = fres(i,:)
2196*59599516SKenneth E. Jansen        endif
2197*59599516SKenneth E. Jansen      enddo
2198*59599516SKenneth E. Jansen
2199*59599516SKenneth E. Jansen      if(numpe>1)   call commu (fres, ilwork, 24, 'out')
2200*59599516SKenneth E. Jansen
2201*59599516SKenneth E. Jansen      fres(:,23) = one / fres(:,23)
2202*59599516SKenneth E. Jansen      do j = 1,22
2203*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,23)
2204*59599516SKenneth E. Jansen      enddo
2205*59599516SKenneth E. Jansenc
2206*59599516SKenneth E. Jansenc.....at this point fres is really all of our filtered quantities
2207*59599516SKenneth E. Jansenc     at the nodes
2208*59599516SKenneth E. Jansenc
2209*59599516SKenneth E. Jansen
2210*59599516SKenneth E. Jansen      xlij(:,1) = fres(:,4) - fres(:,1)*fres(:,1)
2211*59599516SKenneth E. Jansen      xlij(:,2) = fres(:,5) - fres(:,2)*fres(:,2)
2212*59599516SKenneth E. Jansen      xlij(:,3) = fres(:,6) - fres(:,3)*fres(:,3)
2213*59599516SKenneth E. Jansen      xlij(:,4) = fres(:,7) - fres(:,1)*fres(:,2)
2214*59599516SKenneth E. Jansen      xlij(:,5) = fres(:,8) - fres(:,1)*fres(:,3)
2215*59599516SKenneth E. Jansen      xlij(:,6) = fres(:,9) - fres(:,2)*fres(:,3)
2216*59599516SKenneth E. Jansen
2217*59599516SKenneth E. Jansen      strnrm = sqrt(
2218*59599516SKenneth E. Jansen     &  two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2)
2219*59599516SKenneth E. Jansen     &  + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
2220*59599516SKenneth E. Jansen
2221*59599516SKenneth E. Jansen      xfac(:,1) = strnrm*strnrm*( fres(:,10)**2 + fres(:,11)**2 +
2222*59599516SKenneth E. Jansen     &     fres(:,12)**2
2223*59599516SKenneth E. Jansen     &     + two*( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
2224*59599516SKenneth E. Jansen
2225*59599516SKenneth E. Jansen      xfac(:,2) = strnrm*( xlij(:,1)*fres(:,10) + xlij(:,2)*fres(:,11)
2226*59599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,12) +
2227*59599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,13) + xlij(:,5)*fres(:,14) +
2228*59599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,15)) )
2229*59599516SKenneth E. Jansen
2230*59599516SKenneth E. Jansen      xfac(:,3) = strnrm*( fres(:,10)*fres(:,16) + fres(:,11)*fres(:,17)
2231*59599516SKenneth E. Jansen     &     + fres(:,12)*fres(:,18) +
2232*59599516SKenneth E. Jansen     &     two*(fres(:,13)*fres(:,19) + fres(:,14)*fres(:,20) +
2233*59599516SKenneth E. Jansen     &     fres(:,15)*fres(:,21)) )
2234*59599516SKenneth E. Jansen
2235*59599516SKenneth E. Jansen      xfac(:,4) = xlij(:,1)*fres(:,16) + xlij(:,2)*fres(:,17)
2236*59599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,18) +
2237*59599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,19) + xlij(:,5)*fres(:,20) +
2238*59599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,21))
2239*59599516SKenneth E. Jansen
2240*59599516SKenneth E. Jansen      xfac(:,5) = fres(:,16)*fres(:,16) + fres(:,17)*fres(:,17)
2241*59599516SKenneth E. Jansen     &     + fres(:,18)*fres(:,18) +
2242*59599516SKenneth E. Jansen     &     two*(fres(:,19)*fres(:,19) + fres(:,20)*fres(:,20) +
2243*59599516SKenneth E. Jansen     &     fres(:,21)*fres(:,21))
2244*59599516SKenneth E. Jansen
2245*59599516SKenneth E. Jansen
2246*59599516SKenneth E. Jansenc      xfac(:,1) = one ! Debugging
2247*59599516SKenneth E. Jansenc      xfac(:,2) = one
2248*59599516SKenneth E. Jansenc      xfac(:,3) = two
2249*59599516SKenneth E. Jansenc      xfac(:,4) = one
2250*59599516SKenneth E. Jansenc      xfac(:,5) = one
2251*59599516SKenneth E. Jansen
2252*59599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
2253*59599516SKenneth E. Jansen
2254*59599516SKenneth E. Jansen      do j = 1, nshg
2255*59599516SKenneth E. Jansen          i = iper(j)
2256*59599516SKenneth E. Jansen          if (i .ne. j) then
2257*59599516SKenneth E. Jansen            xfac(j,1) = zero
2258*59599516SKenneth E. Jansen            xfac(j,2) = zero
2259*59599516SKenneth E. Jansen            xfac(j,3) = zero
2260*59599516SKenneth E. Jansen            xfac(j,4) = zero
2261*59599516SKenneth E. Jansen            xfac(j,5) = zero
2262*59599516SKenneth E. Jansen          endif
2263*59599516SKenneth E. Jansen       enddo
2264*59599516SKenneth E. Jansen
2265*59599516SKenneth E. Jansen      if (numpe.gt.1) then
2266*59599516SKenneth E. Jansen
2267*59599516SKenneth E. Jansen         numtask = ilwork(1)
2268*59599516SKenneth E. Jansen         itkbeg = 1
2269*59599516SKenneth E. Jansen
2270*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
2271*59599516SKenneth E. Jansen         do itask = 1, numtask
2272*59599516SKenneth E. Jansen
2273*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
2274*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
2275*59599516SKenneth E. Jansen
2276*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
2277*59599516SKenneth E. Jansen               do is = 1,numseg
2278*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
2279*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
2280*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
2281*59599516SKenneth E. Jansen                  xfac(isgbeg:isgend,:) = zero
2282*59599516SKenneth E. Jansen               enddo
2283*59599516SKenneth E. Jansen            endif
2284*59599516SKenneth E. Jansen
2285*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
2286*59599516SKenneth E. Jansen
2287*59599516SKenneth E. Jansen         enddo
2288*59599516SKenneth E. Jansen
2289*59599516SKenneth E. Jansen      endif
2290*59599516SKenneth E. Jansen
2291*59599516SKenneth E. Jansenc... Debugging
2292*59599516SKenneth E. Jansen
2293*59599516SKenneth E. Jansen      xatm1 = sum(xfac(:,1))
2294*59599516SKenneth E. Jansen      xatm2 = sum(xfac(:,2))
2295*59599516SKenneth E. Jansen      xatm3 = sum(xfac(:,3))
2296*59599516SKenneth E. Jansen      xatm4 = sum(xfac(:,4))
2297*59599516SKenneth E. Jansen      xatm5 = sum(xfac(:,5))
2298*59599516SKenneth E. Jansen
2299*59599516SKenneth E. Jansen
2300*59599516SKenneth E. Jansenc
2301*59599516SKenneth E. Jansenc Description of arrays.   Each processor has an array of length equal
2302*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect
2303*59599516SKenneth E. Jansenc the numerator and one to collect the denominator.  There is also an array
2304*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each
2305*59599516SKenneth E. Jansenc on processor node, ifath(nnshg).  Finally, there is an arry of length
2306*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons
2307*59599516SKenneth E. Jansenc for each father.
2308*59599516SKenneth E. Jansenc
2309*59599516SKenneth E. Jansenc  Now loop over nodes and accumlate the numerator and the denominator
2310*59599516SKenneth E. Jansenc  to the father nodes.  Only on processor addition at this point.
2311*59599516SKenneth E. Jansenc  Note that serrogate fathers are collect some for the case where some
2312*59599516SKenneth E. Jansenc  sons are on another processor
2313*59599516SKenneth E. Jansenc
2314*59599516SKenneth E. Jansen      xnude = zero
2315*59599516SKenneth E. Jansen      do i = 1,nshg
2316*59599516SKenneth E. Jansen         xnude(ifath(i),1) = xnude(ifath(i),1) + xfac(i,1)
2317*59599516SKenneth E. Jansen         xnude(ifath(i),2) = xnude(ifath(i),2) + xfac(i,2)
2318*59599516SKenneth E. Jansen         xnude(ifath(i),3) = xnude(ifath(i),3) + xfac(i,3)
2319*59599516SKenneth E. Jansen         xnude(ifath(i),4) = xnude(ifath(i),4) + xfac(i,4)
2320*59599516SKenneth E. Jansen         xnude(ifath(i),5) = xnude(ifath(i),5) + xfac(i,5)
2321*59599516SKenneth E. Jansen      enddo
2322*59599516SKenneth E. Jansen
2323*59599516SKenneth E. Jansenc
2324*59599516SKenneth E. Jansenc Now  the true fathers and serrogates combine results and update
2325*59599516SKenneth E. Jansenc each other.
2326*59599516SKenneth E. Jansenc
2327*59599516SKenneth E. Jansen      if(numpe .gt. 1)then
2328*59599516SKenneth E. Jansen         call drvAllreduce(xnude, xnuder,5*nfath)
2329*59599516SKenneth E. Jansenc
2330*59599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
2331*59599516SKenneth E. Jansenc
2332*59599516SKenneth E. Jansenc  xnuder is the sum of the sons for each father on all processor combined
2333*59599516SKenneth E. Jansenc  (the same as if we had not partitioned the mesh for each processor)
2334*59599516SKenneth E. Jansenc
2335*59599516SKenneth E. Jansenc   For each father we have precomputed the number of sons (including
2336*59599516SKenneth E. Jansenc   the sons off processor).
2337*59599516SKenneth E. Jansenc
2338*59599516SKenneth E. Jansenc   Now divide by number of sons to get the average (not really necessary
2339*59599516SKenneth E. Jansenc   for dynamic model since ratio will cancel nsons at each father)
2340*59599516SKenneth E. Jansenc
2341*59599516SKenneth E. Jansenc         xnuder(:,1) = xnuder(:,1)  / nsons(:)
2342*59599516SKenneth E. Jansenc         xnuder(:,2) = xnuder(:,2)  / nsons(:)
2343*59599516SKenneth E. Jansenc         xnuder(:,3) = xnuder(:,3)  / nsons(:)
2344*59599516SKenneth E. Jansenc         xnuder(:,4) = xnuder(:,4)  / nsons(:)
2345*59599516SKenneth E. Jansenc         xnuder(:,5) = xnuder(:,5)  / nsons(:)
2346*59599516SKenneth E. Jansenc
2347*59599516SKenneth E. Jansenc  the next line are the  a, b, c coefficients in the quadratic eq.
2348*59599516SKenneth E. Jansenc
2349*59599516SKenneth E. Jansen
2350*59599516SKenneth E. Jansen         do i = 1,nfath
2351*59599516SKenneth E. Jansen            xa(i,1) = two*cdelsq1(i)*xnuder(i,1) +
2352*59599516SKenneth E. Jansen     &           xnuder(i,2)
2353*59599516SKenneth E. Jansen            xa(i,2) = four*cdelsq1(i)*xnuder(i,3) +
2354*59599516SKenneth E. Jansen     &           xnuder(i,4)
2355*59599516SKenneth E. Jansen            xa(i,3) = two*cdelsq1(i)*xnuder(i,5)
2356*59599516SKenneth E. Jansen
2357*59599516SKenneth E. Jansenc            xa(i,1) = xnuder(ifath(i),1) + ! Debugging
2358*59599516SKenneth E. Jansenc     &           xnuder(ifath(i),2)
2359*59599516SKenneth E. Jansenc            xa(i,2) = xnuder(ifath(i),3) +
2360*59599516SKenneth E. Jansenc     &           xnuder(ifath(i),4)
2361*59599516SKenneth E. Jansenc            xa(i,3) = xnuder(ifath(i),5)
2362*59599516SKenneth E. Jansen
2363*59599516SKenneth E. Jansen
2364*59599516SKenneth E. Jansen         enddo
2365*59599516SKenneth E. Jansen      else
2366*59599516SKenneth E. Jansen
2367*59599516SKenneth E. Jansenc         xnude(:,1) = xnude(:,1)  / nsons(:)
2368*59599516SKenneth E. Jansenc         xnude(:,2) = xnude(:,2)  / nsons(:)
2369*59599516SKenneth E. Jansenc         xnude(:,3) = xnude(:,3)  / nsons(:)
2370*59599516SKenneth E. Jansenc         xnude(:,4) = xnude(:,4)  / nsons(:)
2371*59599516SKenneth E. Jansenc         xnude(:,5) = xnude(:,5)  / nsons(:)
2372*59599516SKenneth E. Jansen
2373*59599516SKenneth E. Jansen         do i = 1,nfath
2374*59599516SKenneth E. Jansen            xa(i,1) = two*cdelsq1(i)*xnude(i,1) +
2375*59599516SKenneth E. Jansen     &           xnude(i,2)
2376*59599516SKenneth E. Jansen            xa(i,2) = four*cdelsq1(i)*xnude(i,3) +
2377*59599516SKenneth E. Jansen     &           xnude(i,4)
2378*59599516SKenneth E. Jansen            xa(i,3) = two*cdelsq1(i)*xnude(i,5)
2379*59599516SKenneth E. Jansen
2380*59599516SKenneth E. Jansenc            xa(i,1) = xnude(ifath(i),1) + ! Debugging
2381*59599516SKenneth E. Jansenc     &           xnude(ifath(i),2)
2382*59599516SKenneth E. Jansenc            xa(i,2) = xnude(ifath(i),3) +
2383*59599516SKenneth E. Jansenc     &           xnude(ifath(i),4)
2384*59599516SKenneth E. Jansenc            xa(i,3) = xnude(ifath(i),5)
2385*59599516SKenneth E. Jansen
2386*59599516SKenneth E. Jansen         enddo
2387*59599516SKenneth E. Jansen      endif
2388*59599516SKenneth E. Jansen
2389*59599516SKenneth E. Jansenc... Solve a*x*x - b*x + c
2390*59599516SKenneth E. Jansen
2391*59599516SKenneth E. Jansen
2392*59599516SKenneth E. Jansen      do i = 1, nfath
2393*59599516SKenneth E. Jansen
2394*59599516SKenneth E. Jansen      xdisc = xa(i,2)**2 - four*xa(i,1)*xa(i,3)
2395*59599516SKenneth E. Jansen
2396*59599516SKenneth E. Jansen      if (xdisc .lt. zero) then
2397*59599516SKenneth E. Jansen         write(*,*) '*********Warning on filter width ratio********'
2398*59599516SKenneth E. Jansen      xlamb1(i) = fwr1
2399*59599516SKenneth E. Jansen      xlamb2(i) = fwr1
2400*59599516SKenneth E. Jansen      if (xdisc .lt. -0.5d0) then
2401*59599516SKenneth E. Jansen         write(*,*) '*********Warning on filter width ratio********'
2402*59599516SKenneth E. Jansen      endif
2403*59599516SKenneth E. Jansen      endif
2404*59599516SKenneth E. Jansen
2405*59599516SKenneth E. Jansen      if (xdisc .eq. zero) then
2406*59599516SKenneth E. Jansen      xlamb1(i) = xa(i,2) / (two*xa(i,1))
2407*59599516SKenneth E. Jansen      xlamb2(i) = xa(i,2) / (two*xa(i,1))
2408*59599516SKenneth E. Jansen      endif
2409*59599516SKenneth E. Jansen
2410*59599516SKenneth E. Jansen      if (xdisc .gt. zero) then
2411*59599516SKenneth E. Jansen      xlamb1(i)= ( xa(i,2) + sqrt( xa(i,2)**2 - four*xa(i,1)*xa(i,3) ) )
2412*59599516SKenneth E. Jansen     &     / (two*xa(i,1))
2413*59599516SKenneth E. Jansen      xlamb2(i)= ( xa(i,2) - sqrt( xa(i,2)**2 - four*xa(i,1)*xa(i,3) ) )
2414*59599516SKenneth E. Jansen     &     / (two*xa(i,1))
2415*59599516SKenneth E. Jansen      endif
2416*59599516SKenneth E. Jansen
2417*59599516SKenneth E. Jansen      enddo
2418*59599516SKenneth E. Jansen
2419*59599516SKenneth E. Jansen      do i = 1, nshg
2420*59599516SKenneth E. Jansen         fwr2(i) = xlamb1(ifath(i))
2421*59599516SKenneth E. Jansen         fwr3(i) = xlamb2(ifath(i))
2422*59599516SKenneth E. Jansen      enddo
2423*59599516SKenneth E. Jansen
2424*59599516SKenneth E. Jansen      if (myrank .eq. master) then
2425*59599516SKenneth E. Jansen         do i = 1, nfath
2426*59599516SKenneth E. Jansen            write(23,*)i,xlamb1(i), xlamb2(i)
2427*59599516SKenneth E. Jansen         enddo
2428*59599516SKenneth E. Jansen      endif
2429*59599516SKenneth E. Jansen      call flush(23)
2430*59599516SKenneth E. Jansen
2431*59599516SKenneth E. Jansen
2432*59599516SKenneth E. Jansen
2433*59599516SKenneth E. Jansen      do i = 1, nfath
2434*59599516SKenneth E. Jansen         xkap(i) = cdelsq1(i) / xlamb2(i)
2435*59599516SKenneth E. Jansen         xa(i,1) = two*xkap(i)*xnuder(i,1)
2436*59599516SKenneth E. Jansen         xa(i,2) = four*xkap(i)*xnuder(i,3) - xnuder(i,2)
2437*59599516SKenneth E. Jansen         xa(i,3) = two*xkap(i)*xnuder(i,5) - xnuder(i,4)
2438*59599516SKenneth E. Jansen
2439*59599516SKenneth E. Jansen         xlamb1(i)= ( xa(i,2) + sqrt( xa(i,2)**2 - four*xa(i,1)*xa(i,3)
2440*59599516SKenneth E. Jansen     &        ) )/ (two*xa(i,1))
2441*59599516SKenneth E. Jansen         xlamb2(i)= ( xa(i,2) - sqrt( xa(i,2)**2 - four*xa(i,1)*xa(i,3)
2442*59599516SKenneth E. Jansen     &        ) )/ (two*xa(i,1))
2443*59599516SKenneth E. Jansen
2444*59599516SKenneth E. Jansen      enddo
2445*59599516SKenneth E. Jansen
2446*59599516SKenneth E. Jansen
2447*59599516SKenneth E. Jansen      if (myrank .eq. master) then
2448*59599516SKenneth E. Jansen         do i = 1, nfath
2449*59599516SKenneth E. Jansen            write(255,*)i, xlamb1(i), xlamb2(i)
2450*59599516SKenneth E. Jansen         enddo
2451*59599516SKenneth E. Jansen      endif
2452*59599516SKenneth E. Jansen      call flush(255)
2453*59599516SKenneth E. Jansen
2454*59599516SKenneth E. Jansen      fwr4(:) = xlamb1(ifath(:))
2455*59599516SKenneth E. Jansen
2456*59599516SKenneth E. Jansen      return
2457*59599516SKenneth E. Jansen      end
2458*59599516SKenneth E. Jansen      subroutine DFWRsfdmc (y,      shgl,      shp,
2459*59599516SKenneth E. Jansen     &                   iper,   ilwork,
2460*59599516SKenneth E. Jansen     &                   nsons,  ifath,     x, fwr2, fwr3)
2461*59599516SKenneth E. Jansen
2462*59599516SKenneth E. Jansen      use pointer_data
2463*59599516SKenneth E. Jansen
2464*59599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
2465*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
2466*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
2467*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
2468*59599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
2469*59599516SKenneth E. Jansenc                    quad. points.
2470*59599516SKenneth E. Jansen
2471*59599516SKenneth E. Jansen
2472*59599516SKenneth E. Jansen
2473*59599516SKenneth E. Jansen      include "common.h"
2474*59599516SKenneth E. Jansen      include "mpif.h"
2475*59599516SKenneth E. Jansen      include "auxmpi.h"
2476*59599516SKenneth E. Jansen
2477*59599516SKenneth E. Jansenc
2478*59599516SKenneth E. Jansen      dimension fres(nshg,24),         fwr(nshg),
2479*59599516SKenneth E. Jansen     &          strnrm(nshg),         cdelsq(nshg),
2480*59599516SKenneth E. Jansen     &          cdelsq2(nshg),
2481*59599516SKenneth E. Jansen     &          xnum(nshg),           xden(nshg),
2482*59599516SKenneth E. Jansen     &          xmij(nshg,6),         xlij(nshg,6),
2483*59599516SKenneth E. Jansen     &          xnude(nfath,2),        xnuder(nfath,2),
2484*59599516SKenneth E. Jansen     &          ynude(nfath,6),        ynuder(nfath,6),
2485*59599516SKenneth E. Jansen     &          ui(nfath,3),           snorm(nfath),
2486*59599516SKenneth E. Jansen     &          uir(nfath,3),          snormr(nfath),
2487*59599516SKenneth E. Jansen     &          xm(nfath,6),           xl(nfath,6)
2488*59599516SKenneth E. Jansen      dimension xl1(nfath,6),          xl2(nfath,6),
2489*59599516SKenneth E. Jansen     &          xl1r(nfath,6),         xl2r(nfath,6),
2490*59599516SKenneth E. Jansen     &          xmr(nfath,6),          xlr(nfath,6),
2491*59599516SKenneth E. Jansen     &          nsons(nshg),
2492*59599516SKenneth E. Jansen     &          strl(numel,ngauss),
2493*59599516SKenneth E. Jansen     &          y(nshg,5),            yold(nshg,5),
2494*59599516SKenneth E. Jansen     &          ifath(nshg),          iper(nshg),
2495*59599516SKenneth E. Jansen     &          ilwork(nlwork),!        xmudmi(numel,ngauss),
2496*59599516SKenneth E. Jansen     &          x(numnp,3)
2497*59599516SKenneth E. Jansen      dimension shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
2498*59599516SKenneth E. Jansen     &          xnutf(nfath),         xfac(nshg,5),
2499*59599516SKenneth E. Jansen     &          fwr2(nshg),           fwr3(nshg)
2500*59599516SKenneth E. Jansen
2501*59599516SKenneth E. Jansen      character*10 cname
2502*59599516SKenneth E. Jansen      character*30 fname1, fname2, fname3, fname4, fname5, fname6,
2503*59599516SKenneth E. Jansen     &             fname0
2504*59599516SKenneth E. Jansenc
2505*59599516SKenneth E. Jansenc
2506*59599516SKenneth E. Jansenc   setup the weights for time averaging of cdelsq (now in quadfilt module)
2507*59599516SKenneth E. Jansenc
2508*59599516SKenneth E. Jansen      denom=max(1.0d0*(lstep),one)
2509*59599516SKenneth E. Jansen      if(dtavei.lt.0) then
2510*59599516SKenneth E. Jansen         wcur=one/denom
2511*59599516SKenneth E. Jansen      else
2512*59599516SKenneth E. Jansen         wcur=dtavei
2513*59599516SKenneth E. Jansen      endif
2514*59599516SKenneth E. Jansen      whist=1.0-wcur
2515*59599516SKenneth E. Jansen
2516*59599516SKenneth E. Jansen      if (istep .eq. 0) then
2517*59599516SKenneth E. Jansen         xnd      = zero
2518*59599516SKenneth E. Jansen         xmodcomp = zero
2519*59599516SKenneth E. Jansen         xmcomp  = zero
2520*59599516SKenneth E. Jansen         xlcomp  = zero
2521*59599516SKenneth E. Jansen         xl1comp  = zero
2522*59599516SKenneth E. Jansen         xl2comp  = zero
2523*59599516SKenneth E. Jansen         ucomp    = zero
2524*59599516SKenneth E. Jansen         scomp    = zero
2525*59599516SKenneth E. Jansen      endif
2526*59599516SKenneth E. Jansen
2527*59599516SKenneth E. Jansen
2528*59599516SKenneth E. Jansen      fres = zero
2529*59599516SKenneth E. Jansen      yold(:,1)=y(:,4)
2530*59599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
2531*59599516SKenneth E. Jansenc
2532*59599516SKenneth E. Jansen
2533*59599516SKenneth E. Jansenc
2534*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
2535*59599516SKenneth E. Jansenc
2536*59599516SKenneth E. Jansenc      yold(:,5) = 1.0  ! Debugging
2537*59599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2)
2538*59599516SKenneth E. Jansenc      yold(:,2) = 2.0
2539*59599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
2540*59599516SKenneth E. Jansenc      yold(:,3) = 3.0
2541*59599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
2542*59599516SKenneth E. Jansenc      yold(:,4) = 4.0
2543*59599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
2544*59599516SKenneth E. Jansenc                               suitable for the
2545*59599516SKenneth E. Jansen
2546*59599516SKenneth E. Jansen
2547*59599516SKenneth E. Jansen
2548*59599516SKenneth E. Jansen      intrul=intg(1,itseq)
2549*59599516SKenneth E. Jansen      intind=intpt(intrul)
2550*59599516SKenneth E. Jansen
2551*59599516SKenneth E. Jansen      do iblk = 1,nelblk
2552*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
2553*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
2554*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
2555*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
2556*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
2557*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
2558*59599516SKenneth E. Jansen        inum  = iel + npro - 1
2559*59599516SKenneth E. Jansen
2560*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
2561*59599516SKenneth E. Jansen
2562*59599516SKenneth E. Jansen        call asithf (yold, x, strl(iel:inum,:), mien(iblk)%p, fres,
2563*59599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
2564*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
2565*59599516SKenneth E. Jansen
2566*59599516SKenneth E. Jansen      enddo
2567*59599516SKenneth E. Jansenc
2568*59599516SKenneth E. Jansen
2569*59599516SKenneth E. Jansen      if (ngaussf .ne. ngauss) then
2570*59599516SKenneth E. Jansen      do iblk = 1,nelblk
2571*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
2572*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
2573*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
2574*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
2575*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
2576*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
2577*59599516SKenneth E. Jansen        inum  = iel + npro - 1
2578*59599516SKenneth E. Jansen
2579*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
2580*59599516SKenneth E. Jansen
2581*59599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
2582*59599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
2583*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
2584*59599516SKenneth E. Jansen
2585*59599516SKenneth E. Jansen      enddo
2586*59599516SKenneth E. Jansen      endif
2587*59599516SKenneth E. Jansenc
2588*59599516SKenneth E. Jansenc
2589*59599516SKenneth E. JansenC must fix for abc and dynamic model
2590*59599516SKenneth E. Jansenc      if(iabc==1)   !are there any axisym bc's
2591*59599516SKenneth E. Jansenc     &      call rotabc(res, iBC, BC,nflow, 'in ')
2592*59599516SKenneth E. Jansenc
2593*59599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 24, 'in ')
2594*59599516SKenneth E. Jansenc
2595*59599516SKenneth E. Jansenc account for periodicity in filtered variables
2596*59599516SKenneth E. Jansenc
2597*59599516SKenneth E. Jansen      do j = 1,nshg
2598*59599516SKenneth E. Jansen        i = iper(j)
2599*59599516SKenneth E. Jansen        if (i .ne. j) then
2600*59599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
2601*59599516SKenneth E. Jansen        endif
2602*59599516SKenneth E. Jansen      enddo
2603*59599516SKenneth E. Jansen      do j = 1,nshg
2604*59599516SKenneth E. Jansen        i = iper(j)
2605*59599516SKenneth E. Jansen        if (i .ne. j) then
2606*59599516SKenneth E. Jansen           fres(j,:) = fres(i,:)
2607*59599516SKenneth E. Jansen        endif
2608*59599516SKenneth E. Jansen      enddo
2609*59599516SKenneth E. Jansen
2610*59599516SKenneth E. Jansen      if(numpe>1)   call commu (fres, ilwork, 24, 'out')
2611*59599516SKenneth E. Jansen
2612*59599516SKenneth E. Jansen      fres(:,23) = one / fres(:,23)
2613*59599516SKenneth E. Jansen      do j = 1,22
2614*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,23)
2615*59599516SKenneth E. Jansen      enddo
2616*59599516SKenneth E. Jansenc     fres(:,24) = fres(:,24) * fres(:,23)
2617*59599516SKenneth E. Jansenc
2618*59599516SKenneth E. Jansenc.....at this point fres is really all of our filtered quantities
2619*59599516SKenneth E. Jansenc     at the nodes
2620*59599516SKenneth E. Jansenc
2621*59599516SKenneth E. Jansen
2622*59599516SKenneth E. Jansen      strnrm = sqrt(
2623*59599516SKenneth E. Jansen     &  two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2)
2624*59599516SKenneth E. Jansen     &  + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
2625*59599516SKenneth E. Jansen
2626*59599516SKenneth E. Jansenc      fwr = fwr1 * fres(:,22) * strnrm
2627*59599516SKenneth E. Jansen      fwr = fwr3 * fres(:,22) * strnrm
2628*59599516SKenneth E. Jansen
2629*59599516SKenneth E. Jansen      xmij(:,1) = -fwr
2630*59599516SKenneth E. Jansen     &             * fres(:,10) + fres(:,16)
2631*59599516SKenneth E. Jansen      xmij(:,2) = -fwr
2632*59599516SKenneth E. Jansen     &             * fres(:,11) + fres(:,17)
2633*59599516SKenneth E. Jansen      xmij(:,3) = -fwr
2634*59599516SKenneth E. Jansen     &             * fres(:,12) + fres(:,18)
2635*59599516SKenneth E. Jansen
2636*59599516SKenneth E. Jansen      xmij(:,4) = -fwr * fres(:,13) + fres(:,19)
2637*59599516SKenneth E. Jansen      xmij(:,5) = -fwr * fres(:,14) + fres(:,20)
2638*59599516SKenneth E. Jansen      xmij(:,6) = -fwr * fres(:,15) + fres(:,21)
2639*59599516SKenneth E. Jansen
2640*59599516SKenneth E. Jansen      fres(:,22) = one / fres(:,22)
2641*59599516SKenneth E. Jansen
2642*59599516SKenneth E. Jansen      xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1) * fres(:,22)
2643*59599516SKenneth E. Jansen      xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2) * fres(:,22)
2644*59599516SKenneth E. Jansen      xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3) * fres(:,22)
2645*59599516SKenneth E. Jansen      xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2) * fres(:,22)
2646*59599516SKenneth E. Jansen      xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3) * fres(:,22)
2647*59599516SKenneth E. Jansen      xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3) * fres(:,22)
2648*59599516SKenneth E. Jansen
2649*59599516SKenneth E. Jansen      xnum =        xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2)
2650*59599516SKenneth E. Jansen     &                                    + xlij(:,3) * xmij(:,3)
2651*59599516SKenneth E. Jansen     &     + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5)
2652*59599516SKenneth E. Jansen     &                                    + xlij(:,6) * xmij(:,6))
2653*59599516SKenneth E. Jansen      xden =        xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2)
2654*59599516SKenneth E. Jansen     &                                    + xmij(:,3) * xmij(:,3)
2655*59599516SKenneth E. Jansen     &     + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5)
2656*59599516SKenneth E. Jansen     &                                    + xmij(:,6) * xmij(:,6))
2657*59599516SKenneth E. Jansen      xden = two * xden
2658*59599516SKenneth E. Jansen
2659*59599516SKenneth E. Jansenc... For collectection of statistics on dyn. model components
2660*59599516SKenneth E. Jansen
2661*59599516SKenneth E. Jansen      xfac(:,1) = strnrm*strnrm*( fres(:,10)**2 + fres(:,11)**2 +
2662*59599516SKenneth E. Jansen     &     fres(:,12)**2
2663*59599516SKenneth E. Jansen     &     + two*( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
2664*59599516SKenneth E. Jansen
2665*59599516SKenneth E. Jansen      xfac(:,2) = strnrm*( xlij(:,1)*fres(:,10) + xlij(:,2)*fres(:,11)
2666*59599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,12) +
2667*59599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,13) + xlij(:,5)*fres(:,14) +
2668*59599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,15)) )
2669*59599516SKenneth E. Jansen
2670*59599516SKenneth E. Jansen      xfac(:,3) = strnrm*( fres(:,10)*fres(:,16) + fres(:,11)*fres(:,17)
2671*59599516SKenneth E. Jansen     &     + fres(:,12)*fres(:,18) +
2672*59599516SKenneth E. Jansen     &     two*(fres(:,13)*fres(:,19) + fres(:,14)*fres(:,20) +
2673*59599516SKenneth E. Jansen     &     fres(:,15)*fres(:,21)) )
2674*59599516SKenneth E. Jansen
2675*59599516SKenneth E. Jansen      xfac(:,4) = xlij(:,1)*fres(:,16) + xlij(:,2)*fres(:,17)
2676*59599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,18) +
2677*59599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,19) + xlij(:,5)*fres(:,20) +
2678*59599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,21))
2679*59599516SKenneth E. Jansen
2680*59599516SKenneth E. Jansen      xfac(:,5) = fres(:,16)*fres(:,16) + fres(:,17)*fres(:,17)
2681*59599516SKenneth E. Jansen     &     + fres(:,18)*fres(:,18) +
2682*59599516SKenneth E. Jansen     &     two*(fres(:,19)*fres(:,19) + fres(:,20)*fres(:,20) +
2683*59599516SKenneth E. Jansen     &     fres(:,21)*fres(:,21))
2684*59599516SKenneth E. Jansen
2685*59599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
2686*59599516SKenneth E. Jansen        do j = 1,numnp
2687*59599516SKenneth E. Jansen          i = iper(j)
2688*59599516SKenneth E. Jansen          if (i .ne. j) then
2689*59599516SKenneth E. Jansen            xnum(j) = zero
2690*59599516SKenneth E. Jansen            xden(j) = zero
2691*59599516SKenneth E. Jansen            xfac(j,:) = zero
2692*59599516SKenneth E. Jansen            xmij(j,:) = zero
2693*59599516SKenneth E. Jansen            xlij(j,:) = zero
2694*59599516SKenneth E. Jansen            fres(j,:) = zero
2695*59599516SKenneth E. Jansen            strnrm(j) = zero
2696*59599516SKenneth E. Jansen          endif
2697*59599516SKenneth E. Jansen        enddo
2698*59599516SKenneth E. Jansen
2699*59599516SKenneth E. Jansen      if (numpe.gt.1) then
2700*59599516SKenneth E. Jansen
2701*59599516SKenneth E. Jansen         numtask = ilwork(1)
2702*59599516SKenneth E. Jansen         itkbeg = 1
2703*59599516SKenneth E. Jansen
2704*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
2705*59599516SKenneth E. Jansen         do itask = 1, numtask
2706*59599516SKenneth E. Jansen
2707*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
2708*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
2709*59599516SKenneth E. Jansen
2710*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
2711*59599516SKenneth E. Jansen               do is = 1,numseg
2712*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
2713*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
2714*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
2715*59599516SKenneth E. Jansen                  xnum(isgbeg:isgend) = zero
2716*59599516SKenneth E. Jansen                  xden(isgbeg:isgend) = zero
2717*59599516SKenneth E. Jansen                  strnrm(isgbeg:isgend) = zero
2718*59599516SKenneth E. Jansen                  xfac(isgbeg:isgend,:) = zero
2719*59599516SKenneth E. Jansen                  xmij(isgbeg:isgend,:) = zero
2720*59599516SKenneth E. Jansen                  xlij(isgbeg:isgend,:) = zero
2721*59599516SKenneth E. Jansen                  fres(isgbeg:isgend,:) = zero
2722*59599516SKenneth E. Jansen               enddo
2723*59599516SKenneth E. Jansen            endif
2724*59599516SKenneth E. Jansen
2725*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
2726*59599516SKenneth E. Jansen
2727*59599516SKenneth E. Jansen         enddo
2728*59599516SKenneth E. Jansen
2729*59599516SKenneth E. Jansen      endif
2730*59599516SKenneth E. Jansenc
2731*59599516SKenneth E. Jansenc Description of arrays.   Each processor has an array of length equal
2732*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect
2733*59599516SKenneth E. Jansenc the numerator and one to collect the denominator.  There is also an array
2734*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each
2735*59599516SKenneth E. Jansenc on processor node, ifath(nnshg).  Finally, there is an arry of length
2736*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons
2737*59599516SKenneth E. Jansenc for each father.
2738*59599516SKenneth E. Jansenc
2739*59599516SKenneth E. Jansenc  Now loop over nodes and accumlate the numerator and the denominator
2740*59599516SKenneth E. Jansenc  to the father nodes.  Only on processor addition at this point.
2741*59599516SKenneth E. Jansenc  Note that serrogate fathers are collect some for the case where some
2742*59599516SKenneth E. Jansenc  sons are on another processor
2743*59599516SKenneth E. Jansenc
2744*59599516SKenneth E. Jansen      xnude = zero
2745*59599516SKenneth E. Jansen      ynude = zero
2746*59599516SKenneth E. Jansen      xm    = zero
2747*59599516SKenneth E. Jansen      xl    = zero
2748*59599516SKenneth E. Jansen      xl1   = zero
2749*59599516SKenneth E. Jansen      xl2   = zero
2750*59599516SKenneth E. Jansen      ui    = zero
2751*59599516SKenneth E. Jansen      snorm = zero
2752*59599516SKenneth E. Jansen
2753*59599516SKenneth E. Jansen      do i = 1,nshg
2754*59599516SKenneth E. Jansen         xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i)
2755*59599516SKenneth E. Jansen         xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i)
2756*59599516SKenneth E. Jansen
2757*59599516SKenneth E. Jansen         ynude(ifath(i),1) = ynude(ifath(i),1) + xfac(i,1)
2758*59599516SKenneth E. Jansen         ynude(ifath(i),2) = ynude(ifath(i),2) + xfac(i,2)
2759*59599516SKenneth E. Jansen         ynude(ifath(i),3) = ynude(ifath(i),3) + xfac(i,3)
2760*59599516SKenneth E. Jansen         ynude(ifath(i),4) = ynude(ifath(i),4) + xfac(i,4)
2761*59599516SKenneth E. Jansen         ynude(ifath(i),5) = ynude(ifath(i),5) + xfac(i,5)
2762*59599516SKenneth E. Jansen
2763*59599516SKenneth E. Jansen         xm(ifath(i),1) = xm(ifath(i),1) + xmij(i,1)
2764*59599516SKenneth E. Jansen         xm(ifath(i),2) = xm(ifath(i),2) + xmij(i,2)
2765*59599516SKenneth E. Jansen         xm(ifath(i),3) = xm(ifath(i),3) + xmij(i,3)
2766*59599516SKenneth E. Jansen         xm(ifath(i),4) = xm(ifath(i),4) + xmij(i,4)
2767*59599516SKenneth E. Jansen         xm(ifath(i),5) = xm(ifath(i),5) + xmij(i,5)
2768*59599516SKenneth E. Jansen         xm(ifath(i),6) = xm(ifath(i),6) + xmij(i,6)
2769*59599516SKenneth E. Jansen
2770*59599516SKenneth E. Jansen         xl(ifath(i),1) = xl(ifath(i),1) + xlij(i,1)
2771*59599516SKenneth E. Jansen         xl(ifath(i),2) = xl(ifath(i),2) + xlij(i,2)
2772*59599516SKenneth E. Jansen         xl(ifath(i),3) = xl(ifath(i),3) + xlij(i,3)
2773*59599516SKenneth E. Jansen         xl(ifath(i),4) = xl(ifath(i),4) + xlij(i,4)
2774*59599516SKenneth E. Jansen         xl(ifath(i),5) = xl(ifath(i),5) + xlij(i,5)
2775*59599516SKenneth E. Jansen         xl(ifath(i),6) = xl(ifath(i),6) + xlij(i,6)
2776*59599516SKenneth E. Jansen
2777*59599516SKenneth E. Jansen         xl1(ifath(i),1) = xl1(ifath(i),1) + fres(i,4)
2778*59599516SKenneth E. Jansen         xl1(ifath(i),2) = xl1(ifath(i),2) + fres(i,5)
2779*59599516SKenneth E. Jansen         xl1(ifath(i),3) = xl1(ifath(i),3) + fres(i,6)
2780*59599516SKenneth E. Jansen         xl1(ifath(i),4) = xl1(ifath(i),4) + fres(i,7)
2781*59599516SKenneth E. Jansen         xl1(ifath(i),5) = xl1(ifath(i),5) + fres(i,8)
2782*59599516SKenneth E. Jansen         xl1(ifath(i),6) = xl1(ifath(i),6) + fres(i,9)
2783*59599516SKenneth E. Jansen
2784*59599516SKenneth E. Jansen         xl2(ifath(i),1) = xl2(ifath(i),1) + fres(i,1)*fres(i,1)
2785*59599516SKenneth E. Jansen         xl2(ifath(i),2) = xl2(ifath(i),2) + fres(i,2)*fres(i,2)
2786*59599516SKenneth E. Jansen         xl2(ifath(i),3) = xl2(ifath(i),3) + fres(i,3)*fres(i,3)
2787*59599516SKenneth E. Jansen         xl2(ifath(i),4) = xl2(ifath(i),4) + fres(i,1)*fres(i,2)
2788*59599516SKenneth E. Jansen         xl2(ifath(i),5) = xl2(ifath(i),5) + fres(i,1)*fres(i,3)
2789*59599516SKenneth E. Jansen         xl2(ifath(i),6) = xl2(ifath(i),6) + fres(i,2)*fres(i,3)
2790*59599516SKenneth E. Jansen
2791*59599516SKenneth E. Jansen         ui(ifath(i),1) = ui(ifath(i),1) + fres(i,1)
2792*59599516SKenneth E. Jansen         ui(ifath(i),2) = ui(ifath(i),2) + fres(i,2)
2793*59599516SKenneth E. Jansen         ui(ifath(i),3) = ui(ifath(i),3) + fres(i,3)
2794*59599516SKenneth E. Jansen
2795*59599516SKenneth E. Jansen         snorm(ifath(i)) = snorm(ifath(i)) + strnrm(i)
2796*59599516SKenneth E. Jansen
2797*59599516SKenneth E. Jansen      enddo
2798*59599516SKenneth E. Jansen
2799*59599516SKenneth E. Jansenc
2800*59599516SKenneth E. Jansenc Now  the true fathers and serrogates combine results and update
2801*59599516SKenneth E. Jansenc each other.
2802*59599516SKenneth E. Jansenc
2803*59599516SKenneth E. Jansen      if(numpe .gt. 1)then
2804*59599516SKenneth E. Jansen         call drvAllreduce(xnude, xnuder,2*nfath)
2805*59599516SKenneth E. Jansen         call drvAllreduce(ynude, ynuder,6*nfath)
2806*59599516SKenneth E. Jansen         call drvAllreduce(xm, xmr,6*nfath)
2807*59599516SKenneth E. Jansen         call drvAllreduce(xl, xlr,6*nfath)
2808*59599516SKenneth E. Jansen         call drvAllreduce(xl1, xl1r,6*nfath)
2809*59599516SKenneth E. Jansen         call drvAllreduce(xl2, xl2r,6*nfath)
2810*59599516SKenneth E. Jansen         call drvAllreduce(ui, uir,3*nfath)
2811*59599516SKenneth E. Jansen         call drvAllreduce(snorm, snormr,nfath)
2812*59599516SKenneth E. Jansen
2813*59599516SKenneth E. Jansen         do i = 1, nfath
2814*59599516SKenneth E. Jansen            ynuder(i,6) = ( ynuder(i,4) - fwr1*ynuder(i,2) ) /
2815*59599516SKenneth E. Jansen     &           ( two*ynuder(i,5) - four*fwr1*ynuder(i,3)
2816*59599516SKenneth E. Jansen     &           + two*fwr1*fwr1*ynuder(i,1) )
2817*59599516SKenneth E. Jansen         enddo
2818*59599516SKenneth E. Jansen
2819*59599516SKenneth E. Jansen         cdelsq2(:) = ynuder(ifath(:),6)  ! For comparison w/ cdelsq
2820*59599516SKenneth E. Jansenc
2821*59599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
2822*59599516SKenneth E. Jansenc
2823*59599516SKenneth E. Jansenc  xnuder is the sum of the sons for each father on all processor combined
2824*59599516SKenneth E. Jansenc  (the same as if we had not partitioned the mesh for each processor)
2825*59599516SKenneth E. Jansenc
2826*59599516SKenneth E. Jansenc   For each father we have precomputed the number of sons (including
2827*59599516SKenneth E. Jansenc   the sons off processor).
2828*59599516SKenneth E. Jansenc
2829*59599516SKenneth E. Jansenc   Now divide by number of sons to get the average (not really necessary
2830*59599516SKenneth E. Jansenc   for dynamic model since ratio will cancel nsons at each father)
2831*59599516SKenneth E. Jansenc
2832*59599516SKenneth E. Jansen         xnuder(:,1) = xnuder(:,1) / nsons(:)
2833*59599516SKenneth E. Jansen         xnuder(:,2) = xnuder(:,2) / nsons(:)
2834*59599516SKenneth E. Jansen
2835*59599516SKenneth E. Jansen         do m = 1, 5
2836*59599516SKenneth E. Jansen         ynuder(:,m) = ynuder(:,m)/nsons(:)
2837*59599516SKenneth E. Jansen         enddo
2838*59599516SKenneth E. Jansen         do m = 1,6
2839*59599516SKenneth E. Jansen         xmr(:,m) = xmr(:,m)/nsons(:)
2840*59599516SKenneth E. Jansen         xlr(:,m) = xlr(:,m)/nsons(:)
2841*59599516SKenneth E. Jansen         xl1r(:,m) = xl1r(:,m)/nsons(:)
2842*59599516SKenneth E. Jansen         xl2r(:,m) = xl2r(:,m)/nsons(:)
2843*59599516SKenneth E. Jansen         enddo
2844*59599516SKenneth E. Jansen
2845*59599516SKenneth E. Jansen         uir(:,1) = uir(:,1)/nsons(:)
2846*59599516SKenneth E. Jansen         uir(:,2) = uir(:,2)/nsons(:)
2847*59599516SKenneth E. Jansen         uir(:,3) = uir(:,3)/nsons(:)
2848*59599516SKenneth E. Jansen
2849*59599516SKenneth E. Jansen         snormr(:) = snormr(:)/nsons(:)
2850*59599516SKenneth E. Jansenc
2851*59599516SKenneth E. Jansencc  the next line is c \Delta^2
2852*59599516SKenneth E. Jansencc
2853*59599516SKenneth E. Jansencc         xnuder(:,1) = xnuder(:,1) / (xnuder(:,2) + 1.d-09)
2854*59599516SKenneth E. Jansencc         do i = 1,nshg
2855*59599516SKenneth E. Jansencc            cdelsq(i) = xnuder(ifath(i),1)
2856*59599516SKenneth E. Jansencc         enddo
2857*59599516SKenneth E. Jansen
2858*59599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnuder(ifath(:),1)
2859*59599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnuder(ifath(:),2)
2860*59599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
2861*59599516SKenneth E. Jansen
2862*59599516SKenneth E. Jansenc            cdelsq(:) = xnuder(ifath(:),1)/(xnuder(ifath(:),2)+1.d-09)
2863*59599516SKenneth E. Jansen
2864*59599516SKenneth E. Jansen            xnd(:,1) = xnd(:,1) + xnuder(:,1)
2865*59599516SKenneth E. Jansen            xnd(:,2) = xnd(:,2) + xnuder(:,2)
2866*59599516SKenneth E. Jansen
2867*59599516SKenneth E. Jansen            xmodcomp(:,1) = xmodcomp(:,1)+ynuder(:,1)
2868*59599516SKenneth E. Jansen            xmodcomp(:,2) = xmodcomp(:,2)+ynuder(:,2)
2869*59599516SKenneth E. Jansen            xmodcomp(:,3) = xmodcomp(:,3)+ynuder(:,3)
2870*59599516SKenneth E. Jansen            xmodcomp(:,4) = xmodcomp(:,4)+ynuder(:,4)
2871*59599516SKenneth E. Jansen            xmodcomp(:,5) = xmodcomp(:,5)+ynuder(:,5)
2872*59599516SKenneth E. Jansen
2873*59599516SKenneth E. Jansen            xmcomp(:,:) = xmcomp(:,:)+xmr(:,:)
2874*59599516SKenneth E. Jansen            xlcomp(:,:) = xlcomp(:,:)+xlr(:,:)
2875*59599516SKenneth E. Jansen
2876*59599516SKenneth E. Jansen            xl1comp(:,:) = xl1comp(:,:)+xl1r(:,:)
2877*59599516SKenneth E. Jansen            xl2comp(:,:) = xl2comp(:,:)+xl2r(:,:)
2878*59599516SKenneth E. Jansen
2879*59599516SKenneth E. Jansen            ucomp(:,:) = ucomp(:,:)+uir(:,:)
2880*59599516SKenneth E. Jansen            u1 = uir(32,1)
2881*59599516SKenneth E. Jansen            scomp(:)   = scomp(:)+snormr(:)
2882*59599516SKenneth E. Jansen
2883*59599516SKenneth E. Jansen      else
2884*59599516SKenneth E. Jansen
2885*59599516SKenneth E. Jansen         xnude(:,1) = xnude(:,1)/nsons(:)
2886*59599516SKenneth E. Jansen         xnude(:,2) = xnude(:,2)/nsons(:)
2887*59599516SKenneth E. Jansen
2888*59599516SKenneth E. Jansen         do m = 1, 5
2889*59599516SKenneth E. Jansen         ynude(:,m) = ynude(:,m)/nsons(:)
2890*59599516SKenneth E. Jansen         enddo
2891*59599516SKenneth E. Jansen         do m = 1,6
2892*59599516SKenneth E. Jansen         xm(:,m) = xm(:,m)/nsons(:)
2893*59599516SKenneth E. Jansen         xl(:,m) = xl(:,m)/nsons(:)
2894*59599516SKenneth E. Jansen         xl1(:,m) = xl1(:,m)/nsons(:)
2895*59599516SKenneth E. Jansen         xl2(:,m) = xl2(:,m)/nsons(:)
2896*59599516SKenneth E. Jansen         enddo
2897*59599516SKenneth E. Jansen
2898*59599516SKenneth E. Jansen         ui(:,1) = ui(:,1)/nsons(:)
2899*59599516SKenneth E. Jansen         ui(:,2) = ui(:,2)/nsons(:)
2900*59599516SKenneth E. Jansen         ui(:,3) = ui(:,3)/nsons(:)
2901*59599516SKenneth E. Jansen
2902*59599516SKenneth E. Jansen         snorm(:) = snorm(:)/nsons(:)
2903*59599516SKenneth E. Jansen
2904*59599516SKenneth E. Jansenc
2905*59599516SKenneth E. Jansenc     the next line is c \Delta^2, not nu_T but we want to save the
2906*59599516SKenneth E. Jansenc     memory
2907*59599516SKenneth E. Jansenc
2908*59599516SKenneth E. Jansen
2909*59599516SKenneth E. Jansencc         xnude(:,1) = xnude(:,1) / (xnude(:,2) + 1.d-09)
2910*59599516SKenneth E. Jansencc        do i = 1,nshg
2911*59599516SKenneth E. Jansencc            cdelsq(i) = xnude(ifath(i),1)
2912*59599516SKenneth E. Jansencc         enddo
2913*59599516SKenneth E. Jansencc      endif
2914*59599516SKenneth E. Jansen
2915*59599516SKenneth E. Jansen         do i = 1, nfath
2916*59599516SKenneth E. Jansen            ynude(i,6) = ( ynude(i,4) - fwr1*ynude(i,2) ) /
2917*59599516SKenneth E. Jansen     &           ( two*ynude(i,5) - four*fwr1*ynude(i,3)
2918*59599516SKenneth E. Jansen     &           + fwr1*fwr1*ynude(i,1) )
2919*59599516SKenneth E. Jansen         enddo
2920*59599516SKenneth E. Jansen
2921*59599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnude(ifath(:),1)
2922*59599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnude(ifath(:),2)
2923*59599516SKenneth E. Jansen
2924*59599516SKenneth E. Jansen            xnd(:,1) = xnd(:,1)+xnude(:,1)
2925*59599516SKenneth E. Jansen            xnd(:,2) = xnd(:,2)+xnude(:,2)
2926*59599516SKenneth E. Jansen
2927*59599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
2928*59599516SKenneth E. Jansen
2929*59599516SKenneth E. Jansenc            cdelsq(:) = xnude(ifath(:),1)/(xnude(ifath(:),2))!+1.d-09)
2930*59599516SKenneth E. Jansen
2931*59599516SKenneth E. Jansen
2932*59599516SKenneth E. Jansen          cdelsq2(:) = ynude(ifath(:),6)  ! For comparison w/ cdelsq
2933*59599516SKenneth E. Jansen
2934*59599516SKenneth E. Jansen            xmodcomp(:,1) = xmodcomp(:,1)+ynude(:,1)
2935*59599516SKenneth E. Jansen            xmodcomp(:,2) = xmodcomp(:,2)+ynude(:,2)
2936*59599516SKenneth E. Jansen            xmodcomp(:,3) = xmodcomp(:,3)+ynude(:,3)
2937*59599516SKenneth E. Jansen            xmodcomp(:,4) = xmodcomp(:,4)+ynude(:,4)
2938*59599516SKenneth E. Jansen            xmodcomp(:,5) = xmodcomp(:,5)+ynude(:,5)
2939*59599516SKenneth E. Jansen
2940*59599516SKenneth E. Jansen            xmcomp(:,:) = xmcomp(:,:)+xm(:,:)
2941*59599516SKenneth E. Jansen            xlcomp(:,:) = xlcomp(:,:)+xl(:,:)
2942*59599516SKenneth E. Jansen
2943*59599516SKenneth E. Jansen            xl1comp(:,:) = xl1comp(:,:)+xl1(:,:)
2944*59599516SKenneth E. Jansen            xl2comp(:,:) = xl2comp(:,:)+xl2(:,:)
2945*59599516SKenneth E. Jansen
2946*59599516SKenneth E. Jansen            ucomp(:,:) = ucomp(:,:)+ui(:,:)
2947*59599516SKenneth E. Jansen            scomp(:)   = scomp(:)+snorm(:)
2948*59599516SKenneth E. Jansen
2949*59599516SKenneth E. Jansen         endif
2950*59599516SKenneth E. Jansen
2951*59599516SKenneth E. Jansenc         do i = 1, nfath
2952*59599516SKenneth E. Jansenc            xmodcomp(i,:) = xmodcomp(i,:)/nsons(i)
2953*59599516SKenneth E. Jansenc            xmcomp(i,:) = xmcomp(i,:)/nsons(i)
2954*59599516SKenneth E. Jansenc            xlcomp(i,:) = xlcomp(i,:)/nsons(i)
2955*59599516SKenneth E. Jansenc            xl2comp(i,:) = xl2comp(i,:)/nsons(i)
2956*59599516SKenneth E. Jansenc            xl1comp(i,:) = xl1comp(i,:)/nsons(i)
2957*59599516SKenneth E. Jansenc            xnd(i,:) = xnd(i,:)/nsons(i)
2958*59599516SKenneth E. Jansenc            scomp(i) = scomp(i)/nsons(i)
2959*59599516SKenneth E. Jansenc            ucomp(i,:) = ucomp(i,:)/nsons(i)
2960*59599516SKenneth E. Jansenc         enddo
2961*59599516SKenneth E. Jansen
2962*59599516SKenneth E. Jansen         if (myrank .eq. master) then
2963*59599516SKenneth E. Jansen            write(*,*)'istep, nstep=', istep, nstep(1)
2964*59599516SKenneth E. Jansen         endif
2965*59599516SKenneth E. Jansen
2966*59599516SKenneth E. Jansen         if ( istep .eq. (nstep(1)-1) ) then
2967*59599516SKenneth E. Jansen         if ( myrank .eq. master) then
2968*59599516SKenneth E. Jansen
2969*59599516SKenneth E. Jansen            do i = 1, nfath
2970*59599516SKenneth E. Jansen            write(365,*)xmodcomp(i,1),xmodcomp(i,2),xmodcomp(i,3),
2971*59599516SKenneth E. Jansen     &              xmodcomp(i,4),xmodcomp(i,5)
2972*59599516SKenneth E. Jansen
2973*59599516SKenneth E. Jansen            write(366,*)xmcomp(i,1),xmcomp(i,2),xmcomp(i,3)
2974*59599516SKenneth E. Jansen            write(367,*)xmcomp(i,4),xmcomp(i,5),xmcomp(i,6)
2975*59599516SKenneth E. Jansen
2976*59599516SKenneth E. Jansen            write(368,*)xlcomp(i,1),xlcomp(i,2),xlcomp(i,3)
2977*59599516SKenneth E. Jansen            write(369,*)xlcomp(i,4),xlcomp(i,5),xlcomp(i,6)
2978*59599516SKenneth E. Jansen
2979*59599516SKenneth E. Jansen            write(370,*)xl1comp(i,1),xl1comp(i,2),xl1comp(i,3)
2980*59599516SKenneth E. Jansen            write(371,*)xl1comp(i,4),xl1comp(i,5),xl1comp(i,6)
2981*59599516SKenneth E. Jansen
2982*59599516SKenneth E. Jansen            write(372,*)xl2comp(i,1),xl2comp(i,2),xl2comp(i,3)
2983*59599516SKenneth E. Jansen            write(373,*)xl2comp(i,4),xl2comp(i,5),xl2comp(i,6)
2984*59599516SKenneth E. Jansen
2985*59599516SKenneth E. Jansen            write(374,*)xnd(i,1),xnd(i,2),scomp(i)
2986*59599516SKenneth E. Jansen            write(375,*)ucomp(i,1),ucomp(i,2),ucomp(i,3)
2987*59599516SKenneth E. Jansen            enddo
2988*59599516SKenneth E. Jansen
2989*59599516SKenneth E. Jansen            call flush(365)
2990*59599516SKenneth E. Jansen            call flush(366)
2991*59599516SKenneth E. Jansen            call flush(367)
2992*59599516SKenneth E. Jansen            call flush(368)
2993*59599516SKenneth E. Jansen            call flush(369)
2994*59599516SKenneth E. Jansen            call flush(370)
2995*59599516SKenneth E. Jansen            call flush(371)
2996*59599516SKenneth E. Jansen            call flush(372)
2997*59599516SKenneth E. Jansen            call flush(373)
2998*59599516SKenneth E. Jansen            call flush(374)
2999*59599516SKenneth E. Jansen            call flush(375)
3000*59599516SKenneth E. Jansen
3001*59599516SKenneth E. Jansenc            close(852)
3002*59599516SKenneth E. Jansenc            close(853)
3003*59599516SKenneth E. Jansenc            close(854)
3004*59599516SKenneth E. Jansen
3005*59599516SKenneth E. Jansen         endif
3006*59599516SKenneth E. Jansen         endif
3007*59599516SKenneth E. Jansen
3008*59599516SKenneth E. Jansen            if (myrank .eq. master) then
3009*59599516SKenneth E. Jansen               write(*,*)'uit uic=', ucomp(32,1),u1
3010*59599516SKenneth E. Jansen            endif
3011*59599516SKenneth E. Jansen
3012*59599516SKenneth E. Jansen 555     format(e14.7,4(2x,e14.7))
3013*59599516SKenneth E. Jansen 556     format(e14.7,5(2x,e14.7))
3014*59599516SKenneth E. Jansen
3015*59599516SKenneth E. Jansen
3016*59599516SKenneth E. Jansen
3017*59599516SKenneth E. Jansen
3018*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
3019*59599516SKenneth E. Jansen      tmp1 =  MINVAL(cdelsq)
3020*59599516SKenneth E. Jansen      tmp2 =  MAXVAL(cdelsq)
3021*59599516SKenneth E. Jansen      if(numpe>1) then
3022*59599516SKenneth E. Jansen         call MPI_REDUCE (tmp1, tmp3, 1,MPI_DOUBLE_PRECISION,
3023*59599516SKenneth E. Jansen     &        MPI_MIN, master, MPI_COMM_WORLD, ierr)
3024*59599516SKenneth E. Jansen         call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
3025*59599516SKenneth E. Jansen     &        MPI_MAX, master, MPI_COMM_WORLD, ierr)
3026*59599516SKenneth E. Jansen         tmp1=tmp3
3027*59599516SKenneth E. Jansen         tmp2=tmp4
3028*59599516SKenneth E. Jansen      endif
3029*59599516SKenneth E. Jansen      if (myrank .EQ. master) then !print CDelta^2 range
3030*59599516SKenneth E. Jansen         write(34,*)lstep,tmp1,tmp2
3031*59599516SKenneth E. Jansen         call flush(34)
3032*59599516SKenneth E. Jansen      endif
3033*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
3034*59599516SKenneth E. Jansen
3035*59599516SKenneth E. Jansen      if (myrank .eq. master) then
3036*59599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq(1),cdelsq(2)
3037*59599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq2(1),cdelsq2(2)
3038*59599516SKenneth E. Jansen         write(22,*) lstep, cdelsq(1)
3039*59599516SKenneth E. Jansen         call flush(22)
3040*59599516SKenneth E. Jansen      endif
3041*59599516SKenneth E. Jansen
3042*59599516SKenneth E. Jansen      do iblk = 1,nelblk
3043*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
3044*59599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
3045*59599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
3046*59599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
3047*59599516SKenneth E. Jansen         inum  = iel + npro - 1
3048*59599516SKenneth E. Jansen
3049*59599516SKenneth E. Jansen         ngauss = nint(lcsyst)
3050*59599516SKenneth E. Jansen
3051*59599516SKenneth E. Jansen         call scatnu (mien(iblk)%p, strl(iel:inum,:),
3052*59599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:))
3053*59599516SKenneth E. Jansen      enddo
3054*59599516SKenneth E. Jansenc     $$$$$$$$$$$$$$$$$$$$$$$$$$$
3055*59599516SKenneth E. Jansenc$$$  tmp1 =  MINVAL(xmudmi)
3056*59599516SKenneth E. Jansenc$$$  tmp2 =  MAXVAL(xmudmi)
3057*59599516SKenneth E. Jansenc$$$  if(numpe>1) then
3058*59599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION,
3059*59599516SKenneth E. Jansenc$$$  &                 MPI_MIN, master, MPI_COMM_WORLD, ierr)
3060*59599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
3061*59599516SKenneth E. Jansenc$$$  &                 MPI_MAX, master, MPI_COMM_WORLD, ierr)
3062*59599516SKenneth E. Jansenc$$$      tmp1=tmp3
3063*59599516SKenneth E. Jansenc$$$  tmp2=tmp4
3064*59599516SKenneth E. Jansenc$$$  endif
3065*59599516SKenneth E. Jansenc$$$  if (myrank .EQ. master) then
3066*59599516SKenneth E. Jansenc$$$  write(35,*) lstep,tmp1,tmp2
3067*59599516SKenneth E. Jansenc$$$  call flush(35)
3068*59599516SKenneth E. Jansenc$$$  endif
3069*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
3070*59599516SKenneth E. Jansen
3071*59599516SKenneth E. Jansenc
3072*59599516SKenneth E. Jansenc  if flag set, write a restart file with info (reuse xmij's memory)
3073*59599516SKenneth E. Jansenc
3074*59599516SKenneth E. Jansen      if(irs.eq.11) then
3075*59599516SKenneth E. Jansen         lstep=999
3076*59599516SKenneth E. Jansen         xmij(:,1)=xnum(:)
3077*59599516SKenneth E. Jansen         xmij(:,2)=xden(:)
3078*59599516SKenneth E. Jansen         xmij(:,3)=cdelsq(:)
3079*59599516SKenneth E. Jansen         xmij(:,5)=xlij(:,4)    !leave M_{12} in 4 and put L_{12} here
3080*59599516SKenneth E. Jansen         call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac
3081*59599516SKenneth E. Jansen         stop
3082*59599516SKenneth E. Jansen      endif
3083*59599516SKenneth E. Jansenc
3084*59599516SKenneth E. Jansenc  local clipping moved to scatnu with the creation of mxmudmi pointers
3085*59599516SKenneth E. Jansenc
3086*59599516SKenneth E. Jansenc$$$      rmu=datmat(1,2,1)
3087*59599516SKenneth E. Jansenc$$$      xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu
3088*59599516SKenneth E. Jansenc$$$      xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0
3089*59599516SKenneth E. Jansenc      stop !uncomment to test dmod
3090*59599516SKenneth E. Jansenc
3091*59599516SKenneth E. Jansen
3092*59599516SKenneth E. Jansen
3093*59599516SKenneth E. Jansenc  write out the nodal values of xnut (estimate since we don't calc strain
3094*59599516SKenneth E. Jansenc  there and must use the filtered strain).
3095*59599516SKenneth E. Jansenc
3096*59599516SKenneth E. Jansen
3097*59599516SKenneth E. Jansen      if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
3098*59599516SKenneth E. Jansenc
3099*59599516SKenneth E. Jansenc  collect the average strain into xnude(2)
3100*59599516SKenneth E. Jansenc
3101*59599516SKenneth E. Jansen         xnude(:,2) = zero
3102*59599516SKenneth E. Jansen         do i = 1,numnp
3103*59599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + strnrm(i)
3104*59599516SKenneth E. Jansen         enddo
3105*59599516SKenneth E. Jansen
3106*59599516SKenneth E. Jansen         if(numpe .gt. 1) then
3107*59599516SKenneth E. Jansen             call drvAllreduce(xnude(:,2), xnuder(:,2),nfath)
3108*59599516SKenneth E. Jansen          else
3109*59599516SKenneth E. Jansen             xnuder=xnude
3110*59599516SKenneth E. Jansen          endif
3111*59599516SKenneth E. Jansenc
3112*59599516SKenneth E. Jansenc          nut= cdelsq    * |S|
3113*59599516SKenneth E. Jansenc
3114*59599516SKenneth E. Jansen         xnutf=xnuder(:,1)*xnuder(:,2)/nsons(:)
3115*59599516SKenneth E. Jansenc
3116*59599516SKenneth E. Jansenc  collect the x and y coords into xnude
3117*59599516SKenneth E. Jansenc
3118*59599516SKenneth E. Jansen         xnude = zero
3119*59599516SKenneth E. Jansen         do i = 1,numnp
3120*59599516SKenneth E. Jansen            xnude(ifath(i),1) = xnude(ifath(i),1) + x(i,1)
3121*59599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + x(i,2)
3122*59599516SKenneth E. Jansen         enddo
3123*59599516SKenneth E. Jansen
3124*59599516SKenneth E. Jansen         if(numpe .gt. 1)
3125*59599516SKenneth E. Jansen     &        call drvAllreduce(xnude, xnuder,2*nfath)
3126*59599516SKenneth E. Jansen         xnuder(:,1)=xnuder(:,1)/nsons(:)
3127*59599516SKenneth E. Jansen         xnuder(:,2)=xnuder(:,2)/nsons(:)
3128*59599516SKenneth E. Jansenc
3129*59599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
3130*59599516SKenneth E. Jansenc
3131*59599516SKenneth E. Jansen         if((myrank.eq.master)) then
3132*59599516SKenneth E. Jansen            do i=1,nfath      ! cdelsq   * |S|
3133*59599516SKenneth E. Jansen               write(444,*) xnuder(i,1),xnuder(i,2),xnutf(i)
3134*59599516SKenneth E. Jansen            enddo
3135*59599516SKenneth E. Jansen            call flush(444)
3136*59599516SKenneth E. Jansen         endif
3137*59599516SKenneth E. Jansen      endif
3138*59599516SKenneth E. Jansen
3139*59599516SKenneth E. Jansen      return
3140*59599516SKenneth E. Jansen      end
3141*59599516SKenneth E. Jansen      subroutine DFWRwfdmc (y,      shgl,      shp,
3142*59599516SKenneth E. Jansen     &                   iper,   ilwork,
3143*59599516SKenneth E. Jansen     &                   nsons,  ifath,     x,    fwr2, fwr3)
3144*59599516SKenneth E. Jansen
3145*59599516SKenneth E. Jansen      use pointer_data
3146*59599516SKenneth E. Jansen
3147*59599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
3148*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
3149*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
3150*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
3151*59599516SKenneth E. Jansenc                    for computing the dmod. Qwtf contains the weights of the
3152*59599516SKenneth E. Jansenc                    quad. points.
3153*59599516SKenneth E. Jansen
3154*59599516SKenneth E. Jansen      include "common.h"
3155*59599516SKenneth E. Jansen      include "mpif.h"
3156*59599516SKenneth E. Jansen      include "auxmpi.h"
3157*59599516SKenneth E. Jansen
3158*59599516SKenneth E. Jansenc
3159*59599516SKenneth E. Jansen      dimension fres(nshg,33),         fwr(nshg),
3160*59599516SKenneth E. Jansen     &          strnrm(nshg),         cdelsq(nshg),
3161*59599516SKenneth E. Jansen     &          cdelsq2(nshg),
3162*59599516SKenneth E. Jansen     &          xnum(nshg),           xden(nshg),
3163*59599516SKenneth E. Jansen     &          xmij(nshg,6),         xlij(nshg,6),
3164*59599516SKenneth E. Jansen     &          xnude(nfath,2),        xnuder(nfath,2),
3165*59599516SKenneth E. Jansen     &          ynude(nfath,6),        ynuder(nfath,6),
3166*59599516SKenneth E. Jansen     &          ui(nfath,3),           snorm(nfath),
3167*59599516SKenneth E. Jansen     &          uir(nfath,3),          snormr(nfath)
3168*59599516SKenneth E. Jansen      dimension xm(nfath,6),           xl(nfath,6),
3169*59599516SKenneth E. Jansen     &          xl1(nfath,6),          xl2(nfath,6),
3170*59599516SKenneth E. Jansen     &          xl1r(nfath,6),         xl2r(nfath,6),
3171*59599516SKenneth E. Jansen     &          xmr(nfath,6),          xlr(nfath,6),
3172*59599516SKenneth E. Jansen     &          nsons(nshg),
3173*59599516SKenneth E. Jansen     &          strl(numel,ngauss),
3174*59599516SKenneth E. Jansen     &          y(nshg,5),            yold(nshg,5),
3175*59599516SKenneth E. Jansen     &          ifath(nshg),          iper(nshg),
3176*59599516SKenneth E. Jansen     &          ilwork(nlwork),
3177*59599516SKenneth E. Jansen     &          x(numnp,3),
3178*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
3179*59599516SKenneth E. Jansen     &          xnutf(nfath),
3180*59599516SKenneth E. Jansen     &          hfres(nshg,22),
3181*59599516SKenneth E. Jansen     &          xfac(nshg,5),         fwr2(nshg),
3182*59599516SKenneth E. Jansen     &          fwr3(nshg)
3183*59599516SKenneth E. Jansen
3184*59599516SKenneth E. Jansen      real*8 u1
3185*59599516SKenneth E. Jansen
3186*59599516SKenneth E. Jansen      character*10 cname
3187*59599516SKenneth E. Jansen      character*30 fname1, fname2, fname3, fname4, fname5, fname6
3188*59599516SKenneth E. Jansenc
3189*59599516SKenneth E. Jansen
3190*59599516SKenneth E. Jansenc
3191*59599516SKenneth E. Jansenc
3192*59599516SKenneth E. Jansenc   setup the weights for time averaging of cdelsq (now in quadfilt module)
3193*59599516SKenneth E. Jansenc
3194*59599516SKenneth E. Jansen
3195*59599516SKenneth E. Jansen      denom=max(1.0d0*(lstep),one)
3196*59599516SKenneth E. Jansen      if(dtavei.lt.0) then
3197*59599516SKenneth E. Jansen         wcur=one/denom
3198*59599516SKenneth E. Jansen      else
3199*59599516SKenneth E. Jansen         wcur=dtavei
3200*59599516SKenneth E. Jansen      endif
3201*59599516SKenneth E. Jansen      whist=1.0-wcur
3202*59599516SKenneth E. Jansen
3203*59599516SKenneth E. Jansen      if (myrank .eq. master) then
3204*59599516SKenneth E. Jansen         write(*,*)'istep=', istep
3205*59599516SKenneth E. Jansen      endif
3206*59599516SKenneth E. Jansen
3207*59599516SKenneth E. Jansen      if (istep .eq. 0) then
3208*59599516SKenneth E. Jansen         xnd      = zero
3209*59599516SKenneth E. Jansen         xmodcomp = zero
3210*59599516SKenneth E. Jansen         xmcomp  = zero
3211*59599516SKenneth E. Jansen         xlcomp  = zero
3212*59599516SKenneth E. Jansen         xl1comp  = zero
3213*59599516SKenneth E. Jansen         xl2comp  = zero
3214*59599516SKenneth E. Jansen         ucomp    = zero
3215*59599516SKenneth E. Jansen         scomp    = zero
3216*59599516SKenneth E. Jansen      endif
3217*59599516SKenneth E. Jansen
3218*59599516SKenneth E. Jansen
3219*59599516SKenneth E. Jansen      fres = zero
3220*59599516SKenneth E. Jansen      hfres = zero
3221*59599516SKenneth E. Jansen
3222*59599516SKenneth E. Jansen      yold(:,1)=y(:,4)
3223*59599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
3224*59599516SKenneth E. Jansen
3225*59599516SKenneth E. Jansenc
3226*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
3227*59599516SKenneth E. Jansenc
3228*59599516SKenneth E. Jansenc      yold(:,5) = 1.0  ! Debugging
3229*59599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2)
3230*59599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
3231*59599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
3232*59599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
3233*59599516SKenneth E. Jansenc                               suitable for the
3234*59599516SKenneth E. Jansen
3235*59599516SKenneth E. Jansen      do iblk = 1,nelblk
3236*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
3237*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
3238*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
3239*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
3240*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
3241*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
3242*59599516SKenneth E. Jansen        inum  = iel + npro - 1
3243*59599516SKenneth E. Jansen
3244*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
3245*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
3246*59599516SKenneth E. Jansen
3247*59599516SKenneth E. Jansenc        call hfilterBB (yold, x, mien(iblk)%p, hfres,
3248*59599516SKenneth E. Jansenc     &               shglf(lcsyst,:,1:nshl,:),
3249*59599516SKenneth E. Jansenc     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
3250*59599516SKenneth E. Jansen
3251*59599516SKenneth E. Jansen        call hfilterCC (yold, x, mien(iblk)%p, hfres,
3252*59599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
3253*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
3254*59599516SKenneth E. Jansen
3255*59599516SKenneth E. Jansen      enddo
3256*59599516SKenneth E. Jansen
3257*59599516SKenneth E. Jansen      if(numpe>1) call commu (hfres, ilwork, 22, 'in ')
3258*59599516SKenneth E. Jansenc
3259*59599516SKenneth E. Jansenc... account for periodicity in filtered variables
3260*59599516SKenneth E. Jansenc
3261*59599516SKenneth E. Jansen      do j = 1,nshg  !    Add on-processor slave contribution to masters
3262*59599516SKenneth E. Jansen        i = iper(j)
3263*59599516SKenneth E. Jansen        if (i .ne. j) then
3264*59599516SKenneth E. Jansen           hfres(i,:) = hfres(i,:) + hfres(j,:)
3265*59599516SKenneth E. Jansen        endif
3266*59599516SKenneth E. Jansen      enddo
3267*59599516SKenneth E. Jansen      do j = 1,nshg ! Set on-processor slaves to be the same as masters
3268*59599516SKenneth E. Jansen        i = iper(j)
3269*59599516SKenneth E. Jansen        if (i .ne. j) then
3270*59599516SKenneth E. Jansen           hfres(j,:) = hfres(i,:)
3271*59599516SKenneth E. Jansen        endif
3272*59599516SKenneth E. Jansen      enddo
3273*59599516SKenneth E. Jansen
3274*59599516SKenneth E. Jansenc... Set off-processor slaves to be the same as their masters
3275*59599516SKenneth E. Jansen
3276*59599516SKenneth E. Jansen      if(numpe>1)   call commu (hfres, ilwork, 22, 'out')
3277*59599516SKenneth E. Jansen
3278*59599516SKenneth E. Jansen
3279*59599516SKenneth E. Jansen      hfres(:,16) = one / hfres(:,16) ! one/(volume filter kernel)
3280*59599516SKenneth E. Jansen
3281*59599516SKenneth E. Jansen      do j = 1, 15
3282*59599516SKenneth E. Jansen	hfres(:,j) = hfres(:,j) * hfres(:,16)
3283*59599516SKenneth E. Jansen      enddo
3284*59599516SKenneth E. Jansen      do j = 17, 22
3285*59599516SKenneth E. Jansen	hfres(:,j) = hfres(:,j) * hfres(:,16)
3286*59599516SKenneth E. Jansen      enddo
3287*59599516SKenneth E. Jansen
3288*59599516SKenneth E. Jansenc... For debugging
3289*59599516SKenneth E. Jansen
3290*59599516SKenneth E. Jansenc      hfres(:,1) = 2.0*x(:,1) - 3.0*x(:,2)
3291*59599516SKenneth E. Jansenc      hfres(:,2) = 3.0*x(:,1) + 4.0*x(:,2)
3292*59599516SKenneth E. Jansenc      hfres(:,3) = 4.0*x(:,1) + x(:,2) + x(:,3)
3293*59599516SKenneth E. Jansen
3294*59599516SKenneth E. Jansenc... Done w/ h-filtering. Begin 2h-filtering.
3295*59599516SKenneth E. Jansen
3296*59599516SKenneth E. Jansen      do iblk = 1,nelblk
3297*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
3298*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
3299*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
3300*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
3301*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
3302*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
3303*59599516SKenneth E. Jansen        inum  = iel + npro - 1
3304*59599516SKenneth E. Jansen
3305*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
3306*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
3307*59599516SKenneth E. Jansen
3308*59599516SKenneth E. Jansen        call twohfilterBB (yold, x, strl(iel:inum,:), mien(iblk)%p,
3309*59599516SKenneth E. Jansen     &               fres, hfres, shglf(lcsyst,:,1:nshl,:),
3310*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
3311*59599516SKenneth E. Jansen
3312*59599516SKenneth E. Jansen      enddo
3313*59599516SKenneth E. Jansenc
3314*59599516SKenneth E. Jansen
3315*59599516SKenneth E. Jansen
3316*59599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 33, 'in ')
3317*59599516SKenneth E. Jansenc
3318*59599516SKenneth E. Jansenc account for periodicity in filtered variables
3319*59599516SKenneth E. Jansenc
3320*59599516SKenneth E. Jansen      do j = 1,nshg
3321*59599516SKenneth E. Jansen        i = iper(j)
3322*59599516SKenneth E. Jansen        if (i .ne. j) then
3323*59599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
3324*59599516SKenneth E. Jansen        endif
3325*59599516SKenneth E. Jansen      enddo
3326*59599516SKenneth E. Jansen
3327*59599516SKenneth E. Jansen      do j = 1,nshg
3328*59599516SKenneth E. Jansen        i = iper(j)
3329*59599516SKenneth E. Jansen        if (i .ne. j) then
3330*59599516SKenneth E. Jansen           fres(j,:) = fres(i,:)
3331*59599516SKenneth E. Jansen        endif
3332*59599516SKenneth E. Jansen      enddo
3333*59599516SKenneth E. Jansen
3334*59599516SKenneth E. Jansen      if(numpe>1)then
3335*59599516SKenneth E. Jansen         call commu (fres, ilwork, 33, 'out')
3336*59599516SKenneth E. Jansen      endif
3337*59599516SKenneth E. Jansen
3338*59599516SKenneth E. Jansen      fres(:,22) = one / fres(:,22)
3339*59599516SKenneth E. Jansen      do j = 1,21
3340*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,22)
3341*59599516SKenneth E. Jansen      enddo
3342*59599516SKenneth E. Jansen      do j = 23,33
3343*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,22)
3344*59599516SKenneth E. Jansen      enddo
3345*59599516SKenneth E. Jansen
3346*59599516SKenneth E. Jansen
3347*59599516SKenneth E. Jansen      do iblk = 1,nelblk
3348*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
3349*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
3350*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
3351*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
3352*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
3353*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
3354*59599516SKenneth E. Jansen        inum  = iel + npro - 1
3355*59599516SKenneth E. Jansen
3356*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
3357*59599516SKenneth E. Jansen
3358*59599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
3359*59599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
3360*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
3361*59599516SKenneth E. Jansen
3362*59599516SKenneth E. Jansen      enddo
3363*59599516SKenneth E. Jansen
3364*59599516SKenneth E. Jansenc
3365*59599516SKenneth E. Jansenc... Obtain the hat-tilde strain rate norm at the nodes
3366*59599516SKenneth E. Jansenc
3367*59599516SKenneth E. Jansen
3368*59599516SKenneth E. Jansen      strnrm = sqrt(
3369*59599516SKenneth E. Jansen     &  two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2)
3370*59599516SKenneth E. Jansen     &  + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
3371*59599516SKenneth E. Jansen
3372*59599516SKenneth E. Jansenc      fwr = fwr1 * strnrm
3373*59599516SKenneth E. Jansen
3374*59599516SKenneth E. Jansen      fwr = fwr1 * fwr3 * strnrm
3375*59599516SKenneth E. Jansen
3376*59599516SKenneth E. Jansen      xmij(:,1) = -fwr
3377*59599516SKenneth E. Jansen     &             * fres(:,10) + fres(:,16)
3378*59599516SKenneth E. Jansen      xmij(:,2) = -fwr
3379*59599516SKenneth E. Jansen     &             * fres(:,11) + fres(:,17)
3380*59599516SKenneth E. Jansen      xmij(:,3) = -fwr
3381*59599516SKenneth E. Jansen     &             * fres(:,12) + fres(:,18)
3382*59599516SKenneth E. Jansen
3383*59599516SKenneth E. Jansen      xmij(:,4) = -fwr * fres(:,13) + fres(:,19)
3384*59599516SKenneth E. Jansen      xmij(:,5) = -fwr * fres(:,14) + fres(:,20)
3385*59599516SKenneth E. Jansen      xmij(:,6) = -fwr * fres(:,15) + fres(:,21)
3386*59599516SKenneth E. Jansen
3387*59599516SKenneth E. Jansen
3388*59599516SKenneth E. Jansen      xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1)
3389*59599516SKenneth E. Jansen      xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2)
3390*59599516SKenneth E. Jansen      xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3)
3391*59599516SKenneth E. Jansen      xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2)
3392*59599516SKenneth E. Jansen      xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3)
3393*59599516SKenneth E. Jansen      xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3)
3394*59599516SKenneth E. Jansen
3395*59599516SKenneth E. Jansen      xnum =        xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2)
3396*59599516SKenneth E. Jansen     &                                    + xlij(:,3) * xmij(:,3)
3397*59599516SKenneth E. Jansen     &     + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5)
3398*59599516SKenneth E. Jansen     &                                    + xlij(:,6) * xmij(:,6))
3399*59599516SKenneth E. Jansen      xden =        xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2)
3400*59599516SKenneth E. Jansen     &                                    + xmij(:,3) * xmij(:,3)
3401*59599516SKenneth E. Jansen     &     + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5)
3402*59599516SKenneth E. Jansen     &                                    + xmij(:,6) * xmij(:,6))
3403*59599516SKenneth E. Jansen      xden = two * xden
3404*59599516SKenneth E. Jansen
3405*59599516SKenneth E. Jansenc... For collectection of statistics on dyn. model components
3406*59599516SKenneth E. Jansen
3407*59599516SKenneth E. Jansen      xfac(:,1) = strnrm*strnrm*( fres(:,10)**2 + fres(:,11)**2 +
3408*59599516SKenneth E. Jansen     &     fres(:,12)**2
3409*59599516SKenneth E. Jansen     &     + two*( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
3410*59599516SKenneth E. Jansen
3411*59599516SKenneth E. Jansen      xfac(:,2) = strnrm*( xlij(:,1)*fres(:,10) + xlij(:,2)*fres(:,11)
3412*59599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,12) +
3413*59599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,13) + xlij(:,5)*fres(:,14) +
3414*59599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,15)) )
3415*59599516SKenneth E. Jansen
3416*59599516SKenneth E. Jansen      xfac(:,3) = strnrm*( fres(:,10)*fres(:,16) + fres(:,11)*fres(:,17)
3417*59599516SKenneth E. Jansen     &     + fres(:,12)*fres(:,18) +
3418*59599516SKenneth E. Jansen     &     two*(fres(:,13)*fres(:,19) + fres(:,14)*fres(:,20) +
3419*59599516SKenneth E. Jansen     &     fres(:,15)*fres(:,21)) )
3420*59599516SKenneth E. Jansen
3421*59599516SKenneth E. Jansen      xfac(:,4) = xlij(:,1)*fres(:,16) + xlij(:,2)*fres(:,17)
3422*59599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,18) +
3423*59599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,19) + xlij(:,5)*fres(:,20) +
3424*59599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,21))
3425*59599516SKenneth E. Jansen
3426*59599516SKenneth E. Jansen      xfac(:,5) = fres(:,16)*fres(:,16) + fres(:,17)*fres(:,17)
3427*59599516SKenneth E. Jansen     &     + fres(:,18)*fres(:,18) +
3428*59599516SKenneth E. Jansen     &     two*(fres(:,19)*fres(:,19) + fres(:,20)*fres(:,20) +
3429*59599516SKenneth E. Jansen     &     fres(:,21)*fres(:,21))
3430*59599516SKenneth E. Jansen
3431*59599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
3432*59599516SKenneth E. Jansen        do j = 1,numnp
3433*59599516SKenneth E. Jansen          i = iper(j)
3434*59599516SKenneth E. Jansen          if (i .ne. j) then
3435*59599516SKenneth E. Jansen            xnum(j) = zero
3436*59599516SKenneth E. Jansen            xden(j) = zero
3437*59599516SKenneth E. Jansen            xfac(j,:) = zero
3438*59599516SKenneth E. Jansen            xmij(j,:) = zero
3439*59599516SKenneth E. Jansen            xlij(j,:) = zero
3440*59599516SKenneth E. Jansen            fres(j,:) = zero
3441*59599516SKenneth E. Jansen            strnrm(j) = zero
3442*59599516SKenneth E. Jansen          endif
3443*59599516SKenneth E. Jansen        enddo
3444*59599516SKenneth E. Jansen
3445*59599516SKenneth E. Jansen      if (numpe.gt.1) then
3446*59599516SKenneth E. Jansen
3447*59599516SKenneth E. Jansen         numtask = ilwork(1)
3448*59599516SKenneth E. Jansen         itkbeg = 1
3449*59599516SKenneth E. Jansen
3450*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
3451*59599516SKenneth E. Jansen         do itask = 1, numtask
3452*59599516SKenneth E. Jansen
3453*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
3454*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
3455*59599516SKenneth E. Jansen
3456*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
3457*59599516SKenneth E. Jansen               do is = 1,numseg
3458*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
3459*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
3460*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
3461*59599516SKenneth E. Jansen                  xnum(isgbeg:isgend) = zero
3462*59599516SKenneth E. Jansen                  xden(isgbeg:isgend) = zero
3463*59599516SKenneth E. Jansen                  strnrm(isgbeg:isgend) = zero
3464*59599516SKenneth E. Jansen                  xfac(isgbeg:isgend,:) = zero
3465*59599516SKenneth E. Jansen                  xmij(isgbeg:isgend,:) = zero
3466*59599516SKenneth E. Jansen                  xlij(isgbeg:isgend,:) = zero
3467*59599516SKenneth E. Jansen                  fres(isgbeg:isgend,:) = zero
3468*59599516SKenneth E. Jansen               enddo
3469*59599516SKenneth E. Jansen            endif
3470*59599516SKenneth E. Jansen
3471*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
3472*59599516SKenneth E. Jansen
3473*59599516SKenneth E. Jansen         enddo
3474*59599516SKenneth E. Jansen
3475*59599516SKenneth E. Jansen      endif
3476*59599516SKenneth E. Jansenc
3477*59599516SKenneth E. Jansenc Description of arrays.   Each processor has an array of length equal
3478*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect
3479*59599516SKenneth E. Jansenc the numerator and one to collect the denominator.  There is also an array
3480*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each
3481*59599516SKenneth E. Jansenc on processor node, ifath(nnshg).  Finally, there is an arry of length
3482*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons
3483*59599516SKenneth E. Jansenc for each father.
3484*59599516SKenneth E. Jansenc
3485*59599516SKenneth E. Jansenc  Now loop over nodes and accumlate the numerator and the denominator
3486*59599516SKenneth E. Jansenc  to the father nodes.  Only on processor addition at this point.
3487*59599516SKenneth E. Jansenc  Note that serrogate fathers are collect some for the case where some
3488*59599516SKenneth E. Jansenc  sons are on another processor
3489*59599516SKenneth E. Jansenc
3490*59599516SKenneth E. Jansen      xnude = zero
3491*59599516SKenneth E. Jansen      ynude = zero
3492*59599516SKenneth E. Jansen      xm    = zero
3493*59599516SKenneth E. Jansen      xl    = zero
3494*59599516SKenneth E. Jansen      xl1   = zero
3495*59599516SKenneth E. Jansen      xl2   = zero
3496*59599516SKenneth E. Jansen      ui    = zero
3497*59599516SKenneth E. Jansen      snorm = zero
3498*59599516SKenneth E. Jansen
3499*59599516SKenneth E. Jansen      do i = 1,nshg
3500*59599516SKenneth E. Jansen         xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i)
3501*59599516SKenneth E. Jansen         xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i)
3502*59599516SKenneth E. Jansen
3503*59599516SKenneth E. Jansen         ynude(ifath(i),1) = ynude(ifath(i),1) + xfac(i,1)
3504*59599516SKenneth E. Jansen         ynude(ifath(i),2) = ynude(ifath(i),2) + xfac(i,2)
3505*59599516SKenneth E. Jansen         ynude(ifath(i),3) = ynude(ifath(i),3) + xfac(i,3)
3506*59599516SKenneth E. Jansen         ynude(ifath(i),4) = ynude(ifath(i),4) + xfac(i,4)
3507*59599516SKenneth E. Jansen         ynude(ifath(i),5) = ynude(ifath(i),5) + xfac(i,5)
3508*59599516SKenneth E. Jansen
3509*59599516SKenneth E. Jansen         xm(ifath(i),1) = xm(ifath(i),1) + xmij(i,1)
3510*59599516SKenneth E. Jansen         xm(ifath(i),2) = xm(ifath(i),2) + xmij(i,2)
3511*59599516SKenneth E. Jansen         xm(ifath(i),3) = xm(ifath(i),3) + xmij(i,3)
3512*59599516SKenneth E. Jansen         xm(ifath(i),4) = xm(ifath(i),4) + xmij(i,4)
3513*59599516SKenneth E. Jansen         xm(ifath(i),5) = xm(ifath(i),5) + xmij(i,5)
3514*59599516SKenneth E. Jansen         xm(ifath(i),6) = xm(ifath(i),6) + xmij(i,6)
3515*59599516SKenneth E. Jansen
3516*59599516SKenneth E. Jansen         xl(ifath(i),1) = xl(ifath(i),1) + xlij(i,1)
3517*59599516SKenneth E. Jansen         xl(ifath(i),2) = xl(ifath(i),2) + xlij(i,2)
3518*59599516SKenneth E. Jansen         xl(ifath(i),3) = xl(ifath(i),3) + xlij(i,3)
3519*59599516SKenneth E. Jansen         xl(ifath(i),4) = xl(ifath(i),4) + xlij(i,4)
3520*59599516SKenneth E. Jansen         xl(ifath(i),5) = xl(ifath(i),5) + xlij(i,5)
3521*59599516SKenneth E. Jansen         xl(ifath(i),6) = xl(ifath(i),6) + xlij(i,6)
3522*59599516SKenneth E. Jansen
3523*59599516SKenneth E. Jansen         xl1(ifath(i),1) = xl1(ifath(i),1) + fres(i,4)
3524*59599516SKenneth E. Jansen         xl1(ifath(i),2) = xl1(ifath(i),2) + fres(i,5)
3525*59599516SKenneth E. Jansen         xl1(ifath(i),3) = xl1(ifath(i),3) + fres(i,6)
3526*59599516SKenneth E. Jansen         xl1(ifath(i),4) = xl1(ifath(i),4) + fres(i,7)
3527*59599516SKenneth E. Jansen         xl1(ifath(i),5) = xl1(ifath(i),5) + fres(i,8)
3528*59599516SKenneth E. Jansen         xl1(ifath(i),6) = xl1(ifath(i),6) + fres(i,9)
3529*59599516SKenneth E. Jansen
3530*59599516SKenneth E. Jansen         xl2(ifath(i),1) = xl2(ifath(i),1) + fres(i,1)*fres(i,1)
3531*59599516SKenneth E. Jansen         xl2(ifath(i),2) = xl2(ifath(i),2) + fres(i,2)*fres(i,2)
3532*59599516SKenneth E. Jansen         xl2(ifath(i),3) = xl2(ifath(i),3) + fres(i,3)*fres(i,3)
3533*59599516SKenneth E. Jansen         xl2(ifath(i),4) = xl2(ifath(i),4) + fres(i,1)*fres(i,2)
3534*59599516SKenneth E. Jansen         xl2(ifath(i),5) = xl2(ifath(i),5) + fres(i,1)*fres(i,3)
3535*59599516SKenneth E. Jansen         xl2(ifath(i),6) = xl2(ifath(i),6) + fres(i,2)*fres(i,3)
3536*59599516SKenneth E. Jansen
3537*59599516SKenneth E. Jansen         ui(ifath(i),1) = ui(ifath(i),1) + fres(i,1)
3538*59599516SKenneth E. Jansen         ui(ifath(i),2) = ui(ifath(i),2) + fres(i,2)
3539*59599516SKenneth E. Jansen         ui(ifath(i),3) = ui(ifath(i),3) + fres(i,3)
3540*59599516SKenneth E. Jansen
3541*59599516SKenneth E. Jansen         snorm(ifath(i)) = snorm(ifath(i)) + strnrm(i)
3542*59599516SKenneth E. Jansen
3543*59599516SKenneth E. Jansen      enddo
3544*59599516SKenneth E. Jansen
3545*59599516SKenneth E. Jansenc
3546*59599516SKenneth E. Jansenc Now  the true fathers and serrogates combine results and update
3547*59599516SKenneth E. Jansenc each other.
3548*59599516SKenneth E. Jansenc
3549*59599516SKenneth E. Jansen      if(numpe .gt. 1)then
3550*59599516SKenneth E. Jansen         call drvAllreduce(xnude, xnuder,2*nfath)
3551*59599516SKenneth E. Jansen         call drvAllreduce(ynude, ynuder,6*nfath)
3552*59599516SKenneth E. Jansen         call drvAllreduce(xm, xmr,6*nfath)
3553*59599516SKenneth E. Jansen         call drvAllreduce(xl, xlr,6*nfath)
3554*59599516SKenneth E. Jansen         call drvAllreduce(xl1, xl1r,6*nfath)
3555*59599516SKenneth E. Jansen         call drvAllreduce(xl2, xl2r,6*nfath)
3556*59599516SKenneth E. Jansen         call drvAllreduce(ui, uir,3*nfath)
3557*59599516SKenneth E. Jansen         call drvAllreduce(snorm, snormr,nfath)
3558*59599516SKenneth E. Jansen
3559*59599516SKenneth E. Jansen         do i = 1, nfath
3560*59599516SKenneth E. Jansen            ynuder(i,6) = ( ynuder(i,4) - fwr1*ynuder(i,2) ) /
3561*59599516SKenneth E. Jansen     &           ( two*ynuder(i,5) - four*fwr1*ynuder(i,3)
3562*59599516SKenneth E. Jansen     &           + two*fwr1*fwr1*ynuder(i,1) )
3563*59599516SKenneth E. Jansen         enddo
3564*59599516SKenneth E. Jansen
3565*59599516SKenneth E. Jansen         cdelsq2(:) = ynuder(ifath(:),6)  ! For comparison w/ cdelsq
3566*59599516SKenneth E. Jansenc
3567*59599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
3568*59599516SKenneth E. Jansenc
3569*59599516SKenneth E. Jansenc  xnuder is the sum of the sons for each father on all processor combined
3570*59599516SKenneth E. Jansenc  (the same as if we had not partitioned the mesh for each processor)
3571*59599516SKenneth E. Jansenc
3572*59599516SKenneth E. Jansenc   For each father we have precomputed the number of sons (including
3573*59599516SKenneth E. Jansenc   the sons off processor).
3574*59599516SKenneth E. Jansenc
3575*59599516SKenneth E. Jansenc   Now divide by number of sons to get the average (not really necessary
3576*59599516SKenneth E. Jansenc   for dynamic model since ratio will cancel nsons at each father)
3577*59599516SKenneth E. Jansenc
3578*59599516SKenneth E. Jansen         xnuder(:,1) = xnuder(:,1) / nsons(:)
3579*59599516SKenneth E. Jansen         xnuder(:,2) = xnuder(:,2) / nsons(:)
3580*59599516SKenneth E. Jansen
3581*59599516SKenneth E. Jansen         do m = 1, 5
3582*59599516SKenneth E. Jansen         ynuder(:,m) = ynuder(:,m)/nsons(:)
3583*59599516SKenneth E. Jansen         enddo
3584*59599516SKenneth E. Jansen         do m = 1,6
3585*59599516SKenneth E. Jansen         xmr(:,m) = xmr(:,m)/nsons(:)
3586*59599516SKenneth E. Jansen         xlr(:,m) = xlr(:,m)/nsons(:)
3587*59599516SKenneth E. Jansen         xl1r(:,m) = xl1r(:,m)/nsons(:)
3588*59599516SKenneth E. Jansen         xl2r(:,m) = xl2r(:,m)/nsons(:)
3589*59599516SKenneth E. Jansen         enddo
3590*59599516SKenneth E. Jansen
3591*59599516SKenneth E. Jansen         uir(:,1) = uir(:,1)/nsons(:)
3592*59599516SKenneth E. Jansen         uir(:,2) = uir(:,2)/nsons(:)
3593*59599516SKenneth E. Jansen         uir(:,3) = uir(:,3)/nsons(:)
3594*59599516SKenneth E. Jansen
3595*59599516SKenneth E. Jansen         snormr(:) = snormr(:)/nsons(:)
3596*59599516SKenneth E. Jansen
3597*59599516SKenneth E. Jansenc
3598*59599516SKenneth E. Jansencc  the next line is c \Delta^2
3599*59599516SKenneth E. Jansencc
3600*59599516SKenneth E. Jansencc         xnuder(:,1) = xnuder(:,1) / (xnuder(:,2) + 1.d-09)
3601*59599516SKenneth E. Jansencc         do i = 1,nshg
3602*59599516SKenneth E. Jansencc            cdelsq(i) = xnuder(ifath(i),1)
3603*59599516SKenneth E. Jansencc         enddo
3604*59599516SKenneth E. Jansen
3605*59599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnuder(ifath(:),1)
3606*59599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnuder(ifath(:),2)
3607*59599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
3608*59599516SKenneth E. Jansen
3609*59599516SKenneth E. Jansenc            cdelsq(:) = xnuder(ifath(:),1)/(xnuder(ifath(:),2)+1.d-09)
3610*59599516SKenneth E. Jansen
3611*59599516SKenneth E. Jansen            xnd(:,1) = xnd(:,1) + xnuder(:,1)
3612*59599516SKenneth E. Jansen            xnd(:,2) = xnd(:,2) + xnuder(:,2)
3613*59599516SKenneth E. Jansen
3614*59599516SKenneth E. Jansen            xmodcomp(:,1) = xmodcomp(:,1)+ynuder(:,1)
3615*59599516SKenneth E. Jansen            xmodcomp(:,2) = xmodcomp(:,2)+ynuder(:,2)
3616*59599516SKenneth E. Jansen            xmodcomp(:,3) = xmodcomp(:,3)+ynuder(:,3)
3617*59599516SKenneth E. Jansen            xmodcomp(:,4) = xmodcomp(:,4)+ynuder(:,4)
3618*59599516SKenneth E. Jansen            xmodcomp(:,5) = xmodcomp(:,5)+ynuder(:,5)
3619*59599516SKenneth E. Jansen
3620*59599516SKenneth E. Jansen            xmcomp(:,:) = xmcomp(:,:)+xmr(:,:)
3621*59599516SKenneth E. Jansen            xlcomp(:,:) = xlcomp(:,:)+xlr(:,:)
3622*59599516SKenneth E. Jansen
3623*59599516SKenneth E. Jansen            xl1comp(:,:) = xl1comp(:,:)+xl1r(:,:)
3624*59599516SKenneth E. Jansen            xl2comp(:,:) = xl2comp(:,:)+xl2r(:,:)
3625*59599516SKenneth E. Jansen
3626*59599516SKenneth E. Jansen            ucomp(:,:) = ucomp(:,:)+uir(:,:)
3627*59599516SKenneth E. Jansen            u1 = uir(32,1)
3628*59599516SKenneth E. Jansen            scomp(:)   = scomp(:)+snormr(:)
3629*59599516SKenneth E. Jansen
3630*59599516SKenneth E. Jansen      else
3631*59599516SKenneth E. Jansen
3632*59599516SKenneth E. Jansen         xnude(:,1) = xnude(:,1)/nsons(:)
3633*59599516SKenneth E. Jansen         xnude(:,2) = xnude(:,2)/nsons(:)
3634*59599516SKenneth E. Jansen
3635*59599516SKenneth E. Jansen         do m = 1, 5
3636*59599516SKenneth E. Jansen         ynude(:,m) = ynude(:,m)/nsons(:)
3637*59599516SKenneth E. Jansen         enddo
3638*59599516SKenneth E. Jansen         do m = 1,6
3639*59599516SKenneth E. Jansen         xm(:,m) = xm(:,m)/nsons(:)
3640*59599516SKenneth E. Jansen         xl(:,m) = xl(:,m)/nsons(:)
3641*59599516SKenneth E. Jansen         xl1(:,m) = xl1(:,m)/nsons(:)
3642*59599516SKenneth E. Jansen         xl2(:,m) = xl2(:,m)/nsons(:)
3643*59599516SKenneth E. Jansen         enddo
3644*59599516SKenneth E. Jansen
3645*59599516SKenneth E. Jansen         ui(:,1) = ui(:,1)/nsons(:)
3646*59599516SKenneth E. Jansen         ui(:,2) = ui(:,2)/nsons(:)
3647*59599516SKenneth E. Jansen         ui(:,3) = ui(:,3)/nsons(:)
3648*59599516SKenneth E. Jansen
3649*59599516SKenneth E. Jansen         snorm(:) = snorm(:)/nsons(:)
3650*59599516SKenneth E. Jansenc
3651*59599516SKenneth E. Jansenc     the next line is c \Delta^2, not nu_T but we want to save the
3652*59599516SKenneth E. Jansenc     memory
3653*59599516SKenneth E. Jansenc
3654*59599516SKenneth E. Jansen
3655*59599516SKenneth E. Jansencc         xnude(:,1) = xnude(:,1) / (xnude(:,2) + 1.d-09)
3656*59599516SKenneth E. Jansencc        do i = 1,nshg
3657*59599516SKenneth E. Jansencc            cdelsq(i) = xnude(ifath(i),1)
3658*59599516SKenneth E. Jansencc         enddo
3659*59599516SKenneth E. Jansencc      endif
3660*59599516SKenneth E. Jansen
3661*59599516SKenneth E. Jansen         do i = 1, nfath
3662*59599516SKenneth E. Jansen            ynude(i,6) = ( ynude(i,4) - fwr1*ynude(i,2) ) /
3663*59599516SKenneth E. Jansen     &           ( two*ynude(i,5) - four*fwr1*ynude(i,3)
3664*59599516SKenneth E. Jansen     &           + fwr1*fwr1*ynude(i,1) )
3665*59599516SKenneth E. Jansen         enddo
3666*59599516SKenneth E. Jansen
3667*59599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnude(ifath(:),1)
3668*59599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnude(ifath(:),2)
3669*59599516SKenneth E. Jansen
3670*59599516SKenneth E. Jansen            xnd(:,1) = xnd(:,1)+xnude(:,1)
3671*59599516SKenneth E. Jansen            xnd(:,2) = xnd(:,2)+xnude(:,2)
3672*59599516SKenneth E. Jansen
3673*59599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2)) ! + 1.d-09)
3674*59599516SKenneth E. Jansen
3675*59599516SKenneth E. Jansenc            cdelsq(:) = xnude(ifath(:),1)/(xnude(ifath(:),2))!+1.d-09)
3676*59599516SKenneth E. Jansen
3677*59599516SKenneth E. Jansen
3678*59599516SKenneth E. Jansen          cdelsq2(:) = ynude(ifath(:),6)  ! For comparison w/ cdelsq
3679*59599516SKenneth E. Jansen
3680*59599516SKenneth E. Jansen            xmodcomp(:,1) = xmodcomp(:,1)+ynude(:,1)
3681*59599516SKenneth E. Jansen            xmodcomp(:,2) = xmodcomp(:,2)+ynude(:,2)
3682*59599516SKenneth E. Jansen            xmodcomp(:,3) = xmodcomp(:,3)+ynude(:,3)
3683*59599516SKenneth E. Jansen            xmodcomp(:,4) = xmodcomp(:,4)+ynude(:,4)
3684*59599516SKenneth E. Jansen            xmodcomp(:,5) = xmodcomp(:,5)+ynude(:,5)
3685*59599516SKenneth E. Jansen
3686*59599516SKenneth E. Jansen            xmcomp(:,:) = xmcomp(:,:)+xm(:,:)
3687*59599516SKenneth E. Jansen            xlcomp(:,:) = xlcomp(:,:)+xl(:,:)
3688*59599516SKenneth E. Jansen
3689*59599516SKenneth E. Jansen            xl1comp(:,:) = xl1comp(:,:)+xl1(:,:)
3690*59599516SKenneth E. Jansen            xl2comp(:,:) = xl2comp(:,:)+xl2(:,:)
3691*59599516SKenneth E. Jansen
3692*59599516SKenneth E. Jansen            ucomp(:,:) = ucomp(:,:)+ui(:,:)
3693*59599516SKenneth E. Jansen            u1 = ui(32,1)
3694*59599516SKenneth E. Jansen            scomp(:)   = scomp(:)+snorm(:)
3695*59599516SKenneth E. Jansen
3696*59599516SKenneth E. Jansen         endif
3697*59599516SKenneth E. Jansen
3698*59599516SKenneth E. Jansen
3699*59599516SKenneth E. Jansenc         do i = 1, nfath
3700*59599516SKenneth E. Jansenc            xmodcomp(i,:) = xmodcomp(i,:)/nsons(i)
3701*59599516SKenneth E. Jansenc            xmcomp(i,:) = xmcomp(i,:)/nsons(i)
3702*59599516SKenneth E. Jansenc            xlcomp(i,:) = xlcomp(i,:)/nsons(i)
3703*59599516SKenneth E. Jansenc            xl2comp(i,:) = xl2comp(i,:)/nsons(i)
3704*59599516SKenneth E. Jansenc            xl1comp(i,:) = xl1comp(i,:)/nsons(i)
3705*59599516SKenneth E. Jansenc            xnd(i,:) = xnd(i,:)/nsons(i)
3706*59599516SKenneth E. Jansenc            scomp(i) = scomp(i)/nsons(i)
3707*59599516SKenneth E. Jansenc            ucomp(i,:) = ucomp(i,:)/nsons(i)
3708*59599516SKenneth E. Jansenc         enddo
3709*59599516SKenneth E. Jansen
3710*59599516SKenneth E. Jansen         if ( istep .eq. (nstep(1)-1) ) then
3711*59599516SKenneth E. Jansen         if ( myrank .eq. master) then
3712*59599516SKenneth E. Jansen
3713*59599516SKenneth E. Jansen            do i = 1, nfath
3714*59599516SKenneth E. Jansen            write(365,*)xmodcomp(i,1),xmodcomp(i,2),xmodcomp(i,3),
3715*59599516SKenneth E. Jansen     &              xmodcomp(i,4),xmodcomp(i,5)
3716*59599516SKenneth E. Jansen
3717*59599516SKenneth E. Jansen            write(366,*)xmcomp(i,1),xmcomp(i,2),xmcomp(i,3)
3718*59599516SKenneth E. Jansen            write(367,*)xmcomp(i,4),xmcomp(i,5),xmcomp(i,6)
3719*59599516SKenneth E. Jansen
3720*59599516SKenneth E. Jansen            write(368,*)xlcomp(i,1),xlcomp(i,2),xlcomp(i,3)
3721*59599516SKenneth E. Jansen            write(369,*)xlcomp(i,4),xlcomp(i,5),xlcomp(i,6)
3722*59599516SKenneth E. Jansen
3723*59599516SKenneth E. Jansen            write(370,*)xl1comp(i,1),xl1comp(i,2),xl1comp(i,3)
3724*59599516SKenneth E. Jansen            write(371,*)xl1comp(i,4),xl1comp(i,5),xl1comp(i,6)
3725*59599516SKenneth E. Jansen
3726*59599516SKenneth E. Jansen            write(372,*)xl2comp(i,1),xl2comp(i,2),xl2comp(i,3)
3727*59599516SKenneth E. Jansen            write(373,*)xl2comp(i,4),xl2comp(i,5),xl2comp(i,6)
3728*59599516SKenneth E. Jansen
3729*59599516SKenneth E. Jansen            write(374,*)xnd(i,1),xnd(i,2),scomp(i)
3730*59599516SKenneth E. Jansen            write(375,*)ucomp(i,1),ucomp(i,2),ucomp(i,3)
3731*59599516SKenneth E. Jansen
3732*59599516SKenneth E. Jansenc            write(*,*)'uit uic=', ucomp(32,1),u1
3733*59599516SKenneth E. Jansen            enddo
3734*59599516SKenneth E. Jansen
3735*59599516SKenneth E. Jansen
3736*59599516SKenneth E. Jansen            call flush(365)
3737*59599516SKenneth E. Jansen            call flush(366)
3738*59599516SKenneth E. Jansen            call flush(367)
3739*59599516SKenneth E. Jansen            call flush(368)
3740*59599516SKenneth E. Jansen            call flush(369)
3741*59599516SKenneth E. Jansen            call flush(370)
3742*59599516SKenneth E. Jansen            call flush(371)
3743*59599516SKenneth E. Jansen            call flush(372)
3744*59599516SKenneth E. Jansen            call flush(373)
3745*59599516SKenneth E. Jansen            call flush(374)
3746*59599516SKenneth E. Jansen            call flush(375)
3747*59599516SKenneth E. Jansen
3748*59599516SKenneth E. Jansenc            if (myrank .eq. master) then
3749*59599516SKenneth E. Jansenc               write(*,*)'uit uic=', ucomp(32,1),u1
3750*59599516SKenneth E. Jansenc            endif
3751*59599516SKenneth E. Jansen
3752*59599516SKenneth E. Jansen
3753*59599516SKenneth E. Jansenc            close(852)
3754*59599516SKenneth E. Jansenc            close(853)
3755*59599516SKenneth E. Jansenc            close(854)
3756*59599516SKenneth E. Jansen
3757*59599516SKenneth E. Jansen         endif
3758*59599516SKenneth E. Jansen         endif
3759*59599516SKenneth E. Jansen
3760*59599516SKenneth E. Jansen            if (myrank .eq. master) then
3761*59599516SKenneth E. Jansen               write(*,*)'uit uic=', ucomp(32,1),u1
3762*59599516SKenneth E. Jansen            endif
3763*59599516SKenneth E. Jansen
3764*59599516SKenneth E. Jansen
3765*59599516SKenneth E. Jansen 555     format(e14.7,4(2x,e14.7))
3766*59599516SKenneth E. Jansen 556     format(e14.7,5(2x,e14.7))
3767*59599516SKenneth E. Jansen
3768*59599516SKenneth E. Jansenc         close(849)
3769*59599516SKenneth E. Jansenc         close(850)
3770*59599516SKenneth E. Jansenc         close(851)
3771*59599516SKenneth E. Jansenc         close(852)
3772*59599516SKenneth E. Jansenc         close(853)
3773*59599516SKenneth E. Jansenc         close(854)
3774*59599516SKenneth E. Jansen
3775*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
3776*59599516SKenneth E. Jansen      tmp1 =  MINVAL(cdelsq)
3777*59599516SKenneth E. Jansen      tmp2 =  MAXVAL(cdelsq)
3778*59599516SKenneth E. Jansen      if(numpe>1) then
3779*59599516SKenneth E. Jansen         call MPI_REDUCE (tmp1, tmp3, 1,MPI_DOUBLE_PRECISION,
3780*59599516SKenneth E. Jansen     &        MPI_MIN, master, MPI_COMM_WORLD, ierr)
3781*59599516SKenneth E. Jansen         call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
3782*59599516SKenneth E. Jansen     &        MPI_MAX, master, MPI_COMM_WORLD, ierr)
3783*59599516SKenneth E. Jansen         tmp1=tmp3
3784*59599516SKenneth E. Jansen         tmp2=tmp4
3785*59599516SKenneth E. Jansen      endif
3786*59599516SKenneth E. Jansen      if (myrank .EQ. master) then !print CDelta^2 range
3787*59599516SKenneth E. Jansen         write(34,*)lstep,tmp1,tmp2
3788*59599516SKenneth E. Jansen         call flush(34)
3789*59599516SKenneth E. Jansen      endif
3790*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
3791*59599516SKenneth E. Jansen
3792*59599516SKenneth E. Jansen      if (myrank .eq. master) then
3793*59599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq(1),cdelsq(2)
3794*59599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq2(1),cdelsq2(2)
3795*59599516SKenneth E. Jansen         write(22,*) lstep, cdelsq(1)
3796*59599516SKenneth E. Jansen         call flush(22)
3797*59599516SKenneth E. Jansen      endif
3798*59599516SKenneth E. Jansen
3799*59599516SKenneth E. Jansen      do iblk = 1,nelblk
3800*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
3801*59599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
3802*59599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
3803*59599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
3804*59599516SKenneth E. Jansen         inum  = iel + npro - 1
3805*59599516SKenneth E. Jansen
3806*59599516SKenneth E. Jansen         ngauss = nint(lcsyst)
3807*59599516SKenneth E. Jansen
3808*59599516SKenneth E. Jansen         call scatnu (mien(iblk)%p, strl(iel:inum,:),
3809*59599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:))
3810*59599516SKenneth E. Jansen      enddo
3811*59599516SKenneth E. Jansenc     $$$$$$$$$$$$$$$$$$$$$$$$$$$
3812*59599516SKenneth E. Jansenc$$$  tmp1 =  MINVAL(xmudmi)
3813*59599516SKenneth E. Jansenc$$$  tmp2 =  MAXVAL(xmudmi)
3814*59599516SKenneth E. Jansenc$$$  if(numpe>1) then
3815*59599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION,
3816*59599516SKenneth E. Jansenc$$$  &                 MPI_MIN, master, MPI_COMM_WORLD, ierr)
3817*59599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
3818*59599516SKenneth E. Jansenc$$$  &                 MPI_MAX, master, MPI_COMM_WORLD, ierr)
3819*59599516SKenneth E. Jansenc$$$      tmp1=tmp3
3820*59599516SKenneth E. Jansenc$$$  tmp2=tmp4
3821*59599516SKenneth E. Jansenc$$$  endif
3822*59599516SKenneth E. Jansenc$$$  if (myrank .EQ. master) then
3823*59599516SKenneth E. Jansenc$$$  write(35,*) lstep,tmp1,tmp2
3824*59599516SKenneth E. Jansenc$$$  call flush(35)
3825*59599516SKenneth E. Jansenc$$$  endif
3826*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
3827*59599516SKenneth E. Jansen
3828*59599516SKenneth E. Jansenc
3829*59599516SKenneth E. Jansenc  if flag set, write a restart file with info (reuse xmij's memory)
3830*59599516SKenneth E. Jansenc
3831*59599516SKenneth E. Jansen      if(irs.eq.11) then
3832*59599516SKenneth E. Jansen         lstep=999
3833*59599516SKenneth E. Jansen         xmij(:,1)=xnum(:)
3834*59599516SKenneth E. Jansen         xmij(:,2)=xden(:)
3835*59599516SKenneth E. Jansen         xmij(:,3)=cdelsq(:)
3836*59599516SKenneth E. Jansen         xmij(:,5)=xlij(:,4)    !leave M_{12} in 4 and put L_{12} here
3837*59599516SKenneth E. Jansen         call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac
3838*59599516SKenneth E. Jansen         stop
3839*59599516SKenneth E. Jansen      endif
3840*59599516SKenneth E. Jansenc
3841*59599516SKenneth E. Jansenc  local clipping moved to scatnu with the creation of mxmudmi pointers
3842*59599516SKenneth E. Jansenc
3843*59599516SKenneth E. Jansenc$$$      rmu=datmat(1,2,1)
3844*59599516SKenneth E. Jansenc$$$      xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu
3845*59599516SKenneth E. Jansenc$$$      xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0
3846*59599516SKenneth E. Jansenc      stop !uncomment to test dmod
3847*59599516SKenneth E. Jansenc
3848*59599516SKenneth E. Jansen
3849*59599516SKenneth E. Jansen
3850*59599516SKenneth E. Jansenc  write out the nodal values of xnut (estimate since we don't calc strain
3851*59599516SKenneth E. Jansenc  there and must use the filtered strain).
3852*59599516SKenneth E. Jansenc
3853*59599516SKenneth E. Jansen
3854*59599516SKenneth E. Jansen      if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
3855*59599516SKenneth E. Jansenc
3856*59599516SKenneth E. Jansenc  collect the average strain into xnude(2)
3857*59599516SKenneth E. Jansenc
3858*59599516SKenneth E. Jansen         xnude(:,2) = zero
3859*59599516SKenneth E. Jansen         do i = 1,numnp
3860*59599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + strnrm(i)
3861*59599516SKenneth E. Jansen         enddo
3862*59599516SKenneth E. Jansen
3863*59599516SKenneth E. Jansen         if(numpe .gt. 1) then
3864*59599516SKenneth E. Jansen             call drvAllreduce(xnude(:,2), xnuder(:,2),nfath)
3865*59599516SKenneth E. Jansen          else
3866*59599516SKenneth E. Jansen             xnuder=xnude
3867*59599516SKenneth E. Jansen          endif
3868*59599516SKenneth E. Jansenc
3869*59599516SKenneth E. Jansenc          nut= cdelsq    * |S|
3870*59599516SKenneth E. Jansenc
3871*59599516SKenneth E. Jansen         xnutf=xnuder(:,1)*xnuder(:,2)/nsons(:)
3872*59599516SKenneth E. Jansenc
3873*59599516SKenneth E. Jansenc  collect the x and y coords into xnude
3874*59599516SKenneth E. Jansenc
3875*59599516SKenneth E. Jansen         xnude = zero
3876*59599516SKenneth E. Jansen         do i = 1,numnp
3877*59599516SKenneth E. Jansen            xnude(ifath(i),1) = xnude(ifath(i),1) + x(i,1)
3878*59599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + x(i,2)
3879*59599516SKenneth E. Jansen         enddo
3880*59599516SKenneth E. Jansen
3881*59599516SKenneth E. Jansen         if(numpe .gt. 1)
3882*59599516SKenneth E. Jansen     &        call drvAllreduce(xnude, xnuder,2*nfath)
3883*59599516SKenneth E. Jansen         xnuder(:,1)=xnuder(:,1)/nsons(:)
3884*59599516SKenneth E. Jansen         xnuder(:,2)=xnuder(:,2)/nsons(:)
3885*59599516SKenneth E. Jansenc
3886*59599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
3887*59599516SKenneth E. Jansenc
3888*59599516SKenneth E. Jansen         if((myrank.eq.master)) then
3889*59599516SKenneth E. Jansen            do i=1,nfath      ! cdelsq   * |S|
3890*59599516SKenneth E. Jansen               write(444,*) xnuder(i,1),xnuder(i,2),xnutf(i)
3891*59599516SKenneth E. Jansen            enddo
3892*59599516SKenneth E. Jansen            call flush(444)
3893*59599516SKenneth E. Jansen         endif
3894*59599516SKenneth E. Jansen      endif
3895*59599516SKenneth E. Jansen
3896*59599516SKenneth E. Jansen      return
3897*59599516SKenneth E. Jansen      end
3898