xref: /phasta/phSolver/incompressible/filters.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
159599516SKenneth E. Jansen      subroutine hfilterC (y, x, ien, hfres, shgl, shp, Qwtf)
259599516SKenneth E. Jansen
359599516SKenneth E. Jansenc...  The filter operator used here uses the generalized box
459599516SKenneth E. Jansenc...  kernel
559599516SKenneth E. Jansen
659599516SKenneth E. Jansen
759599516SKenneth E. Jansen      include "common.h"
859599516SKenneth E. Jansen
959599516SKenneth E. Jansen      dimension y(nshg,5),             hfres(nshg,16)
1059599516SKenneth E. Jansen      dimension x(numnp,3),            xl(npro,nenl,3)
1159599516SKenneth E. Jansen      dimension ien(npro,nshl),        yl(npro,nshl,5),
1259599516SKenneth E. Jansen     &          fresl(npro,16),        WdetJ(npro),
1359599516SKenneth E. Jansen     &          u1(npro),              u2(npro),
1459599516SKenneth E. Jansen     &          u3(npro),
1559599516SKenneth E. Jansen     &          S11(npro),             S22(npro),
1659599516SKenneth E. Jansen     &          S33(npro),             S12(npro),
1759599516SKenneth E. Jansen     &          S13(npro),             S23(npro),
1859599516SKenneth E. Jansen     &          dxdxi(npro,nsd,nsd),   dxidx(npro,nsd,nsd),
1959599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),  shg(npro,nshl,nsd),
2059599516SKenneth E. Jansen     &          shp(nshl,ngauss),
2159599516SKenneth E. Jansen     &          fresli(npro,16),       Qwtf(ngaussf)
2259599516SKenneth E. Jansen
2359599516SKenneth E. Jansen      dimension tmp(npro)
2459599516SKenneth E. Jansen
2559599516SKenneth E. Jansen      call local (y,      yl,     ien,    5,  'gather  ')
2659599516SKenneth E. Jansen      call localx (x,      xl,     ien,    3,  'gather  ')
2759599516SKenneth E. Jansenc
2859599516SKenneth E. Jansen
2959599516SKenneth E. Jansen      fresl = zero
3059599516SKenneth E. Jansen
3159599516SKenneth E. Jansenc
3259599516SKenneth E. Jansen      do intp = 1, ngaussf   ! Loop over quadrature points
3359599516SKenneth E. Jansen
3459599516SKenneth E. Jansenc  calculate the metrics
3559599516SKenneth E. Jansenc
3659599516SKenneth E. Jansenc
3759599516SKenneth E. Jansenc.... --------------------->  Element Metrics  <-----------------------
3859599516SKenneth E. Jansenc
3959599516SKenneth E. Jansenc.... compute the deformation gradient
4059599516SKenneth E. Jansenc
4159599516SKenneth E. Jansen         dxdxi = zero
4259599516SKenneth E. Jansenc
4359599516SKenneth E. Jansen         do n = 1, nenl
4459599516SKenneth E. Jansen            dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(1,n,intp)
4559599516SKenneth E. Jansen            dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(2,n,intp)
4659599516SKenneth E. Jansen            dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(3,n,intp)
4759599516SKenneth E. Jansen            dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(1,n,intp)
4859599516SKenneth E. Jansen            dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(2,n,intp)
4959599516SKenneth E. Jansen            dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(3,n,intp)
5059599516SKenneth E. Jansen            dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(1,n,intp)
5159599516SKenneth E. Jansen            dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(2,n,intp)
5259599516SKenneth E. Jansen            dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(3,n,intp)
5359599516SKenneth E. Jansen         enddo
5459599516SKenneth E. Jansenc
5559599516SKenneth E. Jansenc.... compute the inverse of deformation gradient
5659599516SKenneth E. Jansenc
5759599516SKenneth E. Jansen         dxidx(:,1,1) =   dxdxi(:,2,2) * dxdxi(:,3,3)
5859599516SKenneth E. Jansen     &        - dxdxi(:,3,2) * dxdxi(:,2,3)
5959599516SKenneth E. Jansen         dxidx(:,1,2) =   dxdxi(:,3,2) * dxdxi(:,1,3)
6059599516SKenneth E. Jansen     &        - dxdxi(:,1,2) * dxdxi(:,3,3)
6159599516SKenneth E. Jansen         dxidx(:,1,3) =   dxdxi(:,1,2) * dxdxi(:,2,3)
6259599516SKenneth E. Jansen     &        - dxdxi(:,1,3) * dxdxi(:,2,2)
6359599516SKenneth E. Jansen         tmp          = one / ( dxidx(:,1,1) * dxdxi(:,1,1)
6459599516SKenneth E. Jansen     &        + dxidx(:,1,2) * dxdxi(:,2,1)
6559599516SKenneth E. Jansen     &        + dxidx(:,1,3) * dxdxi(:,3,1) )
6659599516SKenneth E. Jansen         dxidx(:,1,1) = dxidx(:,1,1) * tmp
6759599516SKenneth E. Jansen         dxidx(:,1,2) = dxidx(:,1,2) * tmp
6859599516SKenneth E. Jansen         dxidx(:,1,3) = dxidx(:,1,3) * tmp
6959599516SKenneth E. Jansen         dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1)
7059599516SKenneth E. Jansen     &        - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp
7159599516SKenneth E. Jansen         dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3)
7259599516SKenneth E. Jansen     &        - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp
7359599516SKenneth E. Jansen         dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3)
7459599516SKenneth E. Jansen     &        - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp
7559599516SKenneth E. Jansen         dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2)
7659599516SKenneth E. Jansen     &        - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp
7759599516SKenneth E. Jansen         dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2)
7859599516SKenneth E. Jansen     &        - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp
7959599516SKenneth E. Jansen         dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2)
8059599516SKenneth E. Jansen     &        - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp
8159599516SKenneth E. Jansenc
8259599516SKenneth E. Jansenc        wght=Qwt(lcsyst,intp)  ! may be different now
8359599516SKenneth E. Jansen         wght=Qwtf(intp)
8459599516SKenneth E. Jansen         WdetJ(:) = wght / tmp(:)
8559599516SKenneth E. Jansen
8659599516SKenneth E. Jansen
8759599516SKenneth E. Jansenc... compute the gradient of shape functions at the quad. point.
8859599516SKenneth E. Jansen
8959599516SKenneth E. Jansen
9059599516SKenneth E. Jansen      do n = 1,nshl
9159599516SKenneth E. Jansen        shg(:,n,1) = (shgl(1,n,intp) * dxidx(:,1,1)
9259599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,1)
9359599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,1))
9459599516SKenneth E. Jansen        shg(:,n,2) = (shgl(1,n,intp) * dxidx(:,1,2)
9559599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,2)
9659599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,2))
9759599516SKenneth E. Jansen        shg(:,n,3) = (shgl(1,n,intp) * dxidx(:,1,3)
9859599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,3)
9959599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,3))
10059599516SKenneth E. Jansen      enddo
10159599516SKenneth E. Jansen
10259599516SKenneth E. Jansen
10359599516SKenneth E. Jansenc... compute the velocities and the strain rate tensor at the quad. point
10459599516SKenneth E. Jansen
10559599516SKenneth E. Jansen
10659599516SKenneth E. Jansen         u1  = zero
10759599516SKenneth E. Jansen         u2  = zero
10859599516SKenneth E. Jansen         u3  = zero
10959599516SKenneth E. Jansen         S11 = zero
11059599516SKenneth E. Jansen         S22 = zero
11159599516SKenneth E. Jansen         S33 = zero
11259599516SKenneth E. Jansen         S12 = zero
11359599516SKenneth E. Jansen         S13 = zero
11459599516SKenneth E. Jansen         S23 = zero
11559599516SKenneth E. Jansen         do i=1,nshl
11659599516SKenneth E. Jansen            u1 = u1 + shp(i,intp)*yl(:,i,2)
11759599516SKenneth E. Jansen            u2 = u2 + shp(i,intp)*yl(:,i,3)
11859599516SKenneth E. Jansen            u3 = u3 + shp(i,intp)*yl(:,i,4)
11959599516SKenneth E. Jansen
12059599516SKenneth E. Jansen            S11 = S11 + shg(:,i,1)*yl(:,i,2)
12159599516SKenneth E. Jansen            S22 = S22 + shg(:,i,2)*yl(:,i,3)
12259599516SKenneth E. Jansen            S33 = S33 + shg(:,i,3)*yl(:,i,4)
12359599516SKenneth E. Jansen
12459599516SKenneth E. Jansen            S12 = S12 + shg(:,i,2)*yl(:,i,2)
12559599516SKenneth E. Jansen     &                       +shg(:,i,1)*yl(:,i,3)
12659599516SKenneth E. Jansen            S13 = S13 + shg(:,i,3)*yl(:,i,2)
12759599516SKenneth E. Jansen     &                       +shg(:,i,1)*yl(:,i,4)
12859599516SKenneth E. Jansen            S23 = S23 + shg(:,i,3)*yl(:,i,3)
12959599516SKenneth E. Jansen     &                       +shg(:,i,2)*yl(:,i,4)
13059599516SKenneth E. Jansen         enddo
13159599516SKenneth E. Jansen         S12 = pt5 * S12
13259599516SKenneth E. Jansen         S13 = pt5 * S13
13359599516SKenneth E. Jansen         S23 = pt5 * S23
13459599516SKenneth E. Jansen
13559599516SKenneth E. Jansen
13659599516SKenneth E. Jansen         fresli(:,1) = WdetJ * u1 !G * u1 * WdetJ
13759599516SKenneth E. Jansen         fresli(:,2) = WdetJ * u2 !G * u2 * WdetJ
13859599516SKenneth E. Jansen         fresli(:,3) = WdetJ * u3 !G * u3 * WdetJ
13959599516SKenneth E. Jansen
14059599516SKenneth E. Jansen         fresli(:,4) = WdetJ * u1 * u1 ! G*u1*u1*WdetJ
14159599516SKenneth E. Jansen         fresli(:,5) = WdetJ * u2 * u2 ! G*u2*u2*WdetJ
14259599516SKenneth E. Jansen         fresli(:,6) = WdetJ * u3 * u3 ! G*u3*u3*WdetJ
14359599516SKenneth E. Jansen         fresli(:,7) = WdetJ * u1 * u2 ! G*u1*u2*WdetJ
14459599516SKenneth E. Jansen         fresli(:,8) = WdetJ * u1 * u3 ! G*u1*u3*WdetJ
14559599516SKenneth E. Jansen         fresli(:,9) = WdetJ * u2 * u3 ! G*u2*u3*WdetJ
14659599516SKenneth E. Jansen
14759599516SKenneth E. Jansen         fresli(:,10) = S11 * WdetJ ! G*S_{1,1}*WdetJ
14859599516SKenneth E. Jansen         fresli(:,11) = S22 * WdetJ ! G*S_{2,2}*WdetJ
14959599516SKenneth E. Jansen         fresli(:,12) = S33 * WdetJ ! G*S_{3,3}*WdetJ
15059599516SKenneth E. Jansen         fresli(:,13) = S12 * WdetJ ! G*S_{1,1}*WdetJ
15159599516SKenneth E. Jansen         fresli(:,14) = S13 * WdetJ ! G*S_{1,3}*WdetJ
15259599516SKenneth E. Jansen         fresli(:,15) = S23 * WdetJ ! G*S_{2,3}*WdetJ
15359599516SKenneth E. Jansen
15459599516SKenneth E. Jansen         fresli(:,16) = WdetJ !Integral of filter kernel, G,
15559599516SKenneth E. Jansenc                                               over the element
15659599516SKenneth E. Jansen
15759599516SKenneth E. Jansen         do i = 1, 16           ! Add contribution of each quad. point
15859599516SKenneth E. Jansen            fresl(:,i) = fresl(:,i) + fresli(:,i)
15959599516SKenneth E. Jansen         enddo
16059599516SKenneth E. Jansen
16159599516SKenneth E. Jansen      enddo                     !end of loop over integration points
16259599516SKenneth E. Jansenc
16359599516SKenneth E. Jansen
16459599516SKenneth E. Jansen      do j = 1,nshl
16559599516SKenneth E. Jansen      do nel = 1,npro
16659599516SKenneth E. Jansen        hfres(ien(nel,j),:) = hfres(ien(nel,j),:) + fresl(nel,:)
16759599516SKenneth E. Jansen      enddo
16859599516SKenneth E. Jansen      enddo
16959599516SKenneth E. Jansen
17059599516SKenneth E. Jansen
17159599516SKenneth E. Jansen      return
17259599516SKenneth E. Jansen      end
17359599516SKenneth E. Jansen
17459599516SKenneth E. Jansenc... Here, the filter operation (denoted w/ a tilde) uses the generalized
17559599516SKenneth E. Jansenc... box kernel.
17659599516SKenneth E. Jansen
17759599516SKenneth E. Jansen      subroutine twohfilterB (y, x, strnrm, ien, fres,
17859599516SKenneth E. Jansen     &     hfres, shgl, shp, Qwtf)
17959599516SKenneth E. Jansen
18059599516SKenneth E. Jansen      include "common.h"
18159599516SKenneth E. Jansen
18259599516SKenneth E. Jansen      dimension y(nshg,ndof),            fres(nshg,33)
18359599516SKenneth E. Jansen      dimension x(numnp,nsd),            xl(npro,nenl,nsd)
18459599516SKenneth E. Jansen      dimension ien(npro,nshl),        yl(npro,nshl,ndof),
18559599516SKenneth E. Jansen     &          fresl(npro,33),        WdetJ(npro),
18659599516SKenneth E. Jansen     &          u1(npro),              u2(npro),
18759599516SKenneth E. Jansen     &          u3(npro),              dxdxi(npro,nsd,nsd),
18859599516SKenneth E. Jansen     &          strnrm(npro,ngauss),    dxidx(npro,nsd,nsd),
18959599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),       shg(npro,nshl,nsd),
19059599516SKenneth E. Jansen     &          shp(nshl,ngauss),
19159599516SKenneth E. Jansen     &          fresli(npro,33),       Qwtf(ngaussf),
19259599516SKenneth E. Jansen     &          hfres(nshg,16),        hfresl(npro,nshl,16),
19359599516SKenneth E. Jansen     &          S(npro,nshl),          SS11(npro,nshl),
19459599516SKenneth E. Jansen     &          SS22(npro,nshl),       SS33(npro,nshl),
19559599516SKenneth E. Jansen     &          SS12(npro,nshl),       SS13(npro,nshl),
19659599516SKenneth E. Jansen     &          SS23(npro,nshl),
19759599516SKenneth E. Jansen     &          S11p(npro),            S22p(npro),
19859599516SKenneth E. Jansen     &          S33p(npro),            S12p(npro),
19959599516SKenneth E. Jansen     &          S13p(npro),            S23p(npro)
20059599516SKenneth E. Jansen
20159599516SKenneth E. Jansen      dimension tmp(npro)
20259599516SKenneth E. Jansen
20359599516SKenneth E. Jansen      call local (y,      yl,     ien,    5,  'gather  ')
20459599516SKenneth E. Jansen      call localx (x,      xl,     ien,    3,  'gather  ')
20559599516SKenneth E. Jansen      call local (hfres,  hfresl, ien,   16,  'gather  ')
20659599516SKenneth E. Jansen
20759599516SKenneth E. Jansen      S(:,:) = sqrt(
20859599516SKenneth E. Jansen     &     two*(hfresl(:,:,10)**2 + hfresl(:,:,11)**2 +
20959599516SKenneth E. Jansen     &     hfresl(:,:,12)**2) + four*(
21059599516SKenneth E. Jansen     &     hfresl(:,:,13)**2 + hfresl(:,:,14)**2 +
21159599516SKenneth E. Jansen     &     hfresl(:,:,15)**2) )
21259599516SKenneth E. Jansen
21359599516SKenneth E. Jansen      SS11(:,:) = S(:,:)*hfresl(:,:,10)
21459599516SKenneth E. Jansen      SS22(:,:) = S(:,:)*hfresl(:,:,11)
21559599516SKenneth E. Jansen      SS33(:,:) = S(:,:)*hfresl(:,:,12)
21659599516SKenneth E. Jansen      SS12(:,:) = S(:,:)*hfresl(:,:,13)
21759599516SKenneth E. Jansen      SS13(:,:) = S(:,:)*hfresl(:,:,14)
21859599516SKenneth E. Jansen      SS23(:,:) = S(:,:)*hfresl(:,:,15)
21959599516SKenneth E. Jansen
22059599516SKenneth E. Jansen      fresl = zero
22159599516SKenneth E. Jansen
22259599516SKenneth E. Jansen      do intp = 1, ngauss
22359599516SKenneth E. Jansen
22459599516SKenneth E. Jansen
22559599516SKenneth E. Jansenc  calculate the metrics
22659599516SKenneth E. Jansenc
22759599516SKenneth E. Jansenc
22859599516SKenneth E. Jansenc.... --------------------->  Element Metrics  <-----------------------
22959599516SKenneth E. Jansenc
23059599516SKenneth E. Jansenc.... compute the deformation gradient
23159599516SKenneth E. Jansenc
23259599516SKenneth E. Jansen        dxdxi = zero
23359599516SKenneth E. Jansenc
23459599516SKenneth E. Jansen          do n = 1, nenl
23559599516SKenneth E. Jansen            dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(1,n,intp)
23659599516SKenneth E. Jansen            dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(2,n,intp)
23759599516SKenneth E. Jansen            dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(3,n,intp)
23859599516SKenneth E. Jansen            dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(1,n,intp)
23959599516SKenneth E. Jansen            dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(2,n,intp)
24059599516SKenneth E. Jansen            dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(3,n,intp)
24159599516SKenneth E. Jansen            dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(1,n,intp)
24259599516SKenneth E. Jansen            dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(2,n,intp)
24359599516SKenneth E. Jansen            dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(3,n,intp)
24459599516SKenneth E. Jansen          enddo
24559599516SKenneth E. Jansenc
24659599516SKenneth E. Jansenc.... compute the inverse of deformation gradient
24759599516SKenneth E. Jansenc
24859599516SKenneth E. Jansen        dxidx(:,1,1) =   dxdxi(:,2,2) * dxdxi(:,3,3)
24959599516SKenneth E. Jansen     &                 - dxdxi(:,3,2) * dxdxi(:,2,3)
25059599516SKenneth E. Jansen        dxidx(:,1,2) =   dxdxi(:,3,2) * dxdxi(:,1,3)
25159599516SKenneth E. Jansen     &                 - dxdxi(:,1,2) * dxdxi(:,3,3)
25259599516SKenneth E. Jansen        dxidx(:,1,3) =   dxdxi(:,1,2) * dxdxi(:,2,3)
25359599516SKenneth E. Jansen     &                 - dxdxi(:,1,3) * dxdxi(:,2,2)
25459599516SKenneth E. Jansen        tmp          = one / ( dxidx(:,1,1) * dxdxi(:,1,1)
25559599516SKenneth E. Jansen     &                       + dxidx(:,1,2) * dxdxi(:,2,1)
25659599516SKenneth E. Jansen     &                       + dxidx(:,1,3) * dxdxi(:,3,1) )
25759599516SKenneth E. Jansen        dxidx(:,1,1) = dxidx(:,1,1) * tmp
25859599516SKenneth E. Jansen        dxidx(:,1,2) = dxidx(:,1,2) * tmp
25959599516SKenneth E. Jansen        dxidx(:,1,3) = dxidx(:,1,3) * tmp
26059599516SKenneth E. Jansen        dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1)
26159599516SKenneth E. Jansen     &                - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp
26259599516SKenneth E. Jansen        dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3)
26359599516SKenneth E. Jansen     &                - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp
26459599516SKenneth E. Jansen        dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3)
26559599516SKenneth E. Jansen     &                - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp
26659599516SKenneth E. Jansen        dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2)
26759599516SKenneth E. Jansen     &                - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp
26859599516SKenneth E. Jansen        dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2)
26959599516SKenneth E. Jansen     &                - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp
27059599516SKenneth E. Jansen        dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2)
27159599516SKenneth E. Jansen     &                - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp
27259599516SKenneth E. Jansenc
27359599516SKenneth E. Jansen        wght=Qwt(lcsyst,intp)  ! may be different now
27459599516SKenneth E. Jansenc        wght=Qwtf(intp)
27559599516SKenneth E. Jansen        WdetJ = wght / tmp
27659599516SKenneth E. Jansenc
27759599516SKenneth E. Jansen
27859599516SKenneth E. Jansen      do n = 1,nshl
27959599516SKenneth E. Jansen        shg(:,n,1) = (shgl(1,n,intp) * dxidx(:,1,1)
28059599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,1)
28159599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,1))
28259599516SKenneth E. Jansen        shg(:,n,2) = (shgl(1,n,intp) * dxidx(:,1,2)
28359599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,2)
28459599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,2))
28559599516SKenneth E. Jansen        shg(:,n,3) = (shgl(1,n,intp) * dxidx(:,1,3)
28659599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,3)
28759599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,3))
28859599516SKenneth E. Jansen      enddo
28959599516SKenneth E. Jansen
29059599516SKenneth E. Jansenc... compute filtered quantities at the hat level evaluated at the quad. pt.
29159599516SKenneth E. Jansenc... This should really
29259599516SKenneth E. Jansenc... be the bar-hat level, but the bar filter is implicit so we don't
29359599516SKenneth E. Jansenc... bother to mention it.
29459599516SKenneth E. Jansen
29559599516SKenneth E. Jansen      fresli = zero
29659599516SKenneth E. Jansen      S11p   = zero
29759599516SKenneth E. Jansen      S22p   = zero
29859599516SKenneth E. Jansen      S33p   = zero
29959599516SKenneth E. Jansen      S12p   = zero
30059599516SKenneth E. Jansen      S13p   = zero
30159599516SKenneth E. Jansen      S23p   = zero
30259599516SKenneth E. Jansen
30359599516SKenneth E. Jansen      do i = 1, nenl
30459599516SKenneth E. Jansen         fresli(:,1) = fresli(:,1) + shp(i,intp)*hfresl(:,i,1)  ! hat{u1}
30559599516SKenneth E. Jansen         fresli(:,2) = fresli(:,2) + shp(i,intp)*hfresl(:,i,2)  ! hat{u2}
30659599516SKenneth E. Jansen         fresli(:,3) = fresli(:,3) + shp(i,intp)*hfresl(:,i,3)  ! hat{u3}
30759599516SKenneth E. Jansen
30859599516SKenneth E. Jansen         fresli(:,4) = fresli(:,4) + shp(i,intp)*hfresl(:,i,1)*
30959599516SKenneth E. Jansen     &        hfresl(:,i,1)     ! hat{u1}*hat{u1}
31059599516SKenneth E. Jansen         fresli(:,5) = fresli(:,5) + shp(i,intp)*hfresl(:,i,2)*
31159599516SKenneth E. Jansen     &        hfresl(:,i,2)     ! hat{u2}*hat{u2}
31259599516SKenneth E. Jansen         fresli(:,6) = fresli(:,6) + shp(i,intp)*hfresl(:,i,3)*
31359599516SKenneth E. Jansen     &        hfresl(:,i,3)     ! hat{u3}*hat{u3}
31459599516SKenneth E. Jansen         fresli(:,7) = fresli(:,7) + shp(i,intp)*hfresl(:,i,1)*
31559599516SKenneth E. Jansen     &        hfresl(:,i,2)     ! hat{u1}*hat{u2}
31659599516SKenneth E. Jansen         fresli(:,8) = fresli(:,8) + shp(i,intp)*hfresl(:,i,1)*
31759599516SKenneth E. Jansen     &        hfresl(:,i,3)     ! hat{u1}*hat{u3}
31859599516SKenneth E. Jansen         fresli(:,9) = fresli(:,9) + shp(i,intp)*hfresl(:,i,2)*
31959599516SKenneth E. Jansen     &        hfresl(:,i,3)     ! hat{u2}*hat{u3}
32059599516SKenneth E. Jansen
32159599516SKenneth E. Jansen         fresli(:,10) = fresli(:,10) + shp(i,intp)*hfresl(:,i,10)  ! hat{S11}
32259599516SKenneth E. Jansen         fresli(:,11) = fresli(:,11) + shp(i,intp)*hfresl(:,i,11)  ! hat{S22}
32359599516SKenneth E. Jansen         fresli(:,12) = fresli(:,12) + shp(i,intp)*hfresl(:,i,12)  ! hat{S33}
32459599516SKenneth E. Jansen         fresli(:,13) = fresli(:,13) + shp(i,intp)*hfresl(:,i,13)  ! hat{S12}
32559599516SKenneth E. Jansen         fresli(:,14) = fresli(:,14) + shp(i,intp)*hfresl(:,i,14)  ! hat{S13}
32659599516SKenneth E. Jansen         fresli(:,15) = fresli(:,15) + shp(i,intp)*hfresl(:,i,15)  ! hat{S23}
32759599516SKenneth E. Jansen
32859599516SKenneth E. Jansen         S11p = S11p + shg(:,i,1)*hfresl(:,i,1)
32959599516SKenneth E. Jansen         S22p = S22p + shg(:,i,2)*hfresl(:,i,2)
33059599516SKenneth E. Jansen         S33p = S33p + shg(:,i,3)*hfresl(:,i,3)
33159599516SKenneth E. Jansen
33259599516SKenneth E. Jansen         S12p = S12p + shg(:,i,2)*hfresl(:,i,1) +
33359599516SKenneth E. Jansen     &        shg(:,i,1)*hfresl(:,i,2)
33459599516SKenneth E. Jansen         S13p = S13p + shg(:,i,3)*hfresl(:,i,1) +
33559599516SKenneth E. Jansen     &        shg(:,i,1)*hfresl(:,i,3)
33659599516SKenneth E. Jansen         S23p = S23p + shg(:,i,3)*hfresl(:,i,2) +
33759599516SKenneth E. Jansen     &        shg(:,i,2)*hfresl(:,i,3)
33859599516SKenneth E. Jansen
33959599516SKenneth E. Jansen      enddo
34059599516SKenneth E. Jansen
34159599516SKenneth E. Jansenc... get the strain rate tensor norm at the quad. pt.
34259599516SKenneth E. Jansen
34359599516SKenneth E. Jansenc      strnrm(:,intp) = sqrt(
34459599516SKenneth E. Jansenc     &   two * (fresli(:,10)**2 + fresli(:,11)**2 + fresli(:,12)**2)
34559599516SKenneth E. Jansenc     &  + four * ( fresli(:,13)**2 + fresli(:,14)**2 +
34659599516SKenneth E. Jansenc     &    fresli(:,15)**2 ) )
34759599516SKenneth E. Jansen
34859599516SKenneth E. Jansenc      strnrm2(:,intp) = zero
34959599516SKenneth E. Jansenc      do i = 1, nenl
35059599516SKenneth E. Jansenc         strnrm2(:,intp) = strnrm2(:,intp) + S(:,i)*shp(i,intp)
35159599516SKenneth E. Jansenc      enddo
35259599516SKenneth E. Jansen
35359599516SKenneth E. Jansenc      strnrm3(:,intp) = sqrt(
35459599516SKenneth E. Jansenc     &     two * (S11p(:)**2 + S22p(:)**2 + S33p(:)**2)
35559599516SKenneth E. Jansenc     &    + four * ( S12p(:)**2 + S13p(:)**2 + S23p(:)**2) )
35659599516SKenneth E. Jansen
35759599516SKenneth E. Jansenc... compute |hat{S}| * hat{Sij}
35859599516SKenneth E. Jansen
35959599516SKenneth E. Jansen      do i = 1, nenl
36059599516SKenneth E. Jansen         fresli(:,16) =fresli(:,16)+shp(i,intp)*SS11(:,i)! |hat{S}|*hat{S11}
36159599516SKenneth E. Jansen         fresli(:,17) =fresli(:,17)+shp(i,intp)*SS22(:,i)! |hat{S}|*hat{S22}
36259599516SKenneth E. Jansen         fresli(:,18) =fresli(:,18)+shp(i,intp)*SS33(:,i)! |hat{S}|*hat{S33}
36359599516SKenneth E. Jansen         fresli(:,19) =fresli(:,19)+shp(i,intp)*SS12(:,i)! |hat{S}|*hat{S12}
36459599516SKenneth E. Jansen         fresli(:,20) =fresli(:,20)+shp(i,intp)*SS13(:,i)! |hat{S}|*hat{S13}
36559599516SKenneth E. Jansen         fresli(:,21) =fresli(:,21)+shp(i,intp)*SS23(:,i)! |hat{S}|*hat{S23}
36659599516SKenneth E. Jansen      enddo
36759599516SKenneth E. Jansen
36859599516SKenneth E. Jansenc... multiply fresli by WdetJ so that when we finish looping over
36959599516SKenneth E. Jansenc... quad. pts. and add the contributions from all the quad. points
37059599516SKenneth E. Jansenc... we get filtered quantities at the hat-tilde level, secretly the
37159599516SKenneth E. Jansenc... bar-hat-tilde level.
37259599516SKenneth E. Jansen
37359599516SKenneth E. Jansen      do j = 1, 21
37459599516SKenneth E. Jansen         fresli(:,j) = fresli(:,j)*WdetJ(:)
37559599516SKenneth E. Jansen      enddo
37659599516SKenneth E. Jansen
37759599516SKenneth E. Jansenc... compute volume of box kernel
37859599516SKenneth E. Jansen
37959599516SKenneth E. Jansen      fresli(:,22) = WdetJ
38059599516SKenneth E. Jansen
38159599516SKenneth E. Jansenc... add contributions from each quad pt to current element
38259599516SKenneth E. Jansen
38359599516SKenneth E. Jansen      do i = 1, 22
38459599516SKenneth E. Jansen         fresl(:,i) = fresl(:,i) + fresli(:,i)
38559599516SKenneth E. Jansen      enddo
38659599516SKenneth E. Jansen
38759599516SKenneth E. Jansen      enddo ! end of loop over integration points
38859599516SKenneth E. Jansen
38959599516SKenneth E. Jansen
39059599516SKenneth E. Jansenc... scatter locally filtered quantities to the global nodes
39159599516SKenneth E. Jansen
39259599516SKenneth E. Jansen      do j = 1,nshl
39359599516SKenneth E. Jansen      do nel = 1,npro
39459599516SKenneth E. Jansen        fres(ien(nel,j),:) = fres(ien(nel,j),:) + fresl(nel,:)
39559599516SKenneth E. Jansen      enddo
39659599516SKenneth E. Jansen      enddo
39759599516SKenneth E. Jansen
39859599516SKenneth E. Jansen      return
39959599516SKenneth E. Jansen      end
40059599516SKenneth E. Jansen
40159599516SKenneth E. Jansenc...  The filter operator used here uses the generalized box
40259599516SKenneth E. Jansenc...  kernel
40359599516SKenneth E. Jansen
40459599516SKenneth E. Jansen      subroutine hfilterCC (y, x, ien, hfres, shgl, shp, Qwtf)
40559599516SKenneth E. Jansen
40659599516SKenneth E. Jansen      include "common.h"
40759599516SKenneth E. Jansen
40859599516SKenneth E. Jansen      dimension y(nshg,5),             hfres(nshg,22)
40959599516SKenneth E. Jansen      dimension x(numnp,3),            xl(npro,nenl,3)
41059599516SKenneth E. Jansen      dimension ien(npro,nshl),        yl(npro,nshl,5),
41159599516SKenneth E. Jansen     &          fresl(npro,22),        WdetJ(npro),
41259599516SKenneth E. Jansen     &          u1(npro),              u2(npro),
41359599516SKenneth E. Jansen     &          u3(npro),
41459599516SKenneth E. Jansen     &          S11(npro),             S22(npro),
41559599516SKenneth E. Jansen     &          S33(npro),             S12(npro),
41659599516SKenneth E. Jansen     &          S13(npro),             S23(npro),
41759599516SKenneth E. Jansen     &          dxdxi(npro,nsd,nsd),   dxidx(npro,nsd,nsd),
41859599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),  shg(npro,nshl,nsd),
41959599516SKenneth E. Jansen     &          shp(nshl,ngauss),
42059599516SKenneth E. Jansen     &          fresli(npro,22),       Qwtf(ngaussf),
42159599516SKenneth E. Jansen     &          strnrmi(npro)
42259599516SKenneth E. Jansen
42359599516SKenneth E. Jansen      dimension tmp(npro)
42459599516SKenneth E. Jansen
42559599516SKenneth E. Jansen      call local (y,      yl,     ien,    5,  'gather  ')
42659599516SKenneth E. Jansen      call localx (x,      xl,     ien,    3,  'gather  ')
42759599516SKenneth E. Jansenc
42859599516SKenneth E. Jansen
42959599516SKenneth E. Jansen      fresl = zero
43059599516SKenneth E. Jansen
43159599516SKenneth E. Jansenc
43259599516SKenneth E. Jansen      do intp = 1, ngaussf   ! Loop over quadrature points
43359599516SKenneth E. Jansen
43459599516SKenneth E. Jansenc  calculate the metrics
43559599516SKenneth E. Jansenc
43659599516SKenneth E. Jansenc
43759599516SKenneth E. Jansenc.... --------------------->  Element Metrics  <-----------------------
43859599516SKenneth E. Jansenc
43959599516SKenneth E. Jansenc.... compute the deformation gradient
44059599516SKenneth E. Jansenc
44159599516SKenneth E. Jansen         dxdxi = zero
44259599516SKenneth E. Jansenc
44359599516SKenneth E. Jansen         do n = 1, nenl
44459599516SKenneth E. Jansen            dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(1,n,intp)
44559599516SKenneth E. Jansen            dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(2,n,intp)
44659599516SKenneth E. Jansen            dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(3,n,intp)
44759599516SKenneth E. Jansen            dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(1,n,intp)
44859599516SKenneth E. Jansen            dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(2,n,intp)
44959599516SKenneth E. Jansen            dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(3,n,intp)
45059599516SKenneth E. Jansen            dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(1,n,intp)
45159599516SKenneth E. Jansen            dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(2,n,intp)
45259599516SKenneth E. Jansen            dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(3,n,intp)
45359599516SKenneth E. Jansen         enddo
45459599516SKenneth E. Jansenc
45559599516SKenneth E. Jansenc.... compute the inverse of deformation gradient
45659599516SKenneth E. Jansenc
45759599516SKenneth E. Jansen         dxidx(:,1,1) =   dxdxi(:,2,2) * dxdxi(:,3,3)
45859599516SKenneth E. Jansen     &        - dxdxi(:,3,2) * dxdxi(:,2,3)
45959599516SKenneth E. Jansen         dxidx(:,1,2) =   dxdxi(:,3,2) * dxdxi(:,1,3)
46059599516SKenneth E. Jansen     &        - dxdxi(:,1,2) * dxdxi(:,3,3)
46159599516SKenneth E. Jansen         dxidx(:,1,3) =   dxdxi(:,1,2) * dxdxi(:,2,3)
46259599516SKenneth E. Jansen     &        - dxdxi(:,1,3) * dxdxi(:,2,2)
46359599516SKenneth E. Jansen         tmp          = one / ( dxidx(:,1,1) * dxdxi(:,1,1)
46459599516SKenneth E. Jansen     &        + dxidx(:,1,2) * dxdxi(:,2,1)
46559599516SKenneth E. Jansen     &        + dxidx(:,1,3) * dxdxi(:,3,1) )
46659599516SKenneth E. Jansen         dxidx(:,1,1) = dxidx(:,1,1) * tmp
46759599516SKenneth E. Jansen         dxidx(:,1,2) = dxidx(:,1,2) * tmp
46859599516SKenneth E. Jansen         dxidx(:,1,3) = dxidx(:,1,3) * tmp
46959599516SKenneth E. Jansen         dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1)
47059599516SKenneth E. Jansen     &        - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp
47159599516SKenneth E. Jansen         dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3)
47259599516SKenneth E. Jansen     &        - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp
47359599516SKenneth E. Jansen         dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3)
47459599516SKenneth E. Jansen     &        - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp
47559599516SKenneth E. Jansen         dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2)
47659599516SKenneth E. Jansen     &        - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp
47759599516SKenneth E. Jansen         dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2)
47859599516SKenneth E. Jansen     &        - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp
47959599516SKenneth E. Jansen         dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2)
48059599516SKenneth E. Jansen     &        - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp
48159599516SKenneth E. Jansenc
48259599516SKenneth E. Jansenc         wght=Qwt(lcsyst,intp)  ! may be different now
48359599516SKenneth E. Jansen         wght=Qwtf(intp)
48459599516SKenneth E. Jansen         WdetJ(:) = wght / tmp(:)
48559599516SKenneth E. Jansen
48659599516SKenneth E. Jansen
48759599516SKenneth E. Jansenc... compute the gradient of shape functions at the quad. point.
48859599516SKenneth E. Jansen
48959599516SKenneth E. Jansen
49059599516SKenneth E. Jansen      do n = 1,nshl
49159599516SKenneth E. Jansen        shg(:,n,1) = (shgl(1,n,intp) * dxidx(:,1,1)
49259599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,1)
49359599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,1))
49459599516SKenneth E. Jansen        shg(:,n,2) = (shgl(1,n,intp) * dxidx(:,1,2)
49559599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,2)
49659599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,2))
49759599516SKenneth E. Jansen        shg(:,n,3) = (shgl(1,n,intp) * dxidx(:,1,3)
49859599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,3)
49959599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,3))
50059599516SKenneth E. Jansen      enddo
50159599516SKenneth E. Jansen
50259599516SKenneth E. Jansen
50359599516SKenneth E. Jansenc... compute the velocities and the strain rate tensor at the quad. point
50459599516SKenneth E. Jansen
50559599516SKenneth E. Jansen
50659599516SKenneth E. Jansen         u1  = zero
50759599516SKenneth E. Jansen         u2  = zero
50859599516SKenneth E. Jansen         u3  = zero
50959599516SKenneth E. Jansen         S11 = zero
51059599516SKenneth E. Jansen         S22 = zero
51159599516SKenneth E. Jansen         S33 = zero
51259599516SKenneth E. Jansen         S12 = zero
51359599516SKenneth E. Jansen         S13 = zero
51459599516SKenneth E. Jansen         S23 = zero
51559599516SKenneth E. Jansen         do i=1,nshl
51659599516SKenneth E. Jansen            u1 = u1 + shp(i,intp)*yl(:,i,2)
51759599516SKenneth E. Jansen            u2 = u2 + shp(i,intp)*yl(:,i,3)
51859599516SKenneth E. Jansen            u3 = u3 + shp(i,intp)*yl(:,i,4)
51959599516SKenneth E. Jansen
52059599516SKenneth E. Jansen            S11 = S11 + shg(:,i,1)*yl(:,i,2)
52159599516SKenneth E. Jansen            S22 = S22 + shg(:,i,2)*yl(:,i,3)
52259599516SKenneth E. Jansen            S33 = S33 + shg(:,i,3)*yl(:,i,4)
52359599516SKenneth E. Jansen
52459599516SKenneth E. Jansen            S12 = S12 + shg(:,i,2)*yl(:,i,2)
52559599516SKenneth E. Jansen     &                       +shg(:,i,1)*yl(:,i,3)
52659599516SKenneth E. Jansen            S13 = S13 + shg(:,i,3)*yl(:,i,2)
52759599516SKenneth E. Jansen     &                       +shg(:,i,1)*yl(:,i,4)
52859599516SKenneth E. Jansen            S23 = S23 + shg(:,i,3)*yl(:,i,3)
52959599516SKenneth E. Jansen     &                       +shg(:,i,2)*yl(:,i,4)
53059599516SKenneth E. Jansen         enddo
53159599516SKenneth E. Jansen         S12 = pt5 * S12
53259599516SKenneth E. Jansen         S13 = pt5 * S13
53359599516SKenneth E. Jansen         S23 = pt5 * S23
53459599516SKenneth E. Jansen
53559599516SKenneth E. Jansenc... Get the strain rate norm at the quad pts
53659599516SKenneth E. Jansen
53759599516SKenneth E. Jansen         strnrmi = sqrt( two*(S11**2 + S22**2 + S33**2)
53859599516SKenneth E. Jansen     &        + four*(S12**2 + S13**2 + S23**2) )
53959599516SKenneth E. Jansen
54059599516SKenneth E. Jansen
54159599516SKenneth E. Jansenc... Multiply quantities to be filtered by the box kernel
54259599516SKenneth E. Jansen
54359599516SKenneth E. Jansen         fresli(:,1) = WdetJ * u1 !G * u1 * WdetJ
54459599516SKenneth E. Jansen         fresli(:,2) = WdetJ * u2 !G * u2 * WdetJ
54559599516SKenneth E. Jansen         fresli(:,3) = WdetJ * u3 !G * u3 * WdetJ
54659599516SKenneth E. Jansen
54759599516SKenneth E. Jansen         fresli(:,4) = WdetJ * u1 * u1 ! G*u1*u1*WdetJ
54859599516SKenneth E. Jansen         fresli(:,5) = WdetJ * u2 * u2 ! G*u2*u2*WdetJ
54959599516SKenneth E. Jansen         fresli(:,6) = WdetJ * u3 * u3 ! G*u3*u3*WdetJ
55059599516SKenneth E. Jansen         fresli(:,7) = WdetJ * u1 * u2 ! G*u1*u2*WdetJ
55159599516SKenneth E. Jansen         fresli(:,8) = WdetJ * u1 * u3 ! G*u1*u3*WdetJ
55259599516SKenneth E. Jansen         fresli(:,9) = WdetJ * u2 * u3 ! G*u2*u3*WdetJ
55359599516SKenneth E. Jansen
55459599516SKenneth E. Jansen         fresli(:,10) = S11 * WdetJ ! G*S_{1,1}*WdetJ
55559599516SKenneth E. Jansen         fresli(:,11) = S22 * WdetJ ! G*S_{2,2}*WdetJ
55659599516SKenneth E. Jansen         fresli(:,12) = S33 * WdetJ ! G*S_{3,3}*WdetJ
55759599516SKenneth E. Jansen         fresli(:,13) = S12 * WdetJ ! G*S_{1,1}*WdetJ
55859599516SKenneth E. Jansen         fresli(:,14) = S13 * WdetJ ! G*S_{1,3}*WdetJ
55959599516SKenneth E. Jansen         fresli(:,15) = S23 * WdetJ ! G*S_{2,3}*WdetJ
56059599516SKenneth E. Jansen
56159599516SKenneth E. Jansen         fresli(:,16) = WdetJ !Integral of filter kernel, G,
56259599516SKenneth E. Jansenc                                               over the element
56359599516SKenneth E. Jansen
56459599516SKenneth E. Jansen         fresli(:,17) = S11 * strnrmi * WdetJ
56559599516SKenneth E. Jansen         fresli(:,18) = S22 * strnrmi * WdetJ
56659599516SKenneth E. Jansen         fresli(:,19) = S33 * strnrmi * WdetJ
56759599516SKenneth E. Jansen         fresli(:,20) = S12 * strnrmi * WdetJ
56859599516SKenneth E. Jansen         fresli(:,21) = S13 * strnrmi * WdetJ
56959599516SKenneth E. Jansen         fresli(:,22) = S23 * strnrmi * WdetJ
57059599516SKenneth E. Jansen
57159599516SKenneth E. Jansen
57259599516SKenneth E. Jansen         do i = 1, 22           ! Add contribution of each quad. point
57359599516SKenneth E. Jansen            fresl(:,i) = fresl(:,i) + fresli(:,i)
57459599516SKenneth E. Jansen         enddo
57559599516SKenneth E. Jansen
57659599516SKenneth E. Jansen      enddo                     !end of loop over integration points
57759599516SKenneth E. Jansenc
57859599516SKenneth E. Jansen
57959599516SKenneth E. Jansen      do j = 1,nshl
58059599516SKenneth E. Jansen      do nel = 1,npro
58159599516SKenneth E. Jansen        hfres(ien(nel,j),:) = hfres(ien(nel,j),:) + fresl(nel,:)
58259599516SKenneth E. Jansen      enddo
58359599516SKenneth E. Jansen      enddo
58459599516SKenneth E. Jansen
58559599516SKenneth E. Jansen
58659599516SKenneth E. Jansen      return
58759599516SKenneth E. Jansen      end
58859599516SKenneth E. Jansen
58959599516SKenneth E. Jansen
59059599516SKenneth E. Jansenc... Here, the filter operation (denoted w/ a tilde) uses the generalized
59159599516SKenneth E. Jansenc... box kernel.
59259599516SKenneth E. Jansen
59359599516SKenneth E. Jansen      subroutine twohfilterBB (y, x, strnrm, ien, fres,
59459599516SKenneth E. Jansen     &     hfres, shgl, shp, Qwtf)
59559599516SKenneth E. Jansen
59659599516SKenneth E. Jansen      include "common.h"
59759599516SKenneth E. Jansen
59859599516SKenneth E. Jansen      dimension y(nshg,ndof),            fres(nshg,33)
59959599516SKenneth E. Jansen      dimension x(numnp,nsd),            xl(npro,nenl,nsd)
60059599516SKenneth E. Jansen      dimension ien(npro,nshl),        yl(npro,nshl,ndof),
60159599516SKenneth E. Jansen     &          fresl(npro,33),        WdetJ(npro),
60259599516SKenneth E. Jansen     &          u1(npro),              u2(npro),
60359599516SKenneth E. Jansen     &          u3(npro),              dxdxi(npro,nsd,nsd),
60459599516SKenneth E. Jansen     &          strnrm(npro,ngauss),    dxidx(npro,nsd,nsd),
60559599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),       shg(npro,nshl,nsd),
60659599516SKenneth E. Jansen     &          shp(nshl,ngauss),
60759599516SKenneth E. Jansen     &          fresli(npro,33),       Qwtf(ngaussf),
60859599516SKenneth E. Jansen     &          hfres(nshg,22),        hfresl(npro,nshl,22),
60959599516SKenneth E. Jansen     &          S(npro,nshl),          SS11(npro,nshl),
61059599516SKenneth E. Jansen     &          SS22(npro,nshl),       SS33(npro,nshl),
61159599516SKenneth E. Jansen     &          SS12(npro,nshl),       SS13(npro,nshl),
61259599516SKenneth E. Jansen     &          SS23(npro,nshl)
61359599516SKenneth E. Jansen
61459599516SKenneth E. Jansen      dimension tmp(npro)
61559599516SKenneth E. Jansen
61659599516SKenneth E. Jansen      call local (y,      yl,     ien,    5,  'gather  ')
61759599516SKenneth E. Jansen      call localx (x,      xl,     ien,    3,  'gather  ')
61859599516SKenneth E. Jansen      call local (hfres,  hfresl, ien,   22,  'gather  ')
61959599516SKenneth E. Jansen
62059599516SKenneth E. Jansen      S(:,:) = sqrt(
62159599516SKenneth E. Jansen     &     two*(hfresl(:,:,10)**2 + hfresl(:,:,11)**2 +
62259599516SKenneth E. Jansen     &     hfresl(:,:,12)**2) + four*(
62359599516SKenneth E. Jansen     &     hfresl(:,:,13)**2 + hfresl(:,:,14)**2 +
62459599516SKenneth E. Jansen     &     hfresl(:,:,15)**2) )
62559599516SKenneth E. Jansen
62659599516SKenneth E. Jansen      SS11(:,:) = S(:,:)*hfresl(:,:,10)
62759599516SKenneth E. Jansen      SS22(:,:) = S(:,:)*hfresl(:,:,11)
62859599516SKenneth E. Jansen      SS33(:,:) = S(:,:)*hfresl(:,:,12)
62959599516SKenneth E. Jansen      SS12(:,:) = S(:,:)*hfresl(:,:,13)
63059599516SKenneth E. Jansen      SS13(:,:) = S(:,:)*hfresl(:,:,14)
63159599516SKenneth E. Jansen      SS23(:,:) = S(:,:)*hfresl(:,:,15)
63259599516SKenneth E. Jansen
63359599516SKenneth E. Jansen      fresl = zero
63459599516SKenneth E. Jansen
63559599516SKenneth E. Jansen      do intp = 1, ngaussf
63659599516SKenneth E. Jansen
63759599516SKenneth E. Jansen
63859599516SKenneth E. Jansenc  calculate the metrics
63959599516SKenneth E. Jansenc
64059599516SKenneth E. Jansenc
64159599516SKenneth E. Jansenc.... --------------------->  Element Metrics  <-----------------------
64259599516SKenneth E. Jansenc
64359599516SKenneth E. Jansenc.... compute the deformation gradient
64459599516SKenneth E. Jansenc
64559599516SKenneth E. Jansen        dxdxi = zero
64659599516SKenneth E. Jansenc
64759599516SKenneth E. Jansen          do n = 1, nenl
64859599516SKenneth E. Jansen            dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(1,n,intp)
64959599516SKenneth E. Jansen            dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(2,n,intp)
65059599516SKenneth E. Jansen            dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(3,n,intp)
65159599516SKenneth E. Jansen            dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(1,n,intp)
65259599516SKenneth E. Jansen            dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(2,n,intp)
65359599516SKenneth E. Jansen            dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(3,n,intp)
65459599516SKenneth E. Jansen            dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(1,n,intp)
65559599516SKenneth E. Jansen            dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(2,n,intp)
65659599516SKenneth E. Jansen            dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(3,n,intp)
65759599516SKenneth E. Jansen          enddo
65859599516SKenneth E. Jansenc
65959599516SKenneth E. Jansenc.... compute the inverse of deformation gradient
66059599516SKenneth E. Jansenc
66159599516SKenneth E. Jansen        dxidx(:,1,1) =   dxdxi(:,2,2) * dxdxi(:,3,3)
66259599516SKenneth E. Jansen     &                 - dxdxi(:,3,2) * dxdxi(:,2,3)
66359599516SKenneth E. Jansen        dxidx(:,1,2) =   dxdxi(:,3,2) * dxdxi(:,1,3)
66459599516SKenneth E. Jansen     &                 - dxdxi(:,1,2) * dxdxi(:,3,3)
66559599516SKenneth E. Jansen        dxidx(:,1,3) =   dxdxi(:,1,2) * dxdxi(:,2,3)
66659599516SKenneth E. Jansen     &                 - dxdxi(:,1,3) * dxdxi(:,2,2)
66759599516SKenneth E. Jansen        tmp          = one / ( dxidx(:,1,1) * dxdxi(:,1,1)
66859599516SKenneth E. Jansen     &                       + dxidx(:,1,2) * dxdxi(:,2,1)
66959599516SKenneth E. Jansen     &                       + dxidx(:,1,3) * dxdxi(:,3,1) )
67059599516SKenneth E. Jansen        dxidx(:,1,1) = dxidx(:,1,1) * tmp
67159599516SKenneth E. Jansen        dxidx(:,1,2) = dxidx(:,1,2) * tmp
67259599516SKenneth E. Jansen        dxidx(:,1,3) = dxidx(:,1,3) * tmp
67359599516SKenneth E. Jansen        dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1)
67459599516SKenneth E. Jansen     &                - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp
67559599516SKenneth E. Jansen        dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3)
67659599516SKenneth E. Jansen     &                - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp
67759599516SKenneth E. Jansen        dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3)
67859599516SKenneth E. Jansen     &                - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp
67959599516SKenneth E. Jansen        dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2)
68059599516SKenneth E. Jansen     &                - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp
68159599516SKenneth E. Jansen        dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2)
68259599516SKenneth E. Jansen     &                - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp
68359599516SKenneth E. Jansen        dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2)
68459599516SKenneth E. Jansen     &                - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp
68559599516SKenneth E. Jansenc
68659599516SKenneth E. Jansenc        wght=Qwt(lcsyst,intp)  ! may be different now
68759599516SKenneth E. Jansen        wght=Qwtf(intp)
68859599516SKenneth E. Jansen        WdetJ = wght / tmp
68959599516SKenneth E. Jansenc
69059599516SKenneth E. Jansen
69159599516SKenneth E. Jansen      do n = 1,nshl
69259599516SKenneth E. Jansen        shg(:,n,1) = (shgl(1,n,intp) * dxidx(:,1,1)
69359599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,1)
69459599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,1))
69559599516SKenneth E. Jansen        shg(:,n,2) = (shgl(1,n,intp) * dxidx(:,1,2)
69659599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,2)
69759599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,2))
69859599516SKenneth E. Jansen        shg(:,n,3) = (shgl(1,n,intp) * dxidx(:,1,3)
69959599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,3)
70059599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,3))
70159599516SKenneth E. Jansen      enddo
70259599516SKenneth E. Jansen
70359599516SKenneth E. Jansenc... compute filtered quantities at the hat level evaluated at the quad. pt.
70459599516SKenneth E. Jansenc... This should really
70559599516SKenneth E. Jansenc... be the bar-hat level, but the bar filter is implicit so we don't
70659599516SKenneth E. Jansenc... bother to mention it.
70759599516SKenneth E. Jansen
70859599516SKenneth E. Jansen      fresli = zero
70959599516SKenneth E. Jansen      S11p   = zero
71059599516SKenneth E. Jansen      S22p   = zero
71159599516SKenneth E. Jansen      S33p   = zero
71259599516SKenneth E. Jansen      S12p   = zero
71359599516SKenneth E. Jansen      S13p   = zero
71459599516SKenneth E. Jansen      S23p   = zero
71559599516SKenneth E. Jansen
71659599516SKenneth E. Jansen      do i = 1, nenl
71759599516SKenneth E. Jansen         fresli(:,1) = fresli(:,1) + shp(i,intp)*hfresl(:,i,1)  ! hat{u1}
71859599516SKenneth E. Jansen         fresli(:,2) = fresli(:,2) + shp(i,intp)*hfresl(:,i,2)  ! hat{u2}
71959599516SKenneth E. Jansen         fresli(:,3) = fresli(:,3) + shp(i,intp)*hfresl(:,i,3)  ! hat{u3}
72059599516SKenneth E. Jansen
72159599516SKenneth E. Jansen         fresli(:,4) = fresli(:,4) + shp(i,intp)*hfresl(:,i,4) ! hat{u1*u1}
72259599516SKenneth E. Jansen         fresli(:,5) = fresli(:,5) + shp(i,intp)*hfresl(:,i,5) ! hat{u2*u2}
72359599516SKenneth E. Jansen         fresli(:,6) = fresli(:,6) + shp(i,intp)*hfresl(:,i,6) ! hat{u3*u3}
72459599516SKenneth E. Jansen         fresli(:,7) = fresli(:,7) + shp(i,intp)*hfresl(:,i,7) ! hat{u1*u2}
72559599516SKenneth E. Jansen         fresli(:,8) = fresli(:,8) + shp(i,intp)*hfresl(:,i,8) ! hat{u1*u3}
72659599516SKenneth E. Jansen         fresli(:,9) = fresli(:,9) + shp(i,intp)*hfresl(:,i,9) ! hat{u2*u3}
72759599516SKenneth E. Jansen
72859599516SKenneth E. Jansen         fresli(:,10) = fresli(:,10) + shp(i,intp)*hfresl(:,i,10)  ! hat{S11}
72959599516SKenneth E. Jansen         fresli(:,11) = fresli(:,11) + shp(i,intp)*hfresl(:,i,11)  ! hat{S22}
73059599516SKenneth E. Jansen         fresli(:,12) = fresli(:,12) + shp(i,intp)*hfresl(:,i,12)  ! hat{S33}
73159599516SKenneth E. Jansen         fresli(:,13) = fresli(:,13) + shp(i,intp)*hfresl(:,i,13)  ! hat{S12}
73259599516SKenneth E. Jansen         fresli(:,14) = fresli(:,14) + shp(i,intp)*hfresl(:,i,14)  ! hat{S13}
73359599516SKenneth E. Jansen         fresli(:,15) = fresli(:,15) + shp(i,intp)*hfresl(:,i,15)  ! hat{S23}
73459599516SKenneth E. Jansen
73559599516SKenneth E. Jansen         fresli(:,16) = fresli(:,16) +shp(i,intp)*hfresl(:,i,17)! hat{S11*|S|}
73659599516SKenneth E. Jansen         fresli(:,17) = fresli(:,17) +shp(i,intp)*hfresl(:,i,18)! hat{S22*|S|}
73759599516SKenneth E. Jansen         fresli(:,18) = fresli(:,18) +shp(i,intp)*hfresl(:,i,19)! hat{S33*|S|}
73859599516SKenneth E. Jansen         fresli(:,19) = fresli(:,19) +shp(i,intp)*hfresl(:,i,20)! hat{S12*|S|}
73959599516SKenneth E. Jansen         fresli(:,20) = fresli(:,20) +shp(i,intp)*hfresl(:,i,21)! hat{S13*|S|}
74059599516SKenneth E. Jansen         fresli(:,21) = fresli(:,21) +shp(i,intp)*hfresl(:,i,22)! hat{S23*|S|}
74159599516SKenneth E. Jansen
74259599516SKenneth E. Jansen
74359599516SKenneth E. Jansen      enddo
74459599516SKenneth E. Jansen
74559599516SKenneth E. Jansenc... multiply fresli by WdetJ so that when we finish looping over
74659599516SKenneth E. Jansenc... quad. pts. and add the contributions from all the quad. points
74759599516SKenneth E. Jansenc... we get filtered quantities at the hat-tilde level, secretly the
74859599516SKenneth E. Jansenc... bar-hat-tilde level.
74959599516SKenneth E. Jansen
75059599516SKenneth E. Jansen      do j = 1, 21
75159599516SKenneth E. Jansen         fresli(:,j) = fresli(:,j)*WdetJ(:)
75259599516SKenneth E. Jansen      enddo
75359599516SKenneth E. Jansen
75459599516SKenneth E. Jansenc... compute volume of box kernel
75559599516SKenneth E. Jansen
75659599516SKenneth E. Jansen      fresli(:,22) = WdetJ
75759599516SKenneth E. Jansen
75859599516SKenneth E. Jansenc... add contributions from each quad pt to current element
75959599516SKenneth E. Jansen
76059599516SKenneth E. Jansen      do i = 1, 22
76159599516SKenneth E. Jansen         fresl(:,i) = fresl(:,i) + fresli(:,i)
76259599516SKenneth E. Jansen      enddo
76359599516SKenneth E. Jansen
76459599516SKenneth E. Jansen      enddo ! end of loop over integration points
76559599516SKenneth E. Jansen
76659599516SKenneth E. Jansen
76759599516SKenneth E. Jansenc... scatter locally filtered quantities to the global nodes
76859599516SKenneth E. Jansen
76959599516SKenneth E. Jansen      do j = 1,nshl
77059599516SKenneth E. Jansen      do nel = 1,npro
77159599516SKenneth E. Jansen        fres(ien(nel,j),:) = fres(ien(nel,j),:) + fresl(nel,:)
77259599516SKenneth E. Jansen      enddo
77359599516SKenneth E. Jansen      enddo
77459599516SKenneth E. Jansen
77559599516SKenneth E. Jansen      return
77659599516SKenneth E. Jansen      end
77759599516SKenneth E. Jansen
77859599516SKenneth E. Jansen
77959599516SKenneth E. Jansenc...  The filter operator used here uses the generalized hat (witch hat)
78059599516SKenneth E. Jansenc...  kernel
78159599516SKenneth E. Jansen
78259599516SKenneth E. Jansen      subroutine hfilterBB (y, x, ien, hfres, shgl, shp, Qwtf)
78359599516SKenneth E. Jansen
78459599516SKenneth E. Jansen      include "common.h"
78559599516SKenneth E. Jansen
78659599516SKenneth E. Jansen      dimension y(nshg,5),             hfres(nshg,24)
78759599516SKenneth E. Jansen      dimension x(numnp,3),            xl(npro,nenl,3)
78859599516SKenneth E. Jansen      dimension ien(npro,nshl),        yl(npro,nshl,5),
78959599516SKenneth E. Jansen     &          fresl(npro,nshl,24),        WdetJ(npro),
79059599516SKenneth E. Jansen     &          u1(npro),              u2(npro),
79159599516SKenneth E. Jansen     &          u3(npro),              rho(npro),
79259599516SKenneth E. Jansen     &          S11(npro),             S22(npro),
79359599516SKenneth E. Jansen     &          S33(npro),             S12(npro),
79459599516SKenneth E. Jansen     &          S13(npro),             S23(npro),
79559599516SKenneth E. Jansen     &          dxdxi(npro,nsd,nsd),   dxidx(npro,nsd,nsd),
79659599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),       shg(npro,nshl,nsd),
79759599516SKenneth E. Jansen     &          shp(nshl,ngauss),
79859599516SKenneth E. Jansen     &          fresli(npro,nshl,24),   Qwtf(ngaussf),
79959599516SKenneth E. Jansen     &          strnrmi(npro)
80059599516SKenneth E. Jansen
80159599516SKenneth E. Jansen
80259599516SKenneth E. Jansen      dimension tmp(npro)
80359599516SKenneth E. Jansen
80459599516SKenneth E. Jansen      call local (y,      yl,     ien,    5,  'gather  ')
80559599516SKenneth E. Jansen      call localx (x,      xl,     ien,    3,  'gather  ')
80659599516SKenneth E. Jansenc
80759599516SKenneth E. Jansen
80859599516SKenneth E. Jansen      fresl = zero
80959599516SKenneth E. Jansen
81059599516SKenneth E. Jansenc
81159599516SKenneth E. Jansen      do intp = 1, ngaussf   ! Loop over quadrature points
81259599516SKenneth E. Jansen
81359599516SKenneth E. Jansenc  calculate the metrics
81459599516SKenneth E. Jansenc
81559599516SKenneth E. Jansenc
81659599516SKenneth E. Jansenc.... --------------------->  Element Metrics  <-----------------------
81759599516SKenneth E. Jansenc
81859599516SKenneth E. Jansenc.... compute the deformation gradient
81959599516SKenneth E. Jansenc
82059599516SKenneth E. Jansen         dxdxi = zero
82159599516SKenneth E. Jansenc
82259599516SKenneth E. Jansen         do n = 1, nenl
82359599516SKenneth E. Jansen            dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(1,n,intp)
82459599516SKenneth E. Jansen            dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(2,n,intp)
82559599516SKenneth E. Jansen            dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(3,n,intp)
82659599516SKenneth E. Jansen            dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(1,n,intp)
82759599516SKenneth E. Jansen            dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(2,n,intp)
82859599516SKenneth E. Jansen            dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(3,n,intp)
82959599516SKenneth E. Jansen            dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(1,n,intp)
83059599516SKenneth E. Jansen            dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(2,n,intp)
83159599516SKenneth E. Jansen            dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(3,n,intp)
83259599516SKenneth E. Jansen         enddo
83359599516SKenneth E. Jansenc
83459599516SKenneth E. Jansenc.... compute the inverse of deformation gradient
83559599516SKenneth E. Jansenc
83659599516SKenneth E. Jansen         dxidx(:,1,1) =   dxdxi(:,2,2) * dxdxi(:,3,3)
83759599516SKenneth E. Jansen     &        - dxdxi(:,3,2) * dxdxi(:,2,3)
83859599516SKenneth E. Jansen         dxidx(:,1,2) =   dxdxi(:,3,2) * dxdxi(:,1,3)
83959599516SKenneth E. Jansen     &        - dxdxi(:,1,2) * dxdxi(:,3,3)
84059599516SKenneth E. Jansen         dxidx(:,1,3) =   dxdxi(:,1,2) * dxdxi(:,2,3)
84159599516SKenneth E. Jansen     &        - dxdxi(:,1,3) * dxdxi(:,2,2)
84259599516SKenneth E. Jansen         tmp          = one / ( dxidx(:,1,1) * dxdxi(:,1,1)
84359599516SKenneth E. Jansen     &        + dxidx(:,1,2) * dxdxi(:,2,1)
84459599516SKenneth E. Jansen     &        + dxidx(:,1,3) * dxdxi(:,3,1) )
84559599516SKenneth E. Jansen         dxidx(:,1,1) = dxidx(:,1,1) * tmp
84659599516SKenneth E. Jansen         dxidx(:,1,2) = dxidx(:,1,2) * tmp
84759599516SKenneth E. Jansen         dxidx(:,1,3) = dxidx(:,1,3) * tmp
84859599516SKenneth E. Jansen         dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1)
84959599516SKenneth E. Jansen     &        - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp
85059599516SKenneth E. Jansen         dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3)
85159599516SKenneth E. Jansen     &        - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp
85259599516SKenneth E. Jansen         dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3)
85359599516SKenneth E. Jansen     &        - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp
85459599516SKenneth E. Jansen         dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2)
85559599516SKenneth E. Jansen     &        - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp
85659599516SKenneth E. Jansen         dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2)
85759599516SKenneth E. Jansen     &        - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp
85859599516SKenneth E. Jansen         dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2)
85959599516SKenneth E. Jansen     &        - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp
86059599516SKenneth E. Jansenc
86159599516SKenneth E. Jansenc        wght=Qwt(lcsyst,intp)  ! may be different now
86259599516SKenneth E. Jansen         wght=Qwtf(intp)
86359599516SKenneth E. Jansen         WdetJ(:) = wght / tmp(:)
86459599516SKenneth E. Jansen
86559599516SKenneth E. Jansen
86659599516SKenneth E. Jansenc... compute the gradient of shape functions at the quad. point.
86759599516SKenneth E. Jansen
86859599516SKenneth E. Jansen
86959599516SKenneth E. Jansen      do n = 1,nshl
87059599516SKenneth E. Jansen        shg(:,n,1) = (shgl(1,n,intp) * dxidx(:,1,1)
87159599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,1)
87259599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,1))
87359599516SKenneth E. Jansen        shg(:,n,2) = (shgl(1,n,intp) * dxidx(:,1,2)
87459599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,2)
87559599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,2))
87659599516SKenneth E. Jansen        shg(:,n,3) = (shgl(1,n,intp) * dxidx(:,1,3)
87759599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,3)
87859599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,3))
87959599516SKenneth E. Jansen      enddo
88059599516SKenneth E. Jansen
88159599516SKenneth E. Jansen
88259599516SKenneth E. Jansenc... compute the velocities and the strain rate tensor at the quad. point
88359599516SKenneth E. Jansen
88459599516SKenneth E. Jansen
88559599516SKenneth E. Jansen         u1  = zero
88659599516SKenneth E. Jansen         u2  = zero
88759599516SKenneth E. Jansen         u3  = zero
88859599516SKenneth E. Jansen         S11 = zero
88959599516SKenneth E. Jansen         S22 = zero
89059599516SKenneth E. Jansen         S33 = zero
89159599516SKenneth E. Jansen         S12 = zero
89259599516SKenneth E. Jansen         S13 = zero
89359599516SKenneth E. Jansen         S23 = zero
89459599516SKenneth E. Jansen         do i=1,nshl
89559599516SKenneth E. Jansen            u1 = u1 + shp(i,intp)*yl(:,i,2)
89659599516SKenneth E. Jansen            u2 = u2 + shp(i,intp)*yl(:,i,3)
89759599516SKenneth E. Jansen            u3 = u3 + shp(i,intp)*yl(:,i,4)
89859599516SKenneth E. Jansen
89959599516SKenneth E. Jansen            S11 = S11 + shg(:,i,1)*yl(:,i,2)
90059599516SKenneth E. Jansen            S22 = S22 + shg(:,i,2)*yl(:,i,3)
90159599516SKenneth E. Jansen            S33 = S33 + shg(:,i,3)*yl(:,i,4)
90259599516SKenneth E. Jansen
90359599516SKenneth E. Jansen            S12 = S12 + shg(:,i,2)*yl(:,i,2)
90459599516SKenneth E. Jansen     &                       +shg(:,i,1)*yl(:,i,3)
90559599516SKenneth E. Jansen            S13 = S13 + shg(:,i,3)*yl(:,i,2)
90659599516SKenneth E. Jansen     &                       +shg(:,i,1)*yl(:,i,4)
90759599516SKenneth E. Jansen            S23 = S23 + shg(:,i,3)*yl(:,i,3)
90859599516SKenneth E. Jansen     &                       +shg(:,i,2)*yl(:,i,4)
90959599516SKenneth E. Jansen         enddo
91059599516SKenneth E. Jansen         S12 = pt5 * S12
91159599516SKenneth E. Jansen         S13 = pt5 * S13
91259599516SKenneth E. Jansen         S23 = pt5 * S23
91359599516SKenneth E. Jansen
91459599516SKenneth E. Jansenc... Get the strain rate norm at the quad pts
91559599516SKenneth E. Jansen
91659599516SKenneth E. Jansen         strnrmi = sqrt( two*(S11**2 + S22**2 + S33**2)
91759599516SKenneth E. Jansen     &        + four*(S12**2 + S13**2 + S23**2) )
91859599516SKenneth E. Jansen
91959599516SKenneth E. Jansen
92059599516SKenneth E. Jansenc... Loop over element nodes and multiply u_{i} and S_{i,j} by the
92159599516SKenneth E. Jansenc... hat kernel and the Jacobian over the current element evaluated at
92259599516SKenneth E. Jansenc... the current quad. point.
92359599516SKenneth E. Jansen
92459599516SKenneth E. Jansen         do i = 1, nenl   ! Loop over element nodes
92559599516SKenneth E. Jansen
92659599516SKenneth E. Jansen            fresli(:,i,1) = WdetJ * u1 * shp(i,intp) !G * u1 * WdetJ
92759599516SKenneth E. Jansen            fresli(:,i,2) = WdetJ * u2 * shp(i,intp) !G * u2 * WdetJ
92859599516SKenneth E. Jansen            fresli(:,i,3) = WdetJ * u3 * shp(i,intp) !G * u3 * WdetJ
92959599516SKenneth E. Jansen
93059599516SKenneth E. Jansen            fresli(:,i,4) = WdetJ * u1 * u1 * shp(i,intp) ! G*u1*u1*WdetJ
93159599516SKenneth E. Jansen            fresli(:,i,5) = WdetJ * u2 * u2 * shp(i,intp) ! G*u2*u2*WdetJ
93259599516SKenneth E. Jansen            fresli(:,i,6) = WdetJ * u3 * u3 * shp(i,intp) ! G*u3*u3*WdetJ
93359599516SKenneth E. Jansen            fresli(:,i,7) = WdetJ * u1 * u2 * shp(i,intp) ! G*u1*u2*WdetJ
93459599516SKenneth E. Jansen            fresli(:,i,8) = WdetJ * u1 * u3 * shp(i,intp) ! G*u1*u3*WdetJ
93559599516SKenneth E. Jansen            fresli(:,i,9) = WdetJ * u2 * u3 * shp(i,intp) ! G*u2*u3*WdetJ
93659599516SKenneth E. Jansen
93759599516SKenneth E. Jansen            fresli(:,i,10) = S11 * shp(i,intp) * WdetJ ! G*S_{1,1}*WdetJ
93859599516SKenneth E. Jansen            fresli(:,i,11) = S22 * shp(i,intp) * WdetJ ! G*S_{2,2}*WdetJ
93959599516SKenneth E. Jansen            fresli(:,i,12) = S33 * shp(i,intp) * WdetJ ! G*S_{3,3}*WdetJ
94059599516SKenneth E. Jansen            fresli(:,i,13) = S12 * shp(i,intp) * WdetJ ! G*S_{1,1}*WdetJ
94159599516SKenneth E. Jansen            fresli(:,i,14) = S13 * shp(i,intp) * WdetJ ! G*S_{1,3}*WdetJ
94259599516SKenneth E. Jansen            fresli(:,i,15) = S23 * shp(i,intp) * WdetJ ! G*S_{2,3}*WdetJ
94359599516SKenneth E. Jansen
94459599516SKenneth E. Jansen            fresli(:,i,22) = WdetJ*shp(i,intp) !Integral of filter kernel, G,
94559599516SKenneth E. Jansenc                                               over the element
94659599516SKenneth E. Jansen
94759599516SKenneth E. Jansenc...   Get G*|S|*S_{i,j}*WdetJ
94859599516SKenneth E. Jansen
94959599516SKenneth E. Jansen            fresli(:,i,16) = S11 * strnrmi * shp(i,intp) * WdetJ
95059599516SKenneth E. Jansen            fresli(:,i,17) = S22 * strnrmi * shp(i,intp) * WdetJ
95159599516SKenneth E. Jansen            fresli(:,i,18) = S33 * strnrmi * shp(i,intp) * WdetJ
95259599516SKenneth E. Jansen            fresli(:,i,19) = S12 * strnrmi * shp(i,intp) * WdetJ
95359599516SKenneth E. Jansen            fresli(:,i,20) = S13 * strnrmi * shp(i,intp) * WdetJ
95459599516SKenneth E. Jansen            fresli(:,i,21) = S23 * strnrmi * shp(i,intp) * WdetJ
95559599516SKenneth E. Jansen
95659599516SKenneth E. Jansen            do j = 1, 22 ! Add contribution of each quad. point for each
95759599516SKenneth E. Jansenc                          element node
95859599516SKenneth E. Jansen               fresl(:,i,j) = fresl(:,i,j) + fresli(:,i,j)
95959599516SKenneth E. Jansen            enddo
96059599516SKenneth E. Jansen
96159599516SKenneth E. Jansen         enddo                  !end loop over element nodes
96259599516SKenneth E. Jansen
96359599516SKenneth E. Jansen      enddo                     !end of loop over integration points
96459599516SKenneth E. Jansen
96559599516SKenneth E. Jansen
96659599516SKenneth E. Jansen      call local (hfres, fresl, ien, 24, 'scatter ')
96759599516SKenneth E. Jansen
96859599516SKenneth E. Jansen      return
96959599516SKenneth E. Jansen      end
97059599516SKenneth E. Jansen
97159599516SKenneth E. Jansen      subroutine ediss (y,           ac,         shgl,
97259599516SKenneth E. Jansen     &                  shp,         iper,       ilwork,
97359599516SKenneth E. Jansen     &                  nsons,       ifath,      x,
97459599516SKenneth E. Jansen     &                  iBC,    BC,  xavegt)
97559599516SKenneth E. Jansen
97659599516SKenneth E. Jansen
97759599516SKenneth E. Jansen      use pvsQbi           ! brings in NABI
97859599516SKenneth E. Jansen      use stats            !
97959599516SKenneth E. Jansen      use pointer_data     ! brings in the pointers for the blocked arrays
98059599516SKenneth E. Jansen      use local_mass
98159599516SKenneth E. Jansen      use rlssave  ! Use the resolved Leonard stresses at the nodes.
98259599516SKenneth E. Jansen      use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
98359599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
98459599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
98559599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
98659599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
98759599516SKenneth E. Jansenc                    quad. points.
98859599516SKenneth E. Jansen
98959599516SKenneth E. Jansen
99059599516SKenneth E. Jansen
99159599516SKenneth E. Jansen      include "common.h"
99259599516SKenneth E. Jansen      include "mpif.h"
99359599516SKenneth E. Jansen      include "auxmpi.h"
99459599516SKenneth E. Jansen
99559599516SKenneth E. Jansen
99659599516SKenneth E. Jansen      dimension y(nshg,ndof),                  ac(nshg,ndof),
99759599516SKenneth E. Jansen     &          ifath(nshg),                   nsons(nshg),
99859599516SKenneth E. Jansen     &          iper(nshg),                    ilwork(nlwork),
99959599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
100059599516SKenneth E. Jansen     &          x(numnp,3),
100159599516SKenneth E. Jansen     &          qres(nshg,nsd*nsd),             rmass(nshg),
100259599516SKenneth E. Jansen     &          iBC(nshg),                      BC(nshg,ndofBC),
100359599516SKenneth E. Jansen     &          cdelsq(nshg),                   vol(nshg),
100459599516SKenneth E. Jansen     &          stress(nshg,9),                 diss(nshg,3),
100559599516SKenneth E. Jansen     &          xave(nshg,12),                  xaveg(nfath,12),
100659599516SKenneth E. Jansen     &          xavegr(nfath,12),           xavegt(nfath,12),
100759599516SKenneth E. Jansen     &          rnum(nfath),                rden(nfath)
100859599516SKenneth E. Jansen
100959599516SKenneth E. Jansen
101059599516SKenneth E. Jansenc.... First let us obtain cdelsq at each node in the domain.
101159599516SKenneth E. Jansenc.... We use numNden which lives in the quadfilt module.
101259599516SKenneth E. Jansen
101359599516SKenneth E. Jansen      rnum(ifath(:)) = numNden(:,1)
101459599516SKenneth E. Jansen      rden(ifath(:)) = numNden(:,2)
101559599516SKenneth E. Jansen
101659599516SKenneth E. Jansenc      if (myrank .eq. master) then
101759599516SKenneth E. Jansenc         write(*,*) 'rnum25=', rnum(25), rden(25)
101859599516SKenneth E. Jansenc         write(*,*) 'rnum26=', rnum(26), rden(26)
101959599516SKenneth E. Jansenc      endif
102059599516SKenneth E. Jansen
102159599516SKenneth E. Jansen      cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
102259599516SKenneth E. Jansenc      cdelsq(:) = zero ! Debugging
102359599516SKenneth E. Jansen
102459599516SKenneth E. Jansen      if (istep .eq. 0) then
102559599516SKenneth E. Jansen         xavegt = zero  ! For averaging dissipations and SUPG stresses
102659599516SKenneth E. Jansen      endif
102759599516SKenneth E. Jansen
102859599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3) then ! global reconstruction of qdiff
102959599516SKenneth E. Jansenc
103059599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
103159599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
103259599516SKenneth E. Jansenc
103359599516SKenneth E. Jansen           qres = zero
103459599516SKenneth E. Jansen           rmass = zero
103559599516SKenneth E. Jansen
103659599516SKenneth E. Jansen           do iblk = 1, nelblk
103759599516SKenneth E. Jansen              iel    = lcblk(1,iblk)
103859599516SKenneth E. Jansen              lelCat = lcblk(2,iblk)
103959599516SKenneth E. Jansen              lcsyst = lcblk(3,iblk)
104059599516SKenneth E. Jansen              iorder = lcblk(4,iblk)
104159599516SKenneth E. Jansen              nenl   = lcblk(5,iblk) ! no. of vertices per element
104259599516SKenneth E. Jansen              nshl   = lcblk(10,iblk)
104359599516SKenneth E. Jansen              mattyp = lcblk(7,iblk)
104459599516SKenneth E. Jansen              ndofl  = lcblk(8,iblk)
104559599516SKenneth E. Jansen              nsymdl = lcblk(9,iblk)
104659599516SKenneth E. Jansen              npro   = lcblk(1,iblk+1) - iel
104759599516SKenneth E. Jansen              ngauss = nint(lcsyst)
104859599516SKenneth E. Jansenc
104959599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
105059599516SKenneth E. Jansenc     and lumped mass matrix, rmass
105159599516SKenneth E. Jansen
105259599516SKenneth E. Jansen              call AsIq (y,                x,
105359599516SKenneth E. Jansen     &                   shp(lcsyst,1:nshl,:),
105459599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:),
105559599516SKenneth E. Jansen     &                   mien(iblk)%p,     mxmudmi(iblk)%p,
105659599516SKenneth E. Jansen     &                   qres,             rmass )
105759599516SKenneth E. Jansen           enddo
105859599516SKenneth E. Jansen
105959599516SKenneth E. Jansenc
106059599516SKenneth E. Jansenc.... form the diffusive flux approximation
106159599516SKenneth E. Jansenc
106259599516SKenneth E. Jansen           call qpbc( rmass, qres, iBC, BC, iper, ilwork )
106359599516SKenneth E. Jansenc
106459599516SKenneth E. Jansen        endif
106559599516SKenneth E. Jansen
106659599516SKenneth E. Jansen
106759599516SKenneth E. Jansenc.... form the SUPG stresses well as dissipation due to eddy viscosity,
106859599516SKenneth E. Jansenc...  and SUPG stabilization.
106959599516SKenneth E. Jansen
107059599516SKenneth E. Jansen
107159599516SKenneth E. Jansen        stress = zero
107259599516SKenneth E. Jansen        vol    = zero
107359599516SKenneth E. Jansen        diss   = zero
107459599516SKenneth E. Jansen
107559599516SKenneth E. Jansen      do iblk = 1,nelblk
107659599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
107759599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
107859599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
107959599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
108059599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
108159599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
108259599516SKenneth E. Jansen        inum  = iel + npro - 1
108359599516SKenneth E. Jansen
108459599516SKenneth E. Jansen        ngauss = nint(lcsyst)
108559599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
108659599516SKenneth E. Jansen
108759599516SKenneth E. Jansen        call SUPGstress (y, ac, x, qres, mien(iblk)%p, mxmudmi(iblk)%p,
108859599516SKenneth E. Jansen     &                   cdelsq, shglf(lcsyst,:,1:nshl,:),
108959599516SKenneth E. Jansen     &                   shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf),
109059599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:), shp(lcsyst,1:nshl,:),
109159599516SKenneth E. Jansen     &                   stress, diss, vol)
109259599516SKenneth E. Jansen
109359599516SKenneth E. Jansen      enddo
109459599516SKenneth E. Jansen
109559599516SKenneth E. Jansen      if(numpe>1) call commu (stress, ilwork, 9, 'in ')
109659599516SKenneth E. Jansen      if(numpe>1) call commu (diss, ilwork, 3, 'in ')
109759599516SKenneth E. Jansen      if(numpe>1) call commu (vol, ilwork, 1, 'in ')
109859599516SKenneth E. Jansen
109959599516SKenneth E. Jansenc
110059599516SKenneth E. Jansenc account for periodicity
110159599516SKenneth E. Jansenc
110259599516SKenneth E. Jansen      do j = 1,nshg
110359599516SKenneth E. Jansen        i = iper(j)
110459599516SKenneth E. Jansen        if (i .ne. j) then
110559599516SKenneth E. Jansen           stress(i,:) = stress(i,:) + stress(j,:)
110659599516SKenneth E. Jansen           diss(i,:)   = diss(i,:)   + diss(j,:)
110759599516SKenneth E. Jansen           vol(i)      = vol(i)      + vol(j)
110859599516SKenneth E. Jansen        endif
110959599516SKenneth E. Jansen      enddo
111059599516SKenneth E. Jansen
111159599516SKenneth E. Jansen      do j = 1,nshg
111259599516SKenneth E. Jansen        i = iper(j)
111359599516SKenneth E. Jansen        if (i .ne. j) then
111459599516SKenneth E. Jansen           stress(j,:) = stress(i,:)
111559599516SKenneth E. Jansen           diss(j,:)   = diss(i,:)
111659599516SKenneth E. Jansen           vol(j)      = vol(i)
111759599516SKenneth E. Jansen        endif
111859599516SKenneth E. Jansen      enddo
111959599516SKenneth E. Jansen
112059599516SKenneth E. Jansen      if(numpe>1) call commu (stress, ilwork, 9, 'out ')
112159599516SKenneth E. Jansen      if(numpe>1) call commu (diss, ilwork, 3, 'out ')
112259599516SKenneth E. Jansen      if(numpe>1) call commu (vol, ilwork, 1, 'out ')
112359599516SKenneth E. Jansen
112459599516SKenneth E. Jansen      vol = one / vol
112559599516SKenneth E. Jansen      do i = 1, 9
112659599516SKenneth E. Jansen         stress(:,i) = stress(:,i)*vol(:)
112759599516SKenneth E. Jansen      enddo
112859599516SKenneth E. Jansen      do i = 1, 3
112959599516SKenneth E. Jansen         diss(:,i) = diss(:,i)*vol(:)
113059599516SKenneth E. Jansen      enddo
113159599516SKenneth E. Jansen
113259599516SKenneth E. Jansenc---------- > Begin averaging dissipations and SUPG stress <--------------
113359599516SKenneth E. Jansen
113459599516SKenneth E. Jansen      do i = 1, 9
113559599516SKenneth E. Jansen         xave(:,i) = stress(:,i)
113659599516SKenneth E. Jansen      enddo
113759599516SKenneth E. Jansen      xave(:,10) = diss(:,1)
113859599516SKenneth E. Jansen      xave(:,11) = diss(:,2)
113959599516SKenneth E. Jansen      xave(:,12) = diss(:,3)
114059599516SKenneth E. Jansen
114159599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
114259599516SKenneth E. Jansen        do j = 1,numnp
114359599516SKenneth E. Jansen          i = iper(j)
114459599516SKenneth E. Jansen          if (i .ne. j) then
114559599516SKenneth E. Jansen            xave(j,:) = zero
114659599516SKenneth E. Jansen          endif
114759599516SKenneth E. Jansen        enddo
114859599516SKenneth E. Jansen
114959599516SKenneth E. Jansen      if (numpe.gt.1) then
115059599516SKenneth E. Jansen
115159599516SKenneth E. Jansen         numtask = ilwork(1)
115259599516SKenneth E. Jansen         itkbeg = 1
115359599516SKenneth E. Jansen
115459599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
115559599516SKenneth E. Jansen         do itask = 1, numtask
115659599516SKenneth E. Jansen
115759599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
115859599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
115959599516SKenneth E. Jansen
116059599516SKenneth E. Jansen            if (iacc .eq. 0) then
116159599516SKenneth E. Jansen               do is = 1,numseg
116259599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
116359599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
116459599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
116559599516SKenneth E. Jansen                  xave(isgbeg:isgend,:) = zero
116659599516SKenneth E. Jansen               enddo
116759599516SKenneth E. Jansen            endif
116859599516SKenneth E. Jansen
116959599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
117059599516SKenneth E. Jansen
117159599516SKenneth E. Jansen         enddo
117259599516SKenneth E. Jansen
117359599516SKenneth E. Jansen      endif
117459599516SKenneth E. Jansenc
117559599516SKenneth E. Jansen
117659599516SKenneth E. Jansen      xaveg = zero
117759599516SKenneth E. Jansen      do i = 1,nshg
117859599516SKenneth E. Jansen         xaveg(ifath(i),:) = xaveg(ifath(i),:) + xave(i,:)
117959599516SKenneth E. Jansen      enddo
118059599516SKenneth E. Jansen
118159599516SKenneth E. Jansen      if(numpe .gt. 1)then
118259599516SKenneth E. Jansen         call drvAllreduce(xaveg, xavegr,12*nfath)
118359599516SKenneth E. Jansen
118459599516SKenneth E. Jansen         do m = 1, 12
118559599516SKenneth E. Jansen            xavegr(:,m) = xavegr(:,m)/nsons(:)
118659599516SKenneth E. Jansen         enddo
118759599516SKenneth E. Jansen
118859599516SKenneth E. Jansen         if (myrank .eq. master) then
118959599516SKenneth E. Jansen            write(*,*)'diss=', xavegt(14,11), xavegr(14,11)
119059599516SKenneth E. Jansen         endif
119159599516SKenneth E. Jansen
119259599516SKenneth E. Jansen         do m = 1, 12
119359599516SKenneth E. Jansen            xavegt(:,m) = xavegt(:,m) + xavegr(:,m)
119459599516SKenneth E. Jansen         enddo
119559599516SKenneth E. Jansen
119659599516SKenneth E. Jansen      else
119759599516SKenneth E. Jansen
119859599516SKenneth E. Jansen         do m = 1, 12
119959599516SKenneth E. Jansen            xaveg(:,m) = xaveg(:,m)/nsons(:)
120059599516SKenneth E. Jansen         enddo
120159599516SKenneth E. Jansen
120259599516SKenneth E. Jansen         do m = 1, 12
120359599516SKenneth E. Jansen            xavegt(:,m) = xavegt(:,m) + xaveg(:,m)
120459599516SKenneth E. Jansen         enddo
120559599516SKenneth E. Jansen
120659599516SKenneth E. Jansen      endif
120759599516SKenneth E. Jansen
120859599516SKenneth E. Jansen      if (myrank .eq. master) then
120959599516SKenneth E. Jansen         write(*,*)'diss=', xavegt(14,11), xavegr(14,11)
121059599516SKenneth E. Jansen      endif
121159599516SKenneth E. Jansen
121259599516SKenneth E. Jansen      if ( istep .eq. (nstep(1)-1) ) then
121359599516SKenneth E. Jansen         if ( myrank .eq. master) then
121459599516SKenneth E. Jansen
121559599516SKenneth E. Jansen            do i = 1, nfath
121659599516SKenneth E. Jansen               write(376,*)xavegt(i,1),xavegt(i,2),xavegt(i,3)
121759599516SKenneth E. Jansen               write(377,*)xavegt(i,4),xavegt(i,5),xavegt(i,6)
121859599516SKenneth E. Jansen               write(378,*)xavegt(i,7),xavegt(i,8),xavegt(i,9)
121959599516SKenneth E. Jansen               write(379,*)xavegt(i,10),xavegt(i,11),xavegt(i,12)
122059599516SKenneth E. Jansen            enddo
122159599516SKenneth E. Jansen
122259599516SKenneth E. Jansen            call flush(376)
122359599516SKenneth E. Jansen            call flush(377)
122459599516SKenneth E. Jansen            call flush(378)
122559599516SKenneth E. Jansen            call flush(379)
122659599516SKenneth E. Jansen
122759599516SKenneth E. Jansen         endif
122859599516SKenneth E. Jansen      endif
122959599516SKenneth E. Jansen
123059599516SKenneth E. Jansen
123159599516SKenneth E. Jansen      return
123259599516SKenneth E. Jansen
123359599516SKenneth E. Jansen      end
123459599516SKenneth E. Jansen
123559599516SKenneth E. Jansen
123659599516SKenneth E. Jansen      subroutine resSij (y, x, ien, hfres, shgl, shp, Qwtf)
123759599516SKenneth E. Jansen
123859599516SKenneth E. Jansen      include "common.h"
123959599516SKenneth E. Jansen
124059599516SKenneth E. Jansen      dimension y(nshg,5),             hfres(nshg,24)
124159599516SKenneth E. Jansen      dimension x(numnp,3),            xl(npro,nenl,3)
124259599516SKenneth E. Jansen      dimension ien(npro,nshl),        yl(npro,nshl,5),
124359599516SKenneth E. Jansen     &          fresl(npro,nshl,24),        WdetJ(npro),
124459599516SKenneth E. Jansen     &          u1(npro),              u2(npro),
124559599516SKenneth E. Jansen     &          u3(npro),              rho(npro),
124659599516SKenneth E. Jansen     &          S11(npro),             S22(npro),
124759599516SKenneth E. Jansen     &          S33(npro),             S12(npro),
124859599516SKenneth E. Jansen     &          S13(npro),             S23(npro),
124959599516SKenneth E. Jansen     &          dxdxi(npro,nsd,nsd),   dxidx(npro,nsd,nsd),
125059599516SKenneth E. Jansen     &          shgl(nsd,nshl,ngauss),       shg(npro,nshl,nsd),
125159599516SKenneth E. Jansen     &          shp(nshl,ngauss),
125259599516SKenneth E. Jansen     &          fresli(npro,nshl,24),   Qwtf(ngaussf),
125359599516SKenneth E. Jansen     &          strnrmi(npro)
125459599516SKenneth E. Jansen
125559599516SKenneth E. Jansen
125659599516SKenneth E. Jansen      dimension tmp(npro)
125759599516SKenneth E. Jansen
125859599516SKenneth E. Jansen      call local (y,      yl,     ien,    5,  'gather  ')
125959599516SKenneth E. Jansen      call localx (x,      xl,     ien,    3,  'gather  ')
126059599516SKenneth E. Jansenc
126159599516SKenneth E. Jansen
126259599516SKenneth E. Jansen      fresl = zero
126359599516SKenneth E. Jansen
126459599516SKenneth E. Jansenc
126559599516SKenneth E. Jansen      do intp = 1, ngaussf   ! Loop over quadrature points
126659599516SKenneth E. Jansen
126759599516SKenneth E. Jansenc  calculate the metrics
126859599516SKenneth E. Jansenc
126959599516SKenneth E. Jansenc
127059599516SKenneth E. Jansenc.... --------------------->  Element Metrics  <-----------------------
127159599516SKenneth E. Jansenc
127259599516SKenneth E. Jansenc.... compute the deformation gradient
127359599516SKenneth E. Jansenc
127459599516SKenneth E. Jansen         dxdxi = zero
127559599516SKenneth E. Jansenc
127659599516SKenneth E. Jansen         do n = 1, nenl
127759599516SKenneth E. Jansen            dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(1,n,intp)
127859599516SKenneth E. Jansen            dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(2,n,intp)
127959599516SKenneth E. Jansen            dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(3,n,intp)
128059599516SKenneth E. Jansen            dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(1,n,intp)
128159599516SKenneth E. Jansen            dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(2,n,intp)
128259599516SKenneth E. Jansen            dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(3,n,intp)
128359599516SKenneth E. Jansen            dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(1,n,intp)
128459599516SKenneth E. Jansen            dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(2,n,intp)
128559599516SKenneth E. Jansen            dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(3,n,intp)
128659599516SKenneth E. Jansen         enddo
128759599516SKenneth E. Jansenc
128859599516SKenneth E. Jansenc.... compute the inverse of deformation gradient
128959599516SKenneth E. Jansenc
129059599516SKenneth E. Jansen         dxidx(:,1,1) =   dxdxi(:,2,2) * dxdxi(:,3,3)
129159599516SKenneth E. Jansen     &        - dxdxi(:,3,2) * dxdxi(:,2,3)
129259599516SKenneth E. Jansen         dxidx(:,1,2) =   dxdxi(:,3,2) * dxdxi(:,1,3)
129359599516SKenneth E. Jansen     &        - dxdxi(:,1,2) * dxdxi(:,3,3)
129459599516SKenneth E. Jansen         dxidx(:,1,3) =   dxdxi(:,1,2) * dxdxi(:,2,3)
129559599516SKenneth E. Jansen     &        - dxdxi(:,1,3) * dxdxi(:,2,2)
129659599516SKenneth E. Jansen         tmp          = one / ( dxidx(:,1,1) * dxdxi(:,1,1)
129759599516SKenneth E. Jansen     &        + dxidx(:,1,2) * dxdxi(:,2,1)
129859599516SKenneth E. Jansen     &        + dxidx(:,1,3) * dxdxi(:,3,1) )
129959599516SKenneth E. Jansen         dxidx(:,1,1) = dxidx(:,1,1) * tmp
130059599516SKenneth E. Jansen         dxidx(:,1,2) = dxidx(:,1,2) * tmp
130159599516SKenneth E. Jansen         dxidx(:,1,3) = dxidx(:,1,3) * tmp
130259599516SKenneth E. Jansen         dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1)
130359599516SKenneth E. Jansen     &        - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp
130459599516SKenneth E. Jansen         dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3)
130559599516SKenneth E. Jansen     &        - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp
130659599516SKenneth E. Jansen         dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3)
130759599516SKenneth E. Jansen     &        - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp
130859599516SKenneth E. Jansen         dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2)
130959599516SKenneth E. Jansen     &        - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp
131059599516SKenneth E. Jansen         dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2)
131159599516SKenneth E. Jansen     &        - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp
131259599516SKenneth E. Jansen         dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2)
131359599516SKenneth E. Jansen     &        - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp
131459599516SKenneth E. Jansenc
131559599516SKenneth E. Jansenc        wght=Qwt(lcsyst,intp)  ! may be different now
131659599516SKenneth E. Jansen         wght=Qwtf(intp)
131759599516SKenneth E. Jansen         WdetJ(:) = wght / tmp(:)
131859599516SKenneth E. Jansen
131959599516SKenneth E. Jansen
132059599516SKenneth E. Jansenc... compute the gradient of shape functions at the quad. point.
132159599516SKenneth E. Jansen
132259599516SKenneth E. Jansen
132359599516SKenneth E. Jansen      do n = 1,nshl
132459599516SKenneth E. Jansen        shg(:,n,1) = (shgl(1,n,intp) * dxidx(:,1,1)
132559599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,1)
132659599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,1))
132759599516SKenneth E. Jansen        shg(:,n,2) = (shgl(1,n,intp) * dxidx(:,1,2)
132859599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,2)
132959599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,2))
133059599516SKenneth E. Jansen        shg(:,n,3) = (shgl(1,n,intp) * dxidx(:,1,3)
133159599516SKenneth E. Jansen     &              + shgl(2,n,intp) * dxidx(:,2,3)
133259599516SKenneth E. Jansen     &              + shgl(3,n,intp) * dxidx(:,3,3))
133359599516SKenneth E. Jansen      enddo
133459599516SKenneth E. Jansen
133559599516SKenneth E. Jansen
133659599516SKenneth E. Jansenc... compute the velocities and the strain rate tensor at the quad. point
133759599516SKenneth E. Jansen
133859599516SKenneth E. Jansen
133959599516SKenneth E. Jansen         u1  = zero
134059599516SKenneth E. Jansen         u2  = zero
134159599516SKenneth E. Jansen         u3  = zero
134259599516SKenneth E. Jansen         S11 = zero
134359599516SKenneth E. Jansen         S22 = zero
134459599516SKenneth E. Jansen         S33 = zero
134559599516SKenneth E. Jansen         S12 = zero
134659599516SKenneth E. Jansen         S13 = zero
134759599516SKenneth E. Jansen         S23 = zero
134859599516SKenneth E. Jansen         do i=1,nshl
134959599516SKenneth E. Jansen            u1 = u1 + shp(i,intp)*yl(:,i,2)
135059599516SKenneth E. Jansen            u2 = u2 + shp(i,intp)*yl(:,i,3)
135159599516SKenneth E. Jansen            u3 = u3 + shp(i,intp)*yl(:,i,4)
135259599516SKenneth E. Jansen
135359599516SKenneth E. Jansen            S11 = S11 + shg(:,i,1)*yl(:,i,2)
135459599516SKenneth E. Jansen            S22 = S22 + shg(:,i,2)*yl(:,i,3)
135559599516SKenneth E. Jansen            S33 = S33 + shg(:,i,3)*yl(:,i,4)
135659599516SKenneth E. Jansen
135759599516SKenneth E. Jansen            S12 = S12 + shg(:,i,2)*yl(:,i,2)
135859599516SKenneth E. Jansen     &                       +shg(:,i,1)*yl(:,i,3)
135959599516SKenneth E. Jansen            S13 = S13 + shg(:,i,3)*yl(:,i,2)
136059599516SKenneth E. Jansen     &                       +shg(:,i,1)*yl(:,i,4)
136159599516SKenneth E. Jansen            S23 = S23 + shg(:,i,3)*yl(:,i,3)
136259599516SKenneth E. Jansen     &                       +shg(:,i,2)*yl(:,i,4)
136359599516SKenneth E. Jansen         enddo
136459599516SKenneth E. Jansen         S12 = pt5 * S12
136559599516SKenneth E. Jansen         S13 = pt5 * S13
136659599516SKenneth E. Jansen         S23 = pt5 * S23
136759599516SKenneth E. Jansen
136859599516SKenneth E. Jansenc... Get the strain rate norm at the quad pts
136959599516SKenneth E. Jansen
137059599516SKenneth E. Jansen         strnrmi = sqrt( two*(S11**2 + S22**2 + S33**2)
137159599516SKenneth E. Jansen     &        + four*(S12**2 + S13**2 + S23**2) )
137259599516SKenneth E. Jansen
137359599516SKenneth E. Jansen
137459599516SKenneth E. Jansenc... Loop over element nodes and multiply u_{i} and S_{i,j} by the
137559599516SKenneth E. Jansenc... hat kernel and the Jacobian over the current element evaluated at
137659599516SKenneth E. Jansenc... the current quad. point.
137759599516SKenneth E. Jansen
137859599516SKenneth E. Jansen         do i = 1, nenl   ! Loop over element nodes
137959599516SKenneth E. Jansen
138059599516SKenneth E. Jansen            fresli(:,i,1) = WdetJ * u1 * shp(i,intp) !G * u1 * WdetJ
138159599516SKenneth E. Jansen            fresli(:,i,2) = WdetJ * u2 * shp(i,intp) !G * u2 * WdetJ
138259599516SKenneth E. Jansen            fresli(:,i,3) = WdetJ * u3 * shp(i,intp) !G * u3 * WdetJ
138359599516SKenneth E. Jansen
138459599516SKenneth E. Jansen            fresli(:,i,4) = WdetJ * u1 * u1 * shp(i,intp) ! G*u1*u1*WdetJ
138559599516SKenneth E. Jansen            fresli(:,i,5) = WdetJ * u2 * u2 * shp(i,intp) ! G*u2*u2*WdetJ
138659599516SKenneth E. Jansen            fresli(:,i,6) = WdetJ * u3 * u3 * shp(i,intp) ! G*u3*u3*WdetJ
138759599516SKenneth E. Jansen            fresli(:,i,7) = WdetJ * u1 * u2 * shp(i,intp) ! G*u1*u2*WdetJ
138859599516SKenneth E. Jansen            fresli(:,i,8) = WdetJ * u1 * u3 * shp(i,intp) ! G*u1*u3*WdetJ
138959599516SKenneth E. Jansen            fresli(:,i,9) = WdetJ * u2 * u3 * shp(i,intp) ! G*u2*u3*WdetJ
139059599516SKenneth E. Jansen
139159599516SKenneth E. Jansen            fresli(:,i,10) = S11 * shp(i,intp) * WdetJ ! G*S_{1,1}*WdetJ
139259599516SKenneth E. Jansen            fresli(:,i,11) = S22 * shp(i,intp) * WdetJ ! G*S_{2,2}*WdetJ
139359599516SKenneth E. Jansen            fresli(:,i,12) = S33 * shp(i,intp) * WdetJ ! G*S_{3,3}*WdetJ
139459599516SKenneth E. Jansen            fresli(:,i,13) = S12 * shp(i,intp) * WdetJ ! G*S_{1,1}*WdetJ
139559599516SKenneth E. Jansen            fresli(:,i,14) = S13 * shp(i,intp) * WdetJ ! G*S_{1,3}*WdetJ
139659599516SKenneth E. Jansen            fresli(:,i,15) = S23 * shp(i,intp) * WdetJ ! G*S_{2,3}*WdetJ
139759599516SKenneth E. Jansen
139859599516SKenneth E. Jansen
139959599516SKenneth E. Jansen            fresli(:,i,16) = strnrmi*strnrmi*strnrmi*shp(i,intp)*WdetJ
140059599516SKenneth E. Jansen
140159599516SKenneth E. Jansen            fresli(:,i,22) = WdetJ*shp(i,intp) !Integral of filter kernel, G,
140259599516SKenneth E. Jansenc                                               over the element
140359599516SKenneth E. Jansen
140459599516SKenneth E. Jansenc...   Get G*|S|*S_{i,j}*WdetJ
140559599516SKenneth E. Jansen
140659599516SKenneth E. Jansenc            fresli(:,i,16) = S11 * strnrmi * shp(i,intp) * WdetJ
140759599516SKenneth E. Jansen            fresli(:,i,17) = S22 * strnrmi * shp(i,intp) * WdetJ
140859599516SKenneth E. Jansen            fresli(:,i,18) = S33 * strnrmi * shp(i,intp) * WdetJ
140959599516SKenneth E. Jansen            fresli(:,i,19) = S12 * strnrmi * shp(i,intp) * WdetJ
141059599516SKenneth E. Jansen            fresli(:,i,20) = S13 * strnrmi * shp(i,intp) * WdetJ
141159599516SKenneth E. Jansen            fresli(:,i,21) = S23 * strnrmi * shp(i,intp) * WdetJ
141259599516SKenneth E. Jansen
141359599516SKenneth E. Jansen            do j = 1, 22 ! Add contribution of each quad. point for each
141459599516SKenneth E. Jansenc                          element node
141559599516SKenneth E. Jansen               fresl(:,i,j) = fresl(:,i,j) + fresli(:,i,j)
141659599516SKenneth E. Jansen            enddo
141759599516SKenneth E. Jansen
141859599516SKenneth E. Jansen         enddo                  !end loop over element nodes
141959599516SKenneth E. Jansen
142059599516SKenneth E. Jansen      enddo                     !end of loop over integration points
142159599516SKenneth E. Jansen
142259599516SKenneth E. Jansen
142359599516SKenneth E. Jansen      call local (hfres, fresl, ien, 24, 'scatter ')
142459599516SKenneth E. Jansen
142559599516SKenneth E. Jansen      return
142659599516SKenneth E. Jansen      end
142759599516SKenneth E. Jansen
142859599516SKenneth E. Jansen
142959599516SKenneth E. Jansen
143059599516SKenneth E. Jansen	subroutine sparseCG (rhsorig, trx, lhsM, row, col, iper,
143159599516SKenneth E. Jansen     &     ilwork, iBC, BC)
143259599516SKenneth E. Jansenc
143359599516SKenneth E. Jansenc------------------------------------------------------------------------
143459599516SKenneth E. Jansenc
143559599516SKenneth E. Jansenc  This subroutine uses Conjugate Gradient,
143659599516SKenneth E. Jansenc to solve the system of equations.
143759599516SKenneth E. Jansenc
143859599516SKenneth E. Jansenc Farzin Shakib,  Summer 1987.
143959599516SKenneth E. Jansenc------------------------------------------------------------------------
144059599516SKenneth E. Jansenc
144159599516SKenneth E. Jansen	include "common.h"
144259599516SKenneth E. Jansenc
144359599516SKenneth E. Jansen	dimension rhsorig(nshg), trx(nshg)
144459599516SKenneth E. Jansenc
144559599516SKenneth E. Jansen	dimension d(nshg),     p(nshg),
144659599516SKenneth E. Jansen     &            q(nshg),     ilwork(nlwork),
144759599516SKenneth E. Jansen     &		  Dinv(nshg),  rhs(nshg),
144859599516SKenneth E. Jansen     &            pp(nshg),
144959599516SKenneth E. Jansen     &            iBC(nshg),
145059599516SKenneth E. Jansen     &            BC(nshg)
145159599516SKenneth E. Jansen
145259599516SKenneth E. Jansen
145359599516SKenneth E. Jansen        integer   row(nshg*nnz),         col(nshg+1)
145459599516SKenneth E. Jansen	integer   iBCdumb(nshg),         iper(nshg)
145559599516SKenneth E. Jansen
145659599516SKenneth E. Jansen	real*8 BCdumb(nshg,ndofBC)
145759599516SKenneth E. Jansen
145859599516SKenneth E. Jansen	real*8	lhsM(nnz*nshg)
145959599516SKenneth E. Jansenc
146059599516SKenneth E. Jansen	data nitercf / 100 /
146159599516SKenneth E. Jansenc
146259599516SKenneth E. Jansenc
146359599516SKenneth E. Jansen	BCdumb  = one
146459599516SKenneth E. Jansen	iBCdumb = 1
146559599516SKenneth E. Jansenc
146659599516SKenneth E. Jansen	rhs(:)=rhsorig(:)
146759599516SKenneth E. Jansenc
146859599516SKenneth E. Jansenc.... Calculate the inverse of the diagonal of the mass matrix
146959599516SKenneth E. Jansenc
147059599516SKenneth E. Jansenc       call CFDinv (Dinv, emass)
147159599516SKenneth E. Jansenc
147259599516SKenneth E. Jansenc.... Left precondition the mass matrix and the RHS
147359599516SKenneth E. Jansenc
147459599516SKenneth E. Jansenc	call CFPre (Dinv, emass, rhs)
147559599516SKenneth E. Jansenc
147659599516SKenneth E. Jansenc Initialize. We have a system Ax=b We have made A as
147759599516SKenneth E. Jansenc well conditionedand as we're willing to go.  Since
147859599516SKenneth E. Jansenc we used left preconditioning (on the old A and old b),
147959599516SKenneth E. Jansenc we don't need to do any back-preconditioning later.
148059599516SKenneth E. Jansenc
148159599516SKenneth E. Jansen	rr = 0
148259599516SKenneth E. Jansen	do n = 1, nshg
148359599516SKenneth E. Jansen	   rr  = rr + rhs(n)*rhs(n)
148459599516SKenneth E. Jansen	enddo
148559599516SKenneth E. Jansenc
148659599516SKenneth E. Jansenc  if parallel the above is only this processors part of the dot product.
148759599516SKenneth E. Jansenc  get the total result
148859599516SKenneth E. Jansenc
148959599516SKenneth E. Jansen	   dotTot=zero
149059599516SKenneth E. Jansen	   call drvAllreduce(rr,dotTot,1)
149159599516SKenneth E. Jansen	   rr=dotTot
149259599516SKenneth E. Jansen	rr0 = rr
149359599516SKenneth E. Jansenc
149459599516SKenneth E. Jansen	trx(:) = zero ! x_{0}=0
149559599516SKenneth E. Jansenc                   ! r_{0}=b
149659599516SKenneth E. Jansenc
149759599516SKenneth E. Jansenc                   ! beta_{1}=0
149859599516SKenneth E. Jansen	p(:) = rhs(:) ! p_{1}=r_{0}=b
149959599516SKenneth E. Jansenc
150059599516SKenneth E. Jansenc.... Iterate
150159599516SKenneth E. Jansenc
150259599516SKenneth E. Jansen	do iter = 1, nitercf      ! 15  ! nitercf
150359599516SKenneth E. Jansenc
150459599516SKenneth E. Jansenc.... calculate alpha
150559599516SKenneth E. Jansenc
150659599516SKenneth E. Jansen	   pp=p   ! make a vector that we can copy masters onto slaves
150759599516SKenneth E. Jansen		  ! and thereby make ready for an accurate Ap product
150859599516SKenneth E. Jansen
1509*79f1763eSKenneth E. Jansen#ifdef HAVE_LESLIB
151059599516SKenneth E. Jansen	   call commOut(pp, ilwork, 1,iper,iBCdumb,BCdumb)  !slaves= master
151159599516SKenneth E. Jansen
151259599516SKenneth E. Jansen	   call fLesSparseApSclr(	col,	row,	lhsM,
151359599516SKenneth E. Jansen     &					pp,	q,	nshg,
151459599516SKenneth E. Jansen     &                                  nnz)
151559599516SKenneth E. Jansen
151659599516SKenneth E. Jansen	   call commIn(q, ilwork, 1,iper,iBC,BC) ! masters=masters+slaves
151759599516SKenneth E. Jansen							 ! slaves zeroed
1518*79f1763eSKenneth E. Jansen#else
1519*79f1763eSKenneth E. Jansen           if(myrank.eq.0) write(*,*) 'need alt solver in filter.f'
1520*79f1763eSKenneth E. Jansen           call error('filter   ','noleslib',1)
1521*79f1763eSKenneth E. Jansen#endif
152259599516SKenneth E. Jansenc	   call CFAp (p,  q) ! put Ap product in q
152359599516SKenneth E. Jansen
152459599516SKenneth E. Jansenc	   if(nump>1) call commu (q, ilwork, 1, 'in ')
152559599516SKenneth E. Jansen
152659599516SKenneth E. Jansenc	   do j = 1,nshg
152759599516SKenneth E. Jansenc	      i = iper(j)
152859599516SKenneth E. Jansenc	      if (i .ne. j) then
152959599516SKenneth E. Jansenc		 q(i) = q(i) + q(j)
153059599516SKenneth E. Jansenc	      endif
153159599516SKenneth E. Jansenc	   enddo
153259599516SKenneth E. Jansen
153359599516SKenneth E. Jansenc	   do j = 1,nshg
153459599516SKenneth E. Jansenc	      i = iper(j)
153559599516SKenneth E. Jansenc	      if (i .ne. j) then
153659599516SKenneth E. Jansenc		 q(j) = zero
153759599516SKenneth E. Jansenc	      endif
153859599516SKenneth E. Jansenc	   enddo
153959599516SKenneth E. Jansen
154059599516SKenneth E. Jansenc     Need to zero off-processor slaves as well.
154159599516SKenneth E. Jansen
154259599516SKenneth E. Jansenc      if (numpe.gt.1 .and. nsons(1).gt.1) then
154359599516SKenneth E. Jansen
154459599516SKenneth E. Jansenc         numtask = ilwork(1)
154559599516SKenneth E. Jansenc         itkbeg = 1
154659599516SKenneth E. Jansen
154759599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
154859599516SKenneth E. Jansen
154959599516SKenneth E. Jansenc         do itask = 1, numtask
155059599516SKenneth E. Jansen
155159599516SKenneth E. Jansenc            iacc   = ilwork (itkbeg + 2)
155259599516SKenneth E. Jansenc            numseg = ilwork (itkbeg + 4)
155359599516SKenneth E. Jansen
155459599516SKenneth E. Jansenc            if (iacc .eq. 0) then
155559599516SKenneth E. Jansenc               do is = 1,numseg
155659599516SKenneth E. Jansenc                  isgbeg = ilwork (itkbeg + 3 + 2*is)
155759599516SKenneth E. Jansenc                  lenseg = ilwork (itkbeg + 4 + 2*is)
155859599516SKenneth E. Jansenc                  isgend = isgbeg + lenseg - 1
155959599516SKenneth E. Jansenc                  q(isgbeg:isgend) = zero
156059599516SKenneth E. Jansenc               enddo
156159599516SKenneth E. Jansenc           endif
156259599516SKenneth E. Jansen
156359599516SKenneth E. Jansenc            itkbeg = itkbeg + 4 + 2*numseg
156459599516SKenneth E. Jansen
156559599516SKenneth E. Jansenc         enddo
156659599516SKenneth E. Jansen
156759599516SKenneth E. Jansenc	endif
156859599516SKenneth E. Jansen
156959599516SKenneth E. Jansen
157059599516SKenneth E. Jansen
157159599516SKenneth E. Jansen	   pap = 0
157259599516SKenneth E. Jansen	   do  n = 1, nshg
157359599516SKenneth E. Jansen	      pap = pap + p(n) * q(n)
157459599516SKenneth E. Jansen	   enddo
157559599516SKenneth E. Jansenc
157659599516SKenneth E. Jansenc  if parallel the above is only this processors part of the dot product.
157759599516SKenneth E. Jansenc  get the total result
157859599516SKenneth E. Jansenc
157959599516SKenneth E. Jansen           dotTot=zero
158059599516SKenneth E. Jansen	   call drvAllreduce(pap,dotTot,1)
158159599516SKenneth E. Jansen	   pap=dotTot
158259599516SKenneth E. Jansen	   alpha = rr / pap
158359599516SKenneth E. Jansenc
158459599516SKenneth E. Jansenc.... calculate the next guess
158559599516SKenneth E. Jansenc
158659599516SKenneth E. Jansen	   trx(:) = trx(:) + alpha * p(:)
158759599516SKenneth E. Jansenc
158859599516SKenneth E. Jansenc.... calculate the new residual
158959599516SKenneth E. Jansenc
159059599516SKenneth E. Jansenc
159159599516SKenneth E. Jansen	   rhs(:) = rhs(:) - alpha * q(:)
159259599516SKenneth E. Jansen	   tmp = rr
159359599516SKenneth E. Jansen	   rr = 0
159459599516SKenneth E. Jansen	   do n = 1, nshg
159559599516SKenneth E. Jansen	      rr = rr + rhs(n)*rhs(n)
159659599516SKenneth E. Jansen	   enddo
159759599516SKenneth E. Jansenc
159859599516SKenneth E. Jansenc  if parallel the above is only this processors part of the dot product.
159959599516SKenneth E. Jansenc  get the total result
160059599516SKenneth E. Jansenc
160159599516SKenneth E. Jansen           dotTot=zero
160259599516SKenneth E. Jansen	   call drvAllreduce(rr,dotTot,1)
160359599516SKenneth E. Jansen	   rr=dotTot
160459599516SKenneth E. Jansenc
160559599516SKenneth E. Jansenc.... check for convergence
160659599516SKenneth E. Jansenc
160759599516SKenneth E. Jansen	   if(rr.lt.100.*epsM**2) goto 6000
160859599516SKenneth E. Jansenc
160959599516SKenneth E. Jansenc.... calculate a new search direction
161059599516SKenneth E. Jansenc
161159599516SKenneth E. Jansen	   beta = rr / tmp
161259599516SKenneth E. Jansen	   p(:) = rhs(:) + beta * p(:)
161359599516SKenneth E. Jansenc
161459599516SKenneth E. Jansenc.... end of iteration
161559599516SKenneth E. Jansenc
161659599516SKenneth E. Jansen	enddo
161759599516SKenneth E. Jansenc
161859599516SKenneth E. Jansenc.... if converged
161959599516SKenneth E. Jansenc
162059599516SKenneth E. Jansen6000	continue
162159599516SKenneth E. Jansen
162259599516SKenneth E. Jansenc need a commu(out) on solution (TRX) to get slaves the correct solution AND
162359599516SKenneth E. Jansenc on processor slaves = on processor masters
162459599516SKenneth E. Jansen
162559599516SKenneth E. Jansen	if(numpe>1) call commu (trx, ilwork, 1, 'out ')
162659599516SKenneth E. Jansen	trx(:) = trx(iper(:))
162759599516SKenneth E. Jansen
162859599516SKenneth E. Jansenc
162959599516SKenneth E. Jansen	write(*,9000) iter, rr / rr0
163059599516SKenneth E. Jansenc	write(16,9000) iter, rr / rr0
163159599516SKenneth E. Jansenc
163259599516SKenneth E. Jansenc.... return
163359599516SKenneth E. Jansenc
163459599516SKenneth E. Jansen	return
163559599516SKenneth E. Jansen9000	format(20x,'  number of iterations:', i10,/,
163659599516SKenneth E. Jansen     &	       20x,'    residual reduction:', 2x,e10.2)
163759599516SKenneth E. Jansen	end
163859599516SKenneth E. Jansen
163959599516SKenneth E. Jansen      subroutine stdfdmc (y,      shgl,      shp,
164059599516SKenneth E. Jansen     &                   iper,   ilwork,
164159599516SKenneth E. Jansen     &                   nsons,  ifath,     x)
164259599516SKenneth E. Jansen
164359599516SKenneth E. Jansen      use pointer_data
164459599516SKenneth E. Jansen
164559599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
164659599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
164759599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
164859599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
164959599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
165059599516SKenneth E. Jansenc                    quad. points.
165159599516SKenneth E. Jansen
165259599516SKenneth E. Jansen
165359599516SKenneth E. Jansen
165459599516SKenneth E. Jansen      include "common.h"
165559599516SKenneth E. Jansen      include "mpif.h"
165659599516SKenneth E. Jansen      include "auxmpi.h"
165759599516SKenneth E. Jansen
165859599516SKenneth E. Jansenc
165959599516SKenneth E. Jansen      dimension fres(nshg,24),         fwr(nshg),
166059599516SKenneth E. Jansen     &          strnrm(nshg),         cdelsq(nshg),
166159599516SKenneth E. Jansen     &          cdelsq2(nshg),
166259599516SKenneth E. Jansen     &          xnum(nshg),           xden(nshg),
166359599516SKenneth E. Jansen     &          xmij(nshg,6),         xlij(nshg,6),
166459599516SKenneth E. Jansen     &          xnude(nfath,2),        xnuder(nfath,2),
166559599516SKenneth E. Jansen     &          ynude(nfath,6),        ynuder(nfath,6)
166659599516SKenneth E. Jansen      dimension ui(nfath,3),           snorm(nfath),
166759599516SKenneth E. Jansen     &          uir(nfath,3),          snormr(nfath),
166859599516SKenneth E. Jansen     &          xm(nfath,6),           xl(nfath,6),
166959599516SKenneth E. Jansen     &          xl1(nfath,6),          xl2(nfath,6),
167059599516SKenneth E. Jansen     &          xl1r(nfath,6),         xl2r(nfath,6),
167159599516SKenneth E. Jansen     &          xmr(nfath,6),          xlr(nfath,6),
167259599516SKenneth E. Jansen     &          nsons(nshg),
167359599516SKenneth E. Jansen     &          strl(numel,ngauss)
167459599516SKenneth E. Jansen      dimension y(nshg,5),            yold(nshg,5),
167559599516SKenneth E. Jansen     &          ifath(nshg),          iper(nshg),
167659599516SKenneth E. Jansen     &          ilwork(nlwork),!        xmudmi(numel,ngauss),
167759599516SKenneth E. Jansen     &          x(numnp,3),
167859599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
167959599516SKenneth E. Jansen     &          xnutf(nfath),         xfac(nshg,5)
168059599516SKenneth E. Jansen
168159599516SKenneth E. Jansen      character*10 cname
168259599516SKenneth E. Jansen      character*30 fname1, fname2, fname3, fname4, fname5, fname6,
168359599516SKenneth E. Jansen     &             fname0
168459599516SKenneth E. Jansenc
168559599516SKenneth E. Jansenc
168659599516SKenneth E. Jansenc   setup the weights for time averaging of cdelsq (now in quadfilt module)
168759599516SKenneth E. Jansenc
168859599516SKenneth E. Jansen      denom=max(1.0d0*(lstep),one)
168959599516SKenneth E. Jansen      if(dtavei.lt.0) then
169059599516SKenneth E. Jansen         wcur=one/denom
169159599516SKenneth E. Jansen      else
169259599516SKenneth E. Jansen         wcur=dtavei
169359599516SKenneth E. Jansen      endif
169459599516SKenneth E. Jansen      whist=1.0-wcur
169559599516SKenneth E. Jansen
169659599516SKenneth E. Jansen      if (istep .eq. 0) then
169759599516SKenneth E. Jansen         xnd      = zero
169859599516SKenneth E. Jansen         xmodcomp = zero
169959599516SKenneth E. Jansen         xmcomp  = zero
170059599516SKenneth E. Jansen         xlcomp  = zero
170159599516SKenneth E. Jansen         xl1comp  = zero
170259599516SKenneth E. Jansen         xl2comp  = zero
170359599516SKenneth E. Jansen         ucomp    = zero
170459599516SKenneth E. Jansen         scomp    = zero
170559599516SKenneth E. Jansen      endif
170659599516SKenneth E. Jansen
170759599516SKenneth E. Jansen
170859599516SKenneth E. Jansen      fres = zero
170959599516SKenneth E. Jansen      yold(:,1)=y(:,4)
171059599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
171159599516SKenneth E. Jansenc
171259599516SKenneth E. Jansen
171359599516SKenneth E. Jansenc
171459599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
171559599516SKenneth E. Jansenc
171659599516SKenneth E. Jansenc      yold(:,5) = 1.0  ! Debugging
171759599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2)
171859599516SKenneth E. Jansenc      yold(:,2) = 2.0
171959599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
172059599516SKenneth E. Jansenc      yold(:,3) = 3.0
172159599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
172259599516SKenneth E. Jansenc      yold(:,4) = 4.0
172359599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
172459599516SKenneth E. Jansenc                               suitable for the
172559599516SKenneth E. Jansen
172659599516SKenneth E. Jansen
172759599516SKenneth E. Jansen
172859599516SKenneth E. Jansen      intrul=intg(1,itseq)
172959599516SKenneth E. Jansen      intind=intpt(intrul)
173059599516SKenneth E. Jansen
173159599516SKenneth E. Jansen      do iblk = 1,nelblk
173259599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
173359599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
173459599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
173559599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
173659599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
173759599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
173859599516SKenneth E. Jansen        inum  = iel + npro - 1
173959599516SKenneth E. Jansen
174059599516SKenneth E. Jansen        ngauss = nint(lcsyst)
174159599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
174259599516SKenneth E. Jansen
174359599516SKenneth E. Jansen        call asithf (yold, x, strl(iel:inum,:), mien(iblk)%p, fres,
174459599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
174559599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
174659599516SKenneth E. Jansen
174759599516SKenneth E. Jansen      enddo
174859599516SKenneth E. Jansenc
174959599516SKenneth E. Jansen
175059599516SKenneth E. Jansenc      if (ngaussf .ne. ngauss) then
175159599516SKenneth E. Jansen      do iblk = 1,nelblk
175259599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
175359599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
175459599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
175559599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
175659599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
175759599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
175859599516SKenneth E. Jansen        inum  = iel + npro - 1
175959599516SKenneth E. Jansen
176059599516SKenneth E. Jansen        ngauss = nint(lcsyst)
176159599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
176259599516SKenneth E. Jansen
176359599516SKenneth E. Jansen        if (ngaussf .ne. ngauss) then
176459599516SKenneth E. Jansen
176559599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
176659599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
176759599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
176859599516SKenneth E. Jansen
176959599516SKenneth E. Jansen        endif
177059599516SKenneth E. Jansen
177159599516SKenneth E. Jansen      enddo
177259599516SKenneth E. Jansenc      endif
177359599516SKenneth E. Jansenc
177459599516SKenneth E. Jansenc
177559599516SKenneth E. JansenC must fix for abc and dynamic model
177659599516SKenneth E. Jansenc      if(iabc==1)   !are there any axisym bc's
177759599516SKenneth E. Jansenc     &      call rotabc(res, iBC, BC,nflow, 'in ')
177859599516SKenneth E. Jansenc
177959599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 24, 'in ')
178059599516SKenneth E. Jansenc
178159599516SKenneth E. Jansenc account for periodicity in filtered variables
178259599516SKenneth E. Jansenc
178359599516SKenneth E. Jansen      do j = 1,nshg
178459599516SKenneth E. Jansen        i = iper(j)
178559599516SKenneth E. Jansen        if (i .ne. j) then
178659599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
178759599516SKenneth E. Jansen        endif
178859599516SKenneth E. Jansen      enddo
178959599516SKenneth E. Jansen      do j = 1,nshg
179059599516SKenneth E. Jansen        i = iper(j)
179159599516SKenneth E. Jansen        if (i .ne. j) then
179259599516SKenneth E. Jansen           fres(j,:) = fres(i,:)
179359599516SKenneth E. Jansen        endif
179459599516SKenneth E. Jansen      enddo
179559599516SKenneth E. Jansen
179659599516SKenneth E. Jansen      if(numpe>1)   call commu (fres, ilwork, 24, 'out')
179759599516SKenneth E. Jansen
179859599516SKenneth E. Jansen      fres(:,23) = one / fres(:,23)
179959599516SKenneth E. Jansen      do j = 1,22
180059599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,23)
180159599516SKenneth E. Jansen      enddo
180259599516SKenneth E. Jansenc     fres(:,24) = fres(:,24) * fres(:,23)
180359599516SKenneth E. Jansenc
180459599516SKenneth E. Jansenc.....at this point fres is really all of our filtered quantities
180559599516SKenneth E. Jansenc     at the nodes
180659599516SKenneth E. Jansenc
180759599516SKenneth E. Jansen
180859599516SKenneth E. Jansen      strnrm = sqrt(
180959599516SKenneth E. Jansen     &  two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2)
181059599516SKenneth E. Jansen     &  + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
181159599516SKenneth E. Jansen
181259599516SKenneth E. Jansen      fwr = fwr1 * fres(:,22) * strnrm
181359599516SKenneth E. Jansen
181459599516SKenneth E. Jansen      xmij(:,1) = -fwr
181559599516SKenneth E. Jansen     &             * fres(:,10) + fres(:,16)
181659599516SKenneth E. Jansen      xmij(:,2) = -fwr
181759599516SKenneth E. Jansen     &             * fres(:,11) + fres(:,17)
181859599516SKenneth E. Jansen      xmij(:,3) = -fwr
181959599516SKenneth E. Jansen     &             * fres(:,12) + fres(:,18)
182059599516SKenneth E. Jansen
182159599516SKenneth E. Jansen      xmij(:,4) = -fwr * fres(:,13) + fres(:,19)
182259599516SKenneth E. Jansen      xmij(:,5) = -fwr * fres(:,14) + fres(:,20)
182359599516SKenneth E. Jansen      xmij(:,6) = -fwr * fres(:,15) + fres(:,21)
182459599516SKenneth E. Jansen
182559599516SKenneth E. Jansen      fres(:,22) = one / fres(:,22)
182659599516SKenneth E. Jansen
182759599516SKenneth E. Jansen      xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1) * fres(:,22)
182859599516SKenneth E. Jansen      xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2) * fres(:,22)
182959599516SKenneth E. Jansen      xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3) * fres(:,22)
183059599516SKenneth E. Jansen      xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2) * fres(:,22)
183159599516SKenneth E. Jansen      xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3) * fres(:,22)
183259599516SKenneth E. Jansen      xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3) * fres(:,22)
183359599516SKenneth E. Jansen
183459599516SKenneth E. Jansen      xnum =        xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2)
183559599516SKenneth E. Jansen     &                                    + xlij(:,3) * xmij(:,3)
183659599516SKenneth E. Jansen     &     + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5)
183759599516SKenneth E. Jansen     &                                    + xlij(:,6) * xmij(:,6))
183859599516SKenneth E. Jansen      xden =        xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2)
183959599516SKenneth E. Jansen     &                                    + xmij(:,3) * xmij(:,3)
184059599516SKenneth E. Jansen     &     + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5)
184159599516SKenneth E. Jansen     &                                    + xmij(:,6) * xmij(:,6))
184259599516SKenneth E. Jansen      xden = two * xden
184359599516SKenneth E. Jansen
184459599516SKenneth E. Jansenc... For collectection of statistics on dyn. model components
184559599516SKenneth E. Jansen
184659599516SKenneth E. Jansen      xfac(:,1) = strnrm*strnrm*( fres(:,10)**2 + fres(:,11)**2 +
184759599516SKenneth E. Jansen     &     fres(:,12)**2
184859599516SKenneth E. Jansen     &     + two*( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
184959599516SKenneth E. Jansen
185059599516SKenneth E. Jansen      xfac(:,2) = strnrm*( xlij(:,1)*fres(:,10) + xlij(:,2)*fres(:,11)
185159599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,12) +
185259599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,13) + xlij(:,5)*fres(:,14) +
185359599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,15)) )
185459599516SKenneth E. Jansen
185559599516SKenneth E. Jansen      xfac(:,3) = strnrm*( fres(:,10)*fres(:,16) + fres(:,11)*fres(:,17)
185659599516SKenneth E. Jansen     &     + fres(:,12)*fres(:,18) +
185759599516SKenneth E. Jansen     &     two*(fres(:,13)*fres(:,19) + fres(:,14)*fres(:,20) +
185859599516SKenneth E. Jansen     &     fres(:,15)*fres(:,21)) )
185959599516SKenneth E. Jansen
186059599516SKenneth E. Jansen      xfac(:,4) = xlij(:,1)*fres(:,16) + xlij(:,2)*fres(:,17)
186159599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,18) +
186259599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,19) + xlij(:,5)*fres(:,20) +
186359599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,21))
186459599516SKenneth E. Jansen
186559599516SKenneth E. Jansen      xfac(:,5) = fres(:,16)*fres(:,16) + fres(:,17)*fres(:,17)
186659599516SKenneth E. Jansen     &     + fres(:,18)*fres(:,18) +
186759599516SKenneth E. Jansen     &     two*(fres(:,19)*fres(:,19) + fres(:,20)*fres(:,20) +
186859599516SKenneth E. Jansen     &     fres(:,21)*fres(:,21))
186959599516SKenneth E. Jansen
187059599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
187159599516SKenneth E. Jansen        do j = 1,numnp
187259599516SKenneth E. Jansen          i = iper(j)
187359599516SKenneth E. Jansen          if (i .ne. j) then
187459599516SKenneth E. Jansen            xnum(j) = zero
187559599516SKenneth E. Jansen            xden(j) = zero
187659599516SKenneth E. Jansen            xfac(j,:) = zero
187759599516SKenneth E. Jansen            xmij(j,:) = zero
187859599516SKenneth E. Jansen            xlij(j,:) = zero
187959599516SKenneth E. Jansen            fres(j,:) = zero
188059599516SKenneth E. Jansen            strnrm(j) = zero
188159599516SKenneth E. Jansen          endif
188259599516SKenneth E. Jansen        enddo
188359599516SKenneth E. Jansen
188459599516SKenneth E. Jansen      if (numpe.gt.1) then
188559599516SKenneth E. Jansen
188659599516SKenneth E. Jansen         numtask = ilwork(1)
188759599516SKenneth E. Jansen         itkbeg = 1
188859599516SKenneth E. Jansen
188959599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
189059599516SKenneth E. Jansen         do itask = 1, numtask
189159599516SKenneth E. Jansen
189259599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
189359599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
189459599516SKenneth E. Jansen
189559599516SKenneth E. Jansen            if (iacc .eq. 0) then
189659599516SKenneth E. Jansen               do is = 1,numseg
189759599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
189859599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
189959599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
190059599516SKenneth E. Jansen                  xnum(isgbeg:isgend) = zero
190159599516SKenneth E. Jansen                  xden(isgbeg:isgend) = zero
190259599516SKenneth E. Jansen                  strnrm(isgbeg:isgend) = zero
190359599516SKenneth E. Jansen                  xfac(isgbeg:isgend,:) = zero
190459599516SKenneth E. Jansen                  xmij(isgbeg:isgend,:) = zero
190559599516SKenneth E. Jansen                  xlij(isgbeg:isgend,:) = zero
190659599516SKenneth E. Jansen                  fres(isgbeg:isgend,:) = zero
190759599516SKenneth E. Jansen               enddo
190859599516SKenneth E. Jansen            endif
190959599516SKenneth E. Jansen
191059599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
191159599516SKenneth E. Jansen
191259599516SKenneth E. Jansen         enddo
191359599516SKenneth E. Jansen
191459599516SKenneth E. Jansen      endif
191559599516SKenneth E. Jansenc
191659599516SKenneth E. Jansenc Description of arrays.   Each processor has an array of length equal
191759599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect
191859599516SKenneth E. Jansenc the numerator and one to collect the denominator.  There is also an array
191959599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each
192059599516SKenneth E. Jansenc on processor node, ifath(nnshg).  Finally, there is an arry of length
192159599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons
192259599516SKenneth E. Jansenc for each father.
192359599516SKenneth E. Jansenc
192459599516SKenneth E. Jansenc  Now loop over nodes and accumlate the numerator and the denominator
192559599516SKenneth E. Jansenc  to the father nodes.  Only on processor addition at this point.
192659599516SKenneth E. Jansenc  Note that serrogate fathers are collect some for the case where some
192759599516SKenneth E. Jansenc  sons are on another processor
192859599516SKenneth E. Jansenc
192959599516SKenneth E. Jansen      xnude = zero
193059599516SKenneth E. Jansen      ynude = zero
193159599516SKenneth E. Jansen      xm    = zero
193259599516SKenneth E. Jansen      xl    = zero
193359599516SKenneth E. Jansen      xl1   = zero
193459599516SKenneth E. Jansen      xl2   = zero
193559599516SKenneth E. Jansen      ui    = zero
193659599516SKenneth E. Jansen      snorm = zero
193759599516SKenneth E. Jansen
193859599516SKenneth E. Jansen      do i = 1,nshg
193959599516SKenneth E. Jansen         xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i)
194059599516SKenneth E. Jansen         xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i)
194159599516SKenneth E. Jansen
194259599516SKenneth E. Jansen         ynude(ifath(i),1) = ynude(ifath(i),1) + xfac(i,1)
194359599516SKenneth E. Jansen         ynude(ifath(i),2) = ynude(ifath(i),2) + xfac(i,2)
194459599516SKenneth E. Jansen         ynude(ifath(i),3) = ynude(ifath(i),3) + xfac(i,3)
194559599516SKenneth E. Jansen         ynude(ifath(i),4) = ynude(ifath(i),4) + xfac(i,4)
194659599516SKenneth E. Jansen         ynude(ifath(i),5) = ynude(ifath(i),5) + xfac(i,5)
194759599516SKenneth E. Jansen
194859599516SKenneth E. Jansen         xm(ifath(i),1) = xm(ifath(i),1) + xmij(i,1)
194959599516SKenneth E. Jansen         xm(ifath(i),2) = xm(ifath(i),2) + xmij(i,2)
195059599516SKenneth E. Jansen         xm(ifath(i),3) = xm(ifath(i),3) + xmij(i,3)
195159599516SKenneth E. Jansen         xm(ifath(i),4) = xm(ifath(i),4) + xmij(i,4)
195259599516SKenneth E. Jansen         xm(ifath(i),5) = xm(ifath(i),5) + xmij(i,5)
195359599516SKenneth E. Jansen         xm(ifath(i),6) = xm(ifath(i),6) + xmij(i,6)
195459599516SKenneth E. Jansen
195559599516SKenneth E. Jansen         xl(ifath(i),1) = xl(ifath(i),1) + xlij(i,1)
195659599516SKenneth E. Jansen         xl(ifath(i),2) = xl(ifath(i),2) + xlij(i,2)
195759599516SKenneth E. Jansen         xl(ifath(i),3) = xl(ifath(i),3) + xlij(i,3)
195859599516SKenneth E. Jansen         xl(ifath(i),4) = xl(ifath(i),4) + xlij(i,4)
195959599516SKenneth E. Jansen         xl(ifath(i),5) = xl(ifath(i),5) + xlij(i,5)
196059599516SKenneth E. Jansen         xl(ifath(i),6) = xl(ifath(i),6) + xlij(i,6)
196159599516SKenneth E. Jansen
196259599516SKenneth E. Jansen         xl1(ifath(i),1) = xl1(ifath(i),1) + fres(i,4)
196359599516SKenneth E. Jansen         xl1(ifath(i),2) = xl1(ifath(i),2) + fres(i,5)
196459599516SKenneth E. Jansen         xl1(ifath(i),3) = xl1(ifath(i),3) + fres(i,6)
196559599516SKenneth E. Jansen         xl1(ifath(i),4) = xl1(ifath(i),4) + fres(i,7)
196659599516SKenneth E. Jansen         xl1(ifath(i),5) = xl1(ifath(i),5) + fres(i,8)
196759599516SKenneth E. Jansen         xl1(ifath(i),6) = xl1(ifath(i),6) + fres(i,9)
196859599516SKenneth E. Jansen
196959599516SKenneth E. Jansen         xl2(ifath(i),1) = xl2(ifath(i),1) + fres(i,1)*fres(i,1)
197059599516SKenneth E. Jansen         xl2(ifath(i),2) = xl2(ifath(i),2) + fres(i,2)*fres(i,2)
197159599516SKenneth E. Jansen         xl2(ifath(i),3) = xl2(ifath(i),3) + fres(i,3)*fres(i,3)
197259599516SKenneth E. Jansen         xl2(ifath(i),4) = xl2(ifath(i),4) + fres(i,1)*fres(i,2)
197359599516SKenneth E. Jansen         xl2(ifath(i),5) = xl2(ifath(i),5) + fres(i,1)*fres(i,3)
197459599516SKenneth E. Jansen         xl2(ifath(i),6) = xl2(ifath(i),6) + fres(i,2)*fres(i,3)
197559599516SKenneth E. Jansen
197659599516SKenneth E. Jansen         ui(ifath(i),1) = ui(ifath(i),1) + fres(i,1)
197759599516SKenneth E. Jansen         ui(ifath(i),2) = ui(ifath(i),2) + fres(i,2)
197859599516SKenneth E. Jansen         ui(ifath(i),3) = ui(ifath(i),3) + fres(i,3)
197959599516SKenneth E. Jansen
198059599516SKenneth E. Jansen         snorm(ifath(i)) = snorm(ifath(i)) + strnrm(i)
198159599516SKenneth E. Jansen
198259599516SKenneth E. Jansen      enddo
198359599516SKenneth E. Jansen
198459599516SKenneth E. Jansenc
198559599516SKenneth E. Jansenc Now  the true fathers and serrogates combine results and update
198659599516SKenneth E. Jansenc each other.
198759599516SKenneth E. Jansenc
198859599516SKenneth E. Jansen      if(numpe .gt. 1)then
198959599516SKenneth E. Jansen         call drvAllreduce(xnude, xnuder,2*nfath)
199059599516SKenneth E. Jansen         call drvAllreduce(ynude, ynuder,6*nfath)
199159599516SKenneth E. Jansen         call drvAllreduce(xm, xmr,6*nfath)
199259599516SKenneth E. Jansen         call drvAllreduce(xl, xlr,6*nfath)
199359599516SKenneth E. Jansen         call drvAllreduce(xl1, xl1r,6*nfath)
199459599516SKenneth E. Jansen         call drvAllreduce(xl2, xl2r,6*nfath)
199559599516SKenneth E. Jansen         call drvAllreduce(ui, uir,3*nfath)
199659599516SKenneth E. Jansen         call drvAllreduce(snorm, snormr,nfath)
199759599516SKenneth E. Jansen
199859599516SKenneth E. Jansen         do i = 1, nfath
199959599516SKenneth E. Jansen            ynuder(i,6) = ( ynuder(i,4) - fwr1*ynuder(i,2) ) /
200059599516SKenneth E. Jansen     &           ( two*ynuder(i,5) - four*fwr1*ynuder(i,3)
200159599516SKenneth E. Jansen     &           + two*fwr1*fwr1*ynuder(i,1) )
200259599516SKenneth E. Jansen         enddo
200359599516SKenneth E. Jansen
200459599516SKenneth E. Jansen         cdelsq2(:) = ynuder(ifath(:),6)  ! For comparison w/ cdelsq
200559599516SKenneth E. Jansenc
200659599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
200759599516SKenneth E. Jansenc
200859599516SKenneth E. Jansenc  xnuder is the sum of the sons for each father on all processor combined
200959599516SKenneth E. Jansenc  (the same as if we had not partitioned the mesh for each processor)
201059599516SKenneth E. Jansenc
201159599516SKenneth E. Jansenc   For each father we have precomputed the number of sons (including
201259599516SKenneth E. Jansenc   the sons off processor).
201359599516SKenneth E. Jansenc
201459599516SKenneth E. Jansenc   Now divide by number of sons to get the average (not really necessary
201559599516SKenneth E. Jansenc   for dynamic model since ratio will cancel nsons at each father)
201659599516SKenneth E. Jansenc
201759599516SKenneth E. Jansen         xnuder(:,1) = xnuder(:,1) / nsons(:)
201859599516SKenneth E. Jansen         xnuder(:,2) = xnuder(:,2) / nsons(:)
201959599516SKenneth E. Jansen
202059599516SKenneth E. Jansen         do m = 1, 5
202159599516SKenneth E. Jansen         ynuder(:,m) = ynuder(:,m)/nsons(:)
202259599516SKenneth E. Jansen         enddo
202359599516SKenneth E. Jansen         do m = 1,6
202459599516SKenneth E. Jansen         xmr(:,m) = xmr(:,m)/nsons(:)
202559599516SKenneth E. Jansen         xlr(:,m) = xlr(:,m)/nsons(:)
202659599516SKenneth E. Jansen         xl1r(:,m) = xl1r(:,m)/nsons(:)
202759599516SKenneth E. Jansen         xl2r(:,m) = xl2r(:,m)/nsons(:)
202859599516SKenneth E. Jansen         enddo
202959599516SKenneth E. Jansen
203059599516SKenneth E. Jansen         uir(:,1) = uir(:,1)/nsons(:)
203159599516SKenneth E. Jansen         uir(:,2) = uir(:,2)/nsons(:)
203259599516SKenneth E. Jansen         uir(:,3) = uir(:,3)/nsons(:)
203359599516SKenneth E. Jansen
203459599516SKenneth E. Jansen         snormr(:) = snormr(:)/nsons(:)
203559599516SKenneth E. Jansenc
203659599516SKenneth E. Jansencc  the next line is c \Delta^2
203759599516SKenneth E. Jansencc
203859599516SKenneth E. Jansencc         xnuder(:,1) = xnuder(:,1) / (xnuder(:,2) + 1.d-09)
203959599516SKenneth E. Jansencc         do i = 1,nshg
204059599516SKenneth E. Jansencc            cdelsq(i) = xnuder(ifath(i),1)
204159599516SKenneth E. Jansencc         enddo
204259599516SKenneth E. Jansen
204359599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnuder(ifath(:),1)
204459599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnuder(ifath(:),2)
204559599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
204659599516SKenneth E. Jansen
204759599516SKenneth E. Jansenc            cdelsq(:) = xnuder(ifath(:),1)/(xnuder(ifath(:),2)+1.d-09)
204859599516SKenneth E. Jansen
204959599516SKenneth E. Jansen            xnd(:,1) = xnd(:,1) + xnuder(:,1)
205059599516SKenneth E. Jansen            xnd(:,2) = xnd(:,2) + xnuder(:,2)
205159599516SKenneth E. Jansen
205259599516SKenneth E. Jansen            xmodcomp(:,1) = xmodcomp(:,1)+ynuder(:,1)
205359599516SKenneth E. Jansen            xmodcomp(:,2) = xmodcomp(:,2)+ynuder(:,2)
205459599516SKenneth E. Jansen            xmodcomp(:,3) = xmodcomp(:,3)+ynuder(:,3)
205559599516SKenneth E. Jansen            xmodcomp(:,4) = xmodcomp(:,4)+ynuder(:,4)
205659599516SKenneth E. Jansen            xmodcomp(:,5) = xmodcomp(:,5)+ynuder(:,5)
205759599516SKenneth E. Jansen
205859599516SKenneth E. Jansen            xmcomp(:,:) = xmcomp(:,:)+xmr(:,:)
205959599516SKenneth E. Jansen            xlcomp(:,:) = xlcomp(:,:)+xlr(:,:)
206059599516SKenneth E. Jansen
206159599516SKenneth E. Jansen            xl1comp(:,:) = xl1comp(:,:)+xl1r(:,:)
206259599516SKenneth E. Jansen            xl2comp(:,:) = xl2comp(:,:)+xl2r(:,:)
206359599516SKenneth E. Jansen
206459599516SKenneth E. Jansen            ucomp(:,:) = ucomp(:,:)+uir(:,:)
206559599516SKenneth E. Jansen            u1 = uir(32,1)
206659599516SKenneth E. Jansen            scomp(:)   = scomp(:)+snormr(:)
206759599516SKenneth E. Jansen
206859599516SKenneth E. Jansen      else
206959599516SKenneth E. Jansen
207059599516SKenneth E. Jansen         xnude(:,1) = xnude(:,1)/nsons(:)
207159599516SKenneth E. Jansen         xnude(:,2) = xnude(:,2)/nsons(:)
207259599516SKenneth E. Jansen
207359599516SKenneth E. Jansen         do m = 1, 5
207459599516SKenneth E. Jansen         ynude(:,m) = ynude(:,m)/nsons(:)
207559599516SKenneth E. Jansen         enddo
207659599516SKenneth E. Jansen         do m = 1,6
207759599516SKenneth E. Jansen         xm(:,m) = xm(:,m)/nsons(:)
207859599516SKenneth E. Jansen         xl(:,m) = xl(:,m)/nsons(:)
207959599516SKenneth E. Jansen         xl1(:,m) = xl1(:,m)/nsons(:)
208059599516SKenneth E. Jansen         xl2(:,m) = xl2(:,m)/nsons(:)
208159599516SKenneth E. Jansen         enddo
208259599516SKenneth E. Jansen
208359599516SKenneth E. Jansen         ui(:,1) = ui(:,1)/nsons(:)
208459599516SKenneth E. Jansen         ui(:,2) = ui(:,2)/nsons(:)
208559599516SKenneth E. Jansen         ui(:,3) = ui(:,3)/nsons(:)
208659599516SKenneth E. Jansen
208759599516SKenneth E. Jansen         snorm(:) = snorm(:)/nsons(:)
208859599516SKenneth E. Jansen
208959599516SKenneth E. Jansenc
209059599516SKenneth E. Jansenc     the next line is c \Delta^2, not nu_T but we want to save the
209159599516SKenneth E. Jansenc     memory
209259599516SKenneth E. Jansenc
209359599516SKenneth E. Jansen
209459599516SKenneth E. Jansencc         xnude(:,1) = xnude(:,1) / (xnude(:,2) + 1.d-09)
209559599516SKenneth E. Jansencc        do i = 1,nshg
209659599516SKenneth E. Jansencc            cdelsq(i) = xnude(ifath(i),1)
209759599516SKenneth E. Jansencc         enddo
209859599516SKenneth E. Jansencc      endif
209959599516SKenneth E. Jansen
210059599516SKenneth E. Jansen         do i = 1, nfath
210159599516SKenneth E. Jansen            ynude(i,6) = ( ynude(i,4) - fwr1*ynude(i,2) ) /
210259599516SKenneth E. Jansen     &           ( two*ynude(i,5) - four*fwr1*ynude(i,3)
210359599516SKenneth E. Jansen     &           + fwr1*fwr1*ynude(i,1) )
210459599516SKenneth E. Jansen         enddo
210559599516SKenneth E. Jansen
210659599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnude(ifath(:),1)
210759599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnude(ifath(:),2)
210859599516SKenneth E. Jansen
210959599516SKenneth E. Jansen            xnd(:,1) = xnd(:,1)+xnude(:,1)
211059599516SKenneth E. Jansen            xnd(:,2) = xnd(:,2)+xnude(:,2)
211159599516SKenneth E. Jansen
211259599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
211359599516SKenneth E. Jansen
211459599516SKenneth E. Jansenc            cdelsq(:) = xnude(ifath(:),1)/(xnude(ifath(:),2))!+1.d-09)
211559599516SKenneth E. Jansen
211659599516SKenneth E. Jansen
211759599516SKenneth E. Jansen          cdelsq2(:) = ynude(ifath(:),6)  ! For comparison w/ cdelsq
211859599516SKenneth E. Jansen
211959599516SKenneth E. Jansen            xmodcomp(:,1) = xmodcomp(:,1)+ynude(:,1)
212059599516SKenneth E. Jansen            xmodcomp(:,2) = xmodcomp(:,2)+ynude(:,2)
212159599516SKenneth E. Jansen            xmodcomp(:,3) = xmodcomp(:,3)+ynude(:,3)
212259599516SKenneth E. Jansen            xmodcomp(:,4) = xmodcomp(:,4)+ynude(:,4)
212359599516SKenneth E. Jansen            xmodcomp(:,5) = xmodcomp(:,5)+ynude(:,5)
212459599516SKenneth E. Jansen
212559599516SKenneth E. Jansen            xmcomp(:,:) = xmcomp(:,:)+xm(:,:)
212659599516SKenneth E. Jansen            xlcomp(:,:) = xlcomp(:,:)+xl(:,:)
212759599516SKenneth E. Jansen
212859599516SKenneth E. Jansen            xl1comp(:,:) = xl1comp(:,:)+xl1(:,:)
212959599516SKenneth E. Jansen            xl2comp(:,:) = xl2comp(:,:)+xl2(:,:)
213059599516SKenneth E. Jansen
213159599516SKenneth E. Jansen            ucomp(:,:) = ucomp(:,:)+ui(:,:)
213259599516SKenneth E. Jansen            scomp(:)   = scomp(:)+snorm(:)
213359599516SKenneth E. Jansen
213459599516SKenneth E. Jansen         endif
213559599516SKenneth E. Jansen
213659599516SKenneth E. Jansenc         do i = 1, nfath
213759599516SKenneth E. Jansenc            xmodcomp(i,:) = xmodcomp(i,:)/nsons(i)
213859599516SKenneth E. Jansenc            xmcomp(i,:) = xmcomp(i,:)/nsons(i)
213959599516SKenneth E. Jansenc            xlcomp(i,:) = xlcomp(i,:)/nsons(i)
214059599516SKenneth E. Jansenc            xl2comp(i,:) = xl2comp(i,:)/nsons(i)
214159599516SKenneth E. Jansenc            xl1comp(i,:) = xl1comp(i,:)/nsons(i)
214259599516SKenneth E. Jansenc            xnd(i,:) = xnd(i,:)/nsons(i)
214359599516SKenneth E. Jansenc            scomp(i) = scomp(i)/nsons(i)
214459599516SKenneth E. Jansenc            ucomp(i,:) = ucomp(i,:)/nsons(i)
214559599516SKenneth E. Jansenc         enddo
214659599516SKenneth E. Jansen
214759599516SKenneth E. Jansen         if (myrank .eq. master) then
214859599516SKenneth E. Jansen            write(*,*)'istep, nstep=', istep, nstep(1)
214959599516SKenneth E. Jansen         endif
215059599516SKenneth E. Jansen
215159599516SKenneth E. Jansen         if ( istep .eq. (nstep(1)-1) ) then
215259599516SKenneth E. Jansen         if ( myrank .eq. master) then
215359599516SKenneth E. Jansen
215459599516SKenneth E. Jansen            do i = 1, nfath
215559599516SKenneth E. Jansen            write(365,*)xmodcomp(i,1),xmodcomp(i,2),xmodcomp(i,3),
215659599516SKenneth E. Jansen     &              xmodcomp(i,4),xmodcomp(i,5)
215759599516SKenneth E. Jansen
215859599516SKenneth E. Jansen            write(366,*)xmcomp(i,1),xmcomp(i,2),xmcomp(i,3)
215959599516SKenneth E. Jansen            write(367,*)xmcomp(i,4),xmcomp(i,5),xmcomp(i,6)
216059599516SKenneth E. Jansen
216159599516SKenneth E. Jansen            write(368,*)xlcomp(i,1),xlcomp(i,2),xlcomp(i,3)
216259599516SKenneth E. Jansen            write(369,*)xlcomp(i,4),xlcomp(i,5),xlcomp(i,6)
216359599516SKenneth E. Jansen
216459599516SKenneth E. Jansen            write(370,*)xl1comp(i,1),xl1comp(i,2),xl1comp(i,3)
216559599516SKenneth E. Jansen            write(371,*)xl1comp(i,4),xl1comp(i,5),xl1comp(i,6)
216659599516SKenneth E. Jansen
216759599516SKenneth E. Jansen            write(372,*)xl2comp(i,1),xl2comp(i,2),xl2comp(i,3)
216859599516SKenneth E. Jansen            write(373,*)xl2comp(i,4),xl2comp(i,5),xl2comp(i,6)
216959599516SKenneth E. Jansen
217059599516SKenneth E. Jansen            write(374,*)xnd(i,1),xnd(i,2),scomp(i)
217159599516SKenneth E. Jansen            write(375,*)ucomp(i,1),ucomp(i,2),ucomp(i,3)
217259599516SKenneth E. Jansen            enddo
217359599516SKenneth E. Jansen
217459599516SKenneth E. Jansen            call flush(365)
217559599516SKenneth E. Jansen            call flush(366)
217659599516SKenneth E. Jansen            call flush(367)
217759599516SKenneth E. Jansen            call flush(368)
217859599516SKenneth E. Jansen            call flush(369)
217959599516SKenneth E. Jansen            call flush(370)
218059599516SKenneth E. Jansen            call flush(371)
218159599516SKenneth E. Jansen            call flush(372)
218259599516SKenneth E. Jansen            call flush(373)
218359599516SKenneth E. Jansen            call flush(374)
218459599516SKenneth E. Jansen            call flush(375)
218559599516SKenneth E. Jansen
218659599516SKenneth E. Jansenc            close(852)
218759599516SKenneth E. Jansenc            close(853)
218859599516SKenneth E. Jansenc            close(854)
218959599516SKenneth E. Jansen
219059599516SKenneth E. Jansen         endif
219159599516SKenneth E. Jansen         endif
219259599516SKenneth E. Jansen
219359599516SKenneth E. Jansen            if (myrank .eq. master) then
219459599516SKenneth E. Jansen               write(*,*)'uit uic=', ucomp(32,1),u1
219559599516SKenneth E. Jansen            endif
219659599516SKenneth E. Jansen
219759599516SKenneth E. Jansen 555     format(e14.7,4(2x,e14.7))
219859599516SKenneth E. Jansen 556     format(e14.7,5(2x,e14.7))
219959599516SKenneth E. Jansen
220059599516SKenneth E. Jansen
220159599516SKenneth E. Jansen
220259599516SKenneth E. Jansen
220359599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
220459599516SKenneth E. Jansen      tmp1 =  MINVAL(cdelsq)
220559599516SKenneth E. Jansen      tmp2 =  MAXVAL(cdelsq)
220659599516SKenneth E. Jansen      if(numpe>1) then
220759599516SKenneth E. Jansen         call MPI_REDUCE (tmp1, tmp3, 1,MPI_DOUBLE_PRECISION,
220859599516SKenneth E. Jansen     &        MPI_MIN, master, MPI_COMM_WORLD, ierr)
220959599516SKenneth E. Jansen         call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
221059599516SKenneth E. Jansen     &        MPI_MAX, master, MPI_COMM_WORLD, ierr)
221159599516SKenneth E. Jansen         tmp1=tmp3
221259599516SKenneth E. Jansen         tmp2=tmp4
221359599516SKenneth E. Jansen      endif
221459599516SKenneth E. Jansen      if (myrank .EQ. master) then !print CDelta^2 range
221559599516SKenneth E. Jansen         write(34,*)lstep,tmp1,tmp2
221659599516SKenneth E. Jansen         call flush(34)
221759599516SKenneth E. Jansen      endif
221859599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
221959599516SKenneth E. Jansen
222059599516SKenneth E. Jansen      if (myrank .eq. master) then
222159599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq(1),cdelsq(2)
222259599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq2(1),cdelsq2(2)
222359599516SKenneth E. Jansen         write(22,*) lstep, cdelsq(1)
222459599516SKenneth E. Jansen         call flush(22)
222559599516SKenneth E. Jansen      endif
222659599516SKenneth E. Jansen
222759599516SKenneth E. Jansen      do iblk = 1,nelblk
222859599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
222959599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
223059599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
223159599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
223259599516SKenneth E. Jansen         inum  = iel + npro - 1
223359599516SKenneth E. Jansen
223459599516SKenneth E. Jansen         ngauss = nint(lcsyst)
223559599516SKenneth E. Jansen
223659599516SKenneth E. Jansen         call scatnu (mien(iblk)%p, strl(iel:inum,:),
223759599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:))
223859599516SKenneth E. Jansen      enddo
223959599516SKenneth E. Jansenc     $$$$$$$$$$$$$$$$$$$$$$$$$$$
224059599516SKenneth E. Jansenc$$$  tmp1 =  MINVAL(xmudmi)
224159599516SKenneth E. Jansenc$$$  tmp2 =  MAXVAL(xmudmi)
224259599516SKenneth E. Jansenc$$$  if(numpe>1) then
224359599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION,
224459599516SKenneth E. Jansenc$$$  &                 MPI_MIN, master, MPI_COMM_WORLD, ierr)
224559599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
224659599516SKenneth E. Jansenc$$$  &                 MPI_MAX, master, MPI_COMM_WORLD, ierr)
224759599516SKenneth E. Jansenc$$$      tmp1=tmp3
224859599516SKenneth E. Jansenc$$$  tmp2=tmp4
224959599516SKenneth E. Jansenc$$$  endif
225059599516SKenneth E. Jansenc$$$  if (myrank .EQ. master) then
225159599516SKenneth E. Jansenc$$$  write(35,*) lstep,tmp1,tmp2
225259599516SKenneth E. Jansenc$$$  call flush(35)
225359599516SKenneth E. Jansenc$$$  endif
225459599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
225559599516SKenneth E. Jansen
225659599516SKenneth E. Jansenc
225759599516SKenneth E. Jansenc  if flag set, write a restart file with info (reuse xmij's memory)
225859599516SKenneth E. Jansenc
225959599516SKenneth E. Jansen      if(irs.eq.11) then
226059599516SKenneth E. Jansen         lstep=999
226159599516SKenneth E. Jansen         xmij(:,1)=xnum(:)
226259599516SKenneth E. Jansen         xmij(:,2)=xden(:)
226359599516SKenneth E. Jansen         xmij(:,3)=cdelsq(:)
226459599516SKenneth E. Jansen         xmij(:,5)=xlij(:,4)    !leave M_{12} in 4 and put L_{12} here
226559599516SKenneth E. Jansen         call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac
226659599516SKenneth E. Jansen         stop
226759599516SKenneth E. Jansen      endif
226859599516SKenneth E. Jansenc
226959599516SKenneth E. Jansenc  local clipping moved to scatnu with the creation of mxmudmi pointers
227059599516SKenneth E. Jansenc
227159599516SKenneth E. Jansenc$$$      rmu=datmat(1,2,1)
227259599516SKenneth E. Jansenc$$$      xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu
227359599516SKenneth E. Jansenc$$$      xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0
227459599516SKenneth E. Jansenc      stop !uncomment to test dmod
227559599516SKenneth E. Jansenc
227659599516SKenneth E. Jansen
227759599516SKenneth E. Jansen
227859599516SKenneth E. Jansenc  write out the nodal values of xnut (estimate since we don't calc strain
227959599516SKenneth E. Jansenc  there and must use the filtered strain).
228059599516SKenneth E. Jansenc
228159599516SKenneth E. Jansen
228259599516SKenneth E. Jansen      if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
228359599516SKenneth E. Jansenc
228459599516SKenneth E. Jansenc  collect the average strain into xnude(2)
228559599516SKenneth E. Jansenc
228659599516SKenneth E. Jansen         xnude(:,2) = zero
228759599516SKenneth E. Jansen         do i = 1,numnp
228859599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + strnrm(i)
228959599516SKenneth E. Jansen         enddo
229059599516SKenneth E. Jansen
229159599516SKenneth E. Jansen         if(numpe .gt. 1) then
229259599516SKenneth E. Jansen             call drvAllreduce(xnude(:,2), xnuder(:,2),nfath)
229359599516SKenneth E. Jansen          else
229459599516SKenneth E. Jansen             xnuder=xnude
229559599516SKenneth E. Jansen          endif
229659599516SKenneth E. Jansenc
229759599516SKenneth E. Jansenc          nut= cdelsq    * |S|
229859599516SKenneth E. Jansenc
229959599516SKenneth E. Jansen         xnutf=xnuder(:,1)*xnuder(:,2)/nsons(:)
230059599516SKenneth E. Jansenc
230159599516SKenneth E. Jansenc  collect the x and y coords into xnude
230259599516SKenneth E. Jansenc
230359599516SKenneth E. Jansen         xnude = zero
230459599516SKenneth E. Jansen         do i = 1,numnp
230559599516SKenneth E. Jansen            xnude(ifath(i),1) = xnude(ifath(i),1) + x(i,1)
230659599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + x(i,2)
230759599516SKenneth E. Jansen         enddo
230859599516SKenneth E. Jansen
230959599516SKenneth E. Jansen         if(numpe .gt. 1)
231059599516SKenneth E. Jansen     &        call drvAllreduce(xnude, xnuder,2*nfath)
231159599516SKenneth E. Jansen         xnuder(:,1)=xnuder(:,1)/nsons(:)
231259599516SKenneth E. Jansen         xnuder(:,2)=xnuder(:,2)/nsons(:)
231359599516SKenneth E. Jansenc
231459599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
231559599516SKenneth E. Jansenc
231659599516SKenneth E. Jansen         if((myrank.eq.master)) then
231759599516SKenneth E. Jansen            do i=1,nfath      ! cdelsq   * |S|
231859599516SKenneth E. Jansen               write(444,*) xnuder(i,1),xnuder(i,2),xnutf(i)
231959599516SKenneth E. Jansen            enddo
232059599516SKenneth E. Jansen            call flush(444)
232159599516SKenneth E. Jansen         endif
232259599516SKenneth E. Jansen      endif
232359599516SKenneth E. Jansen
232459599516SKenneth E. Jansen      return
232559599516SKenneth E. Jansen      end
232659599516SKenneth E. Jansen      subroutine widefdmc (y,      shgl,      shp,
232759599516SKenneth E. Jansen     &                   iper,   ilwork,
232859599516SKenneth E. Jansen     &                   nsons,  ifath,     x)
232959599516SKenneth E. Jansen
233059599516SKenneth E. Jansen      use pointer_data
233159599516SKenneth E. Jansen
233259599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
233359599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
233459599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
233559599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
233659599516SKenneth E. Jansenc                    for computing the dmod. Qwtf contains the weights of the
233759599516SKenneth E. Jansenc                    quad. points.
233859599516SKenneth E. Jansen
233959599516SKenneth E. Jansen      include "common.h"
234059599516SKenneth E. Jansen      include "mpif.h"
234159599516SKenneth E. Jansen      include "auxmpi.h"
234259599516SKenneth E. Jansen
234359599516SKenneth E. Jansenc
234459599516SKenneth E. Jansen      dimension fres(nshg,33),         fwr(nshg),
234559599516SKenneth E. Jansen     &          strnrm(nshg),         cdelsq(nshg),
234659599516SKenneth E. Jansen     &          cdelsq2(nshg),
234759599516SKenneth E. Jansen     &          xnum(nshg),           xden(nshg),
234859599516SKenneth E. Jansen     &          xmij(nshg,6),         xlij(nshg,6),
234959599516SKenneth E. Jansen     &          xnude(nfath,2),        xnuder(nfath,2),
235059599516SKenneth E. Jansen     &          ynude(nfath,6),        ynuder(nfath,6),
235159599516SKenneth E. Jansen     &          ui(nfath,3),           snorm(nfath),
235259599516SKenneth E. Jansen     &          uir(nfath,3),          snormr(nfath)
235359599516SKenneth E. Jansen      dimension xm(nfath,6),           xl(nfath,6),
235459599516SKenneth E. Jansen     &          xl1(nfath,6),          xl2(nfath,6),
235559599516SKenneth E. Jansen     &          xl1r(nfath,6),         xl2r(nfath,6),
235659599516SKenneth E. Jansen     &          xmr(nfath,6),          xlr(nfath,6),
235759599516SKenneth E. Jansen     &          nsons(nshg),
235859599516SKenneth E. Jansen     &          strl(numel,ngauss),
235959599516SKenneth E. Jansen     &          y(nshg,5),            yold(nshg,5),
236059599516SKenneth E. Jansen     &          ifath(nshg),          iper(nshg),
236159599516SKenneth E. Jansen     &          ilwork(nlwork),
236259599516SKenneth E. Jansen     &          x(numnp,3)
236359599516SKenneth E. Jansen      dimension shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
236459599516SKenneth E. Jansen     &          xnutf(nfath),
236559599516SKenneth E. Jansen     &          hfres(nshg,22),
236659599516SKenneth E. Jansen     &          xfac(nshg,5)
236759599516SKenneth E. Jansen
236859599516SKenneth E. Jansen      character*10 cname
236959599516SKenneth E. Jansen      character*30 fname1, fname2, fname3, fname4, fname5, fname6
237059599516SKenneth E. Jansenc
237159599516SKenneth E. Jansen
237259599516SKenneth E. Jansenc
237359599516SKenneth E. Jansenc
237459599516SKenneth E. Jansenc   setup the weights for time averaging of cdelsq (now in quadfilt module)
237559599516SKenneth E. Jansenc
237659599516SKenneth E. Jansen
237759599516SKenneth E. Jansen      denom=max(1.0d0*(lstep),one)
237859599516SKenneth E. Jansen      if(dtavei.lt.0) then
237959599516SKenneth E. Jansen         wcur=one/denom
238059599516SKenneth E. Jansen      else
238159599516SKenneth E. Jansen         wcur=dtavei
238259599516SKenneth E. Jansen      endif
238359599516SKenneth E. Jansen      whist=1.0-wcur
238459599516SKenneth E. Jansen
238559599516SKenneth E. Jansen      if (myrank .eq. master) then
238659599516SKenneth E. Jansen         write(*,*)'istep=', istep
238759599516SKenneth E. Jansen      endif
238859599516SKenneth E. Jansen
238959599516SKenneth E. Jansen      if (istep .eq. 0) then
239059599516SKenneth E. Jansen         xnd      = zero
239159599516SKenneth E. Jansen         xmodcomp = zero
239259599516SKenneth E. Jansen         xmcomp  = zero
239359599516SKenneth E. Jansen         xlcomp  = zero
239459599516SKenneth E. Jansen         xl1comp  = zero
239559599516SKenneth E. Jansen         xl2comp  = zero
239659599516SKenneth E. Jansen         ucomp    = zero
239759599516SKenneth E. Jansen         scomp    = zero
239859599516SKenneth E. Jansen      endif
239959599516SKenneth E. Jansen
240059599516SKenneth E. Jansen
240159599516SKenneth E. Jansen      fres = zero
240259599516SKenneth E. Jansen      hfres = zero
240359599516SKenneth E. Jansen
240459599516SKenneth E. Jansen      yold(:,1)=y(:,4)
240559599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
240659599516SKenneth E. Jansen
240759599516SKenneth E. Jansenc
240859599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
240959599516SKenneth E. Jansenc
241059599516SKenneth E. Jansenc      yold(:,5) = 1.0  ! Debugging
241159599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2)
241259599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
241359599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
241459599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
241559599516SKenneth E. Jansenc                               suitable for the
241659599516SKenneth E. Jansen
241759599516SKenneth E. Jansen      do iblk = 1,nelblk
241859599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
241959599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
242059599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
242159599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
242259599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
242359599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
242459599516SKenneth E. Jansen        inum  = iel + npro - 1
242559599516SKenneth E. Jansen
242659599516SKenneth E. Jansen        ngauss = nint(lcsyst)
242759599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
242859599516SKenneth E. Jansen
242959599516SKenneth E. Jansenc        call hfilterBB (yold, x, mien(iblk)%p, hfres,
243059599516SKenneth E. Jansenc     &               shglf(lcsyst,:,1:nshl,:),
243159599516SKenneth E. Jansenc     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
243259599516SKenneth E. Jansen
243359599516SKenneth E. Jansen        call hfilterCC (yold, x, mien(iblk)%p, hfres,
243459599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
243559599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
243659599516SKenneth E. Jansen
243759599516SKenneth E. Jansen      enddo
243859599516SKenneth E. Jansen
243959599516SKenneth E. Jansen      if(numpe>1) call commu (hfres, ilwork, 22, 'in ')
244059599516SKenneth E. Jansenc
244159599516SKenneth E. Jansenc... account for periodicity in filtered variables
244259599516SKenneth E. Jansenc
244359599516SKenneth E. Jansen      do j = 1,nshg  !    Add on-processor slave contribution to masters
244459599516SKenneth E. Jansen        i = iper(j)
244559599516SKenneth E. Jansen        if (i .ne. j) then
244659599516SKenneth E. Jansen           hfres(i,:) = hfres(i,:) + hfres(j,:)
244759599516SKenneth E. Jansen        endif
244859599516SKenneth E. Jansen      enddo
244959599516SKenneth E. Jansen      do j = 1,nshg ! Set on-processor slaves to be the same as masters
245059599516SKenneth E. Jansen        i = iper(j)
245159599516SKenneth E. Jansen        if (i .ne. j) then
245259599516SKenneth E. Jansen           hfres(j,:) = hfres(i,:)
245359599516SKenneth E. Jansen        endif
245459599516SKenneth E. Jansen      enddo
245559599516SKenneth E. Jansen
245659599516SKenneth E. Jansenc... Set off-processor slaves to be the same as their masters
245759599516SKenneth E. Jansen
245859599516SKenneth E. Jansen      if(numpe>1)   call commu (hfres, ilwork, 22, 'out')
245959599516SKenneth E. Jansen
246059599516SKenneth E. Jansen
246159599516SKenneth E. Jansen      hfres(:,16) = one / hfres(:,16) ! one/(volume filter kernel)
246259599516SKenneth E. Jansen
246359599516SKenneth E. Jansen      do j = 1, 15
246459599516SKenneth E. Jansen	hfres(:,j) = hfres(:,j) * hfres(:,16)
246559599516SKenneth E. Jansen      enddo
246659599516SKenneth E. Jansen      do j = 17, 22
246759599516SKenneth E. Jansen	hfres(:,j) = hfres(:,j) * hfres(:,16)
246859599516SKenneth E. Jansen      enddo
246959599516SKenneth E. Jansen
247059599516SKenneth E. Jansenc... For debugging
247159599516SKenneth E. Jansen
247259599516SKenneth E. Jansenc      hfres(:,1) = 2.0*x(:,1) - 3.0*x(:,2)
247359599516SKenneth E. Jansenc      hfres(:,2) = 3.0*x(:,1) + 4.0*x(:,2)
247459599516SKenneth E. Jansenc      hfres(:,3) = 4.0*x(:,1) + x(:,2) + x(:,3)
247559599516SKenneth E. Jansen
247659599516SKenneth E. Jansenc... Done w/ h-filtering. Begin 2h-filtering.
247759599516SKenneth E. Jansen
247859599516SKenneth E. Jansen      do iblk = 1,nelblk
247959599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
248059599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
248159599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
248259599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
248359599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
248459599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
248559599516SKenneth E. Jansen        inum  = iel + npro - 1
248659599516SKenneth E. Jansen
248759599516SKenneth E. Jansen        ngauss = nint(lcsyst)
248859599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
248959599516SKenneth E. Jansen
249059599516SKenneth E. Jansen        call twohfilterBB (yold, x, strl(iel:inum,:), mien(iblk)%p,
249159599516SKenneth E. Jansen     &               fres, hfres, shglf(lcsyst,:,1:nshl,:),
249259599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
249359599516SKenneth E. Jansen
249459599516SKenneth E. Jansen      enddo
249559599516SKenneth E. Jansenc
249659599516SKenneth E. Jansen
249759599516SKenneth E. Jansen
249859599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 33, 'in ')
249959599516SKenneth E. Jansenc
250059599516SKenneth E. Jansenc account for periodicity in filtered variables
250159599516SKenneth E. Jansenc
250259599516SKenneth E. Jansen      do j = 1,nshg
250359599516SKenneth E. Jansen        i = iper(j)
250459599516SKenneth E. Jansen        if (i .ne. j) then
250559599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
250659599516SKenneth E. Jansen        endif
250759599516SKenneth E. Jansen      enddo
250859599516SKenneth E. Jansen
250959599516SKenneth E. Jansen      do j = 1,nshg
251059599516SKenneth E. Jansen        i = iper(j)
251159599516SKenneth E. Jansen        if (i .ne. j) then
251259599516SKenneth E. Jansen           fres(j,:) = fres(i,:)
251359599516SKenneth E. Jansen        endif
251459599516SKenneth E. Jansen      enddo
251559599516SKenneth E. Jansen
251659599516SKenneth E. Jansen      if(numpe>1)then
251759599516SKenneth E. Jansen         call commu (fres, ilwork, 33, 'out')
251859599516SKenneth E. Jansen      endif
251959599516SKenneth E. Jansen
252059599516SKenneth E. Jansen      fres(:,22) = one / fres(:,22)
252159599516SKenneth E. Jansen      do j = 1,21
252259599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,22)
252359599516SKenneth E. Jansen      enddo
252459599516SKenneth E. Jansen      do j = 23,33
252559599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,22)
252659599516SKenneth E. Jansen      enddo
252759599516SKenneth E. Jansen
252859599516SKenneth E. Jansen
252959599516SKenneth E. Jansen      do iblk = 1,nelblk
253059599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
253159599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
253259599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
253359599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
253459599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
253559599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
253659599516SKenneth E. Jansen        inum  = iel + npro - 1
253759599516SKenneth E. Jansen
253859599516SKenneth E. Jansen        ngauss = nint(lcsyst)
253959599516SKenneth E. Jansen
254059599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
254159599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
254259599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
254359599516SKenneth E. Jansen
254459599516SKenneth E. Jansen      enddo
254559599516SKenneth E. Jansen
254659599516SKenneth E. Jansenc
254759599516SKenneth E. Jansenc... Obtain the hat-tilde strain rate norm at the nodes
254859599516SKenneth E. Jansenc
254959599516SKenneth E. Jansen
255059599516SKenneth E. Jansen      strnrm = sqrt(
255159599516SKenneth E. Jansen     &  two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2)
255259599516SKenneth E. Jansen     &  + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
255359599516SKenneth E. Jansen
255459599516SKenneth E. Jansen      fwr = fwr1 * strnrm
255559599516SKenneth E. Jansen
255659599516SKenneth E. Jansen      xmij(:,1) = -fwr
255759599516SKenneth E. Jansen     &             * fres(:,10) + fres(:,16)
255859599516SKenneth E. Jansen      xmij(:,2) = -fwr
255959599516SKenneth E. Jansen     &             * fres(:,11) + fres(:,17)
256059599516SKenneth E. Jansen      xmij(:,3) = -fwr
256159599516SKenneth E. Jansen     &             * fres(:,12) + fres(:,18)
256259599516SKenneth E. Jansen
256359599516SKenneth E. Jansen      xmij(:,4) = -fwr * fres(:,13) + fres(:,19)
256459599516SKenneth E. Jansen      xmij(:,5) = -fwr * fres(:,14) + fres(:,20)
256559599516SKenneth E. Jansen      xmij(:,6) = -fwr * fres(:,15) + fres(:,21)
256659599516SKenneth E. Jansen
256759599516SKenneth E. Jansen
256859599516SKenneth E. Jansen      xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1)
256959599516SKenneth E. Jansen      xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2)
257059599516SKenneth E. Jansen      xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3)
257159599516SKenneth E. Jansen      xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2)
257259599516SKenneth E. Jansen      xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3)
257359599516SKenneth E. Jansen      xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3)
257459599516SKenneth E. Jansen
257559599516SKenneth E. Jansen      xnum =        xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2)
257659599516SKenneth E. Jansen     &                                    + xlij(:,3) * xmij(:,3)
257759599516SKenneth E. Jansen     &     + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5)
257859599516SKenneth E. Jansen     &                                    + xlij(:,6) * xmij(:,6))
257959599516SKenneth E. Jansen      xden =        xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2)
258059599516SKenneth E. Jansen     &                                    + xmij(:,3) * xmij(:,3)
258159599516SKenneth E. Jansen     &     + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5)
258259599516SKenneth E. Jansen     &                                    + xmij(:,6) * xmij(:,6))
258359599516SKenneth E. Jansen      xden = two * xden
258459599516SKenneth E. Jansen
258559599516SKenneth E. Jansenc... For collectection of statistics on dyn. model components
258659599516SKenneth E. Jansen
258759599516SKenneth E. Jansen      xfac(:,1) = strnrm*strnrm*( fres(:,10)**2 + fres(:,11)**2 +
258859599516SKenneth E. Jansen     &     fres(:,12)**2
258959599516SKenneth E. Jansen     &     + two*( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
259059599516SKenneth E. Jansen
259159599516SKenneth E. Jansen      xfac(:,2) = strnrm*( xlij(:,1)*fres(:,10) + xlij(:,2)*fres(:,11)
259259599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,12) +
259359599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,13) + xlij(:,5)*fres(:,14) +
259459599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,15)) )
259559599516SKenneth E. Jansen
259659599516SKenneth E. Jansen      xfac(:,3) = strnrm*( fres(:,10)*fres(:,16) + fres(:,11)*fres(:,17)
259759599516SKenneth E. Jansen     &     + fres(:,12)*fres(:,18) +
259859599516SKenneth E. Jansen     &     two*(fres(:,13)*fres(:,19) + fres(:,14)*fres(:,20) +
259959599516SKenneth E. Jansen     &     fres(:,15)*fres(:,21)) )
260059599516SKenneth E. Jansen
260159599516SKenneth E. Jansen      xfac(:,4) = xlij(:,1)*fres(:,16) + xlij(:,2)*fres(:,17)
260259599516SKenneth E. Jansen     &     + xlij(:,3)*fres(:,18) +
260359599516SKenneth E. Jansen     &     two*(xlij(:,4)*fres(:,19) + xlij(:,5)*fres(:,20) +
260459599516SKenneth E. Jansen     &     xlij(:,6)*fres(:,21))
260559599516SKenneth E. Jansen
260659599516SKenneth E. Jansen      xfac(:,5) = fres(:,16)*fres(:,16) + fres(:,17)*fres(:,17)
260759599516SKenneth E. Jansen     &     + fres(:,18)*fres(:,18) +
260859599516SKenneth E. Jansen     &     two*(fres(:,19)*fres(:,19) + fres(:,20)*fres(:,20) +
260959599516SKenneth E. Jansen     &     fres(:,21)*fres(:,21))
261059599516SKenneth E. Jansen
261159599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
261259599516SKenneth E. Jansen        do j = 1,numnp
261359599516SKenneth E. Jansen          i = iper(j)
261459599516SKenneth E. Jansen          if (i .ne. j) then
261559599516SKenneth E. Jansen            xnum(j) = zero
261659599516SKenneth E. Jansen            xden(j) = zero
261759599516SKenneth E. Jansen            xfac(j,:) = zero
261859599516SKenneth E. Jansen            xmij(j,:) = zero
261959599516SKenneth E. Jansen            xlij(j,:) = zero
262059599516SKenneth E. Jansen            fres(j,:) = zero
262159599516SKenneth E. Jansen            strnrm(j) = zero
262259599516SKenneth E. Jansen          endif
262359599516SKenneth E. Jansen        enddo
262459599516SKenneth E. Jansen
262559599516SKenneth E. Jansen      if (numpe.gt.1) then
262659599516SKenneth E. Jansen
262759599516SKenneth E. Jansen         numtask = ilwork(1)
262859599516SKenneth E. Jansen         itkbeg = 1
262959599516SKenneth E. Jansen
263059599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
263159599516SKenneth E. Jansen         do itask = 1, numtask
263259599516SKenneth E. Jansen
263359599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
263459599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
263559599516SKenneth E. Jansen
263659599516SKenneth E. Jansen            if (iacc .eq. 0) then
263759599516SKenneth E. Jansen               do is = 1,numseg
263859599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
263959599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
264059599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
264159599516SKenneth E. Jansen                  xnum(isgbeg:isgend) = zero
264259599516SKenneth E. Jansen                  xden(isgbeg:isgend) = zero
264359599516SKenneth E. Jansen                  strnrm(isgbeg:isgend) = zero
264459599516SKenneth E. Jansen                  xfac(isgbeg:isgend,:) = zero
264559599516SKenneth E. Jansen                  xmij(isgbeg:isgend,:) = zero
264659599516SKenneth E. Jansen                  xlij(isgbeg:isgend,:) = zero
264759599516SKenneth E. Jansen                  fres(isgbeg:isgend,:) = zero
264859599516SKenneth E. Jansen               enddo
264959599516SKenneth E. Jansen            endif
265059599516SKenneth E. Jansen
265159599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
265259599516SKenneth E. Jansen
265359599516SKenneth E. Jansen         enddo
265459599516SKenneth E. Jansen
265559599516SKenneth E. Jansen      endif
265659599516SKenneth E. Jansenc
265759599516SKenneth E. Jansenc Description of arrays.   Each processor has an array of length equal
265859599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect
265959599516SKenneth E. Jansenc the numerator and one to collect the denominator.  There is also an array
266059599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each
266159599516SKenneth E. Jansenc on processor node, ifath(nnshg).  Finally, there is an arry of length
266259599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons
266359599516SKenneth E. Jansenc for each father.
266459599516SKenneth E. Jansenc
266559599516SKenneth E. Jansenc  Now loop over nodes and accumlate the numerator and the denominator
266659599516SKenneth E. Jansenc  to the father nodes.  Only on processor addition at this point.
266759599516SKenneth E. Jansenc  Note that serrogate fathers are collect some for the case where some
266859599516SKenneth E. Jansenc  sons are on another processor
266959599516SKenneth E. Jansenc
267059599516SKenneth E. Jansen      xnude = zero
267159599516SKenneth E. Jansen      ynude = zero
267259599516SKenneth E. Jansen      xm    = zero
267359599516SKenneth E. Jansen      xl    = zero
267459599516SKenneth E. Jansen      xl1   = zero
267559599516SKenneth E. Jansen      xl2   = zero
267659599516SKenneth E. Jansen      ui    = zero
267759599516SKenneth E. Jansen      snorm = zero
267859599516SKenneth E. Jansen
267959599516SKenneth E. Jansen      do i = 1,nshg
268059599516SKenneth E. Jansen         xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i)
268159599516SKenneth E. Jansen         xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i)
268259599516SKenneth E. Jansen
268359599516SKenneth E. Jansen         ynude(ifath(i),1) = ynude(ifath(i),1) + xfac(i,1)
268459599516SKenneth E. Jansen         ynude(ifath(i),2) = ynude(ifath(i),2) + xfac(i,2)
268559599516SKenneth E. Jansen         ynude(ifath(i),3) = ynude(ifath(i),3) + xfac(i,3)
268659599516SKenneth E. Jansen         ynude(ifath(i),4) = ynude(ifath(i),4) + xfac(i,4)
268759599516SKenneth E. Jansen         ynude(ifath(i),5) = ynude(ifath(i),5) + xfac(i,5)
268859599516SKenneth E. Jansen
268959599516SKenneth E. Jansen         xm(ifath(i),1) = xm(ifath(i),1) + xmij(i,1)
269059599516SKenneth E. Jansen         xm(ifath(i),2) = xm(ifath(i),2) + xmij(i,2)
269159599516SKenneth E. Jansen         xm(ifath(i),3) = xm(ifath(i),3) + xmij(i,3)
269259599516SKenneth E. Jansen         xm(ifath(i),4) = xm(ifath(i),4) + xmij(i,4)
269359599516SKenneth E. Jansen         xm(ifath(i),5) = xm(ifath(i),5) + xmij(i,5)
269459599516SKenneth E. Jansen         xm(ifath(i),6) = xm(ifath(i),6) + xmij(i,6)
269559599516SKenneth E. Jansen
269659599516SKenneth E. Jansen         xl(ifath(i),1) = xl(ifath(i),1) + xlij(i,1)
269759599516SKenneth E. Jansen         xl(ifath(i),2) = xl(ifath(i),2) + xlij(i,2)
269859599516SKenneth E. Jansen         xl(ifath(i),3) = xl(ifath(i),3) + xlij(i,3)
269959599516SKenneth E. Jansen         xl(ifath(i),4) = xl(ifath(i),4) + xlij(i,4)
270059599516SKenneth E. Jansen         xl(ifath(i),5) = xl(ifath(i),5) + xlij(i,5)
270159599516SKenneth E. Jansen         xl(ifath(i),6) = xl(ifath(i),6) + xlij(i,6)
270259599516SKenneth E. Jansen
270359599516SKenneth E. Jansen         xl1(ifath(i),1) = xl1(ifath(i),1) + fres(i,4)
270459599516SKenneth E. Jansen         xl1(ifath(i),2) = xl1(ifath(i),2) + fres(i,5)
270559599516SKenneth E. Jansen         xl1(ifath(i),3) = xl1(ifath(i),3) + fres(i,6)
270659599516SKenneth E. Jansen         xl1(ifath(i),4) = xl1(ifath(i),4) + fres(i,7)
270759599516SKenneth E. Jansen         xl1(ifath(i),5) = xl1(ifath(i),5) + fres(i,8)
270859599516SKenneth E. Jansen         xl1(ifath(i),6) = xl1(ifath(i),6) + fres(i,9)
270959599516SKenneth E. Jansen
271059599516SKenneth E. Jansen         xl2(ifath(i),1) = xl2(ifath(i),1) + fres(i,1)*fres(i,1)
271159599516SKenneth E. Jansen         xl2(ifath(i),2) = xl2(ifath(i),2) + fres(i,2)*fres(i,2)
271259599516SKenneth E. Jansen         xl2(ifath(i),3) = xl2(ifath(i),3) + fres(i,3)*fres(i,3)
271359599516SKenneth E. Jansen         xl2(ifath(i),4) = xl2(ifath(i),4) + fres(i,1)*fres(i,2)
271459599516SKenneth E. Jansen         xl2(ifath(i),5) = xl2(ifath(i),5) + fres(i,1)*fres(i,3)
271559599516SKenneth E. Jansen         xl2(ifath(i),6) = xl2(ifath(i),6) + fres(i,2)*fres(i,3)
271659599516SKenneth E. Jansen
271759599516SKenneth E. Jansen         ui(ifath(i),1) = ui(ifath(i),1) + fres(i,1)
271859599516SKenneth E. Jansen         ui(ifath(i),2) = ui(ifath(i),2) + fres(i,2)
271959599516SKenneth E. Jansen         ui(ifath(i),3) = ui(ifath(i),3) + fres(i,3)
272059599516SKenneth E. Jansen
272159599516SKenneth E. Jansen         snorm(ifath(i)) = snorm(ifath(i)) + strnrm(i)
272259599516SKenneth E. Jansen
272359599516SKenneth E. Jansen      enddo
272459599516SKenneth E. Jansen
272559599516SKenneth E. Jansenc
272659599516SKenneth E. Jansenc Now  the true fathers and serrogates combine results and update
272759599516SKenneth E. Jansenc each other.
272859599516SKenneth E. Jansenc
272959599516SKenneth E. Jansen      if(numpe .gt. 1)then
273059599516SKenneth E. Jansen         call drvAllreduce(xnude, xnuder,2*nfath)
273159599516SKenneth E. Jansen         call drvAllreduce(ynude, ynuder,6*nfath)
273259599516SKenneth E. Jansen         call drvAllreduce(xm, xmr,6*nfath)
273359599516SKenneth E. Jansen         call drvAllreduce(xl, xlr,6*nfath)
273459599516SKenneth E. Jansen         call drvAllreduce(xl1, xl1r,6*nfath)
273559599516SKenneth E. Jansen         call drvAllreduce(xl2, xl2r,6*nfath)
273659599516SKenneth E. Jansen         call drvAllreduce(ui, uir,3*nfath)
273759599516SKenneth E. Jansen         call drvAllreduce(snorm, snormr,nfath)
273859599516SKenneth E. Jansen
273959599516SKenneth E. Jansen         do i = 1, nfath
274059599516SKenneth E. Jansen            ynuder(i,6) = ( ynuder(i,4) - fwr1*ynuder(i,2) ) /
274159599516SKenneth E. Jansen     &           ( two*ynuder(i,5) - four*fwr1*ynuder(i,3)
274259599516SKenneth E. Jansen     &           + two*fwr1*fwr1*ynuder(i,1) )
274359599516SKenneth E. Jansen         enddo
274459599516SKenneth E. Jansen
274559599516SKenneth E. Jansen         cdelsq2(:) = ynuder(ifath(:),6)  ! For comparison w/ cdelsq
274659599516SKenneth E. Jansenc
274759599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
274859599516SKenneth E. Jansenc
274959599516SKenneth E. Jansenc  xnuder is the sum of the sons for each father on all processor combined
275059599516SKenneth E. Jansenc  (the same as if we had not partitioned the mesh for each processor)
275159599516SKenneth E. Jansenc
275259599516SKenneth E. Jansenc   For each father we have precomputed the number of sons (including
275359599516SKenneth E. Jansenc   the sons off processor).
275459599516SKenneth E. Jansenc
275559599516SKenneth E. Jansenc   Now divide by number of sons to get the average (not really necessary
275659599516SKenneth E. Jansenc   for dynamic model since ratio will cancel nsons at each father)
275759599516SKenneth E. Jansenc
275859599516SKenneth E. Jansen         xnuder(:,1) = xnuder(:,1) / nsons(:)
275959599516SKenneth E. Jansen         xnuder(:,2) = xnuder(:,2) / nsons(:)
276059599516SKenneth E. Jansen
276159599516SKenneth E. Jansen         do m = 1, 5
276259599516SKenneth E. Jansen         ynuder(:,m) = ynuder(:,m)/nsons(:)
276359599516SKenneth E. Jansen         enddo
276459599516SKenneth E. Jansen         do m = 1,6
276559599516SKenneth E. Jansen         xmr(:,m) = xmr(:,m)/nsons(:)
276659599516SKenneth E. Jansen         xlr(:,m) = xlr(:,m)/nsons(:)
276759599516SKenneth E. Jansen         xl1r(:,m) = xl1r(:,m)/nsons(:)
276859599516SKenneth E. Jansen         xl2r(:,m) = xl2r(:,m)/nsons(:)
276959599516SKenneth E. Jansen         enddo
277059599516SKenneth E. Jansen
277159599516SKenneth E. Jansen         uir(:,1) = uir(:,1)/nsons(:)
277259599516SKenneth E. Jansen         uir(:,2) = uir(:,2)/nsons(:)
277359599516SKenneth E. Jansen         uir(:,3) = uir(:,3)/nsons(:)
277459599516SKenneth E. Jansen
277559599516SKenneth E. Jansen         snormr(:) = snormr(:)/nsons(:)
277659599516SKenneth E. Jansen
277759599516SKenneth E. Jansenc
277859599516SKenneth E. Jansencc  the next line is c \Delta^2
277959599516SKenneth E. Jansencc
278059599516SKenneth E. Jansencc         xnuder(:,1) = xnuder(:,1) / (xnuder(:,2) + 1.d-09)
278159599516SKenneth E. Jansencc         do i = 1,nshg
278259599516SKenneth E. Jansencc            cdelsq(i) = xnuder(ifath(i),1)
278359599516SKenneth E. Jansencc         enddo
278459599516SKenneth E. Jansen
278559599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnuder(ifath(:),1)
278659599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnuder(ifath(:),2)
278759599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
278859599516SKenneth E. Jansen
278959599516SKenneth E. Jansenc            cdelsq(:) = xnuder(ifath(:),1)/(xnuder(ifath(:),2)+1.d-09)
279059599516SKenneth E. Jansen
279159599516SKenneth E. Jansen            xnd(:,1) = xnd(:,1) + xnuder(:,1)
279259599516SKenneth E. Jansen            xnd(:,2) = xnd(:,2) + xnuder(:,2)
279359599516SKenneth E. Jansen
279459599516SKenneth E. Jansen            xmodcomp(:,1) = xmodcomp(:,1)+ynuder(:,1)
279559599516SKenneth E. Jansen            xmodcomp(:,2) = xmodcomp(:,2)+ynuder(:,2)
279659599516SKenneth E. Jansen            xmodcomp(:,3) = xmodcomp(:,3)+ynuder(:,3)
279759599516SKenneth E. Jansen            xmodcomp(:,4) = xmodcomp(:,4)+ynuder(:,4)
279859599516SKenneth E. Jansen            xmodcomp(:,5) = xmodcomp(:,5)+ynuder(:,5)
279959599516SKenneth E. Jansen
280059599516SKenneth E. Jansen            xmcomp(:,:) = xmcomp(:,:)+xmr(:,:)
280159599516SKenneth E. Jansen            xlcomp(:,:) = xlcomp(:,:)+xlr(:,:)
280259599516SKenneth E. Jansen
280359599516SKenneth E. Jansen            xl1comp(:,:) = xl1comp(:,:)+xl1r(:,:)
280459599516SKenneth E. Jansen            xl2comp(:,:) = xl2comp(:,:)+xl2r(:,:)
280559599516SKenneth E. Jansen
280659599516SKenneth E. Jansen            ucomp(:,:) = ucomp(:,:)+uir(:,:)
280759599516SKenneth E. Jansen            u1 = uir(32,1)
280859599516SKenneth E. Jansen            scomp(:)   = scomp(:)+snormr(:)
280959599516SKenneth E. Jansen
281059599516SKenneth E. Jansen      else
281159599516SKenneth E. Jansen
281259599516SKenneth E. Jansen         xnude(:,1) = xnude(:,1)/nsons(:)
281359599516SKenneth E. Jansen         xnude(:,2) = xnude(:,2)/nsons(:)
281459599516SKenneth E. Jansen
281559599516SKenneth E. Jansen         do m = 1, 5
281659599516SKenneth E. Jansen         ynude(:,m) = ynude(:,m)/nsons(:)
281759599516SKenneth E. Jansen         enddo
281859599516SKenneth E. Jansen         do m = 1,6
281959599516SKenneth E. Jansen         xm(:,m) = xm(:,m)/nsons(:)
282059599516SKenneth E. Jansen         xl(:,m) = xl(:,m)/nsons(:)
282159599516SKenneth E. Jansen         xl1(:,m) = xl1(:,m)/nsons(:)
282259599516SKenneth E. Jansen         xl2(:,m) = xl2(:,m)/nsons(:)
282359599516SKenneth E. Jansen         enddo
282459599516SKenneth E. Jansen
282559599516SKenneth E. Jansen         ui(:,1) = ui(:,1)/nsons(:)
282659599516SKenneth E. Jansen         ui(:,2) = ui(:,2)/nsons(:)
282759599516SKenneth E. Jansen         ui(:,3) = ui(:,3)/nsons(:)
282859599516SKenneth E. Jansen
282959599516SKenneth E. Jansen         snorm(:) = snorm(:)/nsons(:)
283059599516SKenneth E. Jansenc
283159599516SKenneth E. Jansenc     the next line is c \Delta^2, not nu_T but we want to save the
283259599516SKenneth E. Jansenc     memory
283359599516SKenneth E. Jansenc
283459599516SKenneth E. Jansen
283559599516SKenneth E. Jansencc         xnude(:,1) = xnude(:,1) / (xnude(:,2) + 1.d-09)
283659599516SKenneth E. Jansencc        do i = 1,nshg
283759599516SKenneth E. Jansencc            cdelsq(i) = xnude(ifath(i),1)
283859599516SKenneth E. Jansencc         enddo
283959599516SKenneth E. Jansencc      endif
284059599516SKenneth E. Jansen
284159599516SKenneth E. Jansen         do i = 1, nfath
284259599516SKenneth E. Jansen            ynude(i,6) = ( ynude(i,4) - fwr1*ynude(i,2) ) /
284359599516SKenneth E. Jansen     &           ( two*ynude(i,5) - four*fwr1*ynude(i,3)
284459599516SKenneth E. Jansen     &           + fwr1*fwr1*ynude(i,1) )
284559599516SKenneth E. Jansen         enddo
284659599516SKenneth E. Jansen
284759599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnude(ifath(:),1)
284859599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnude(ifath(:),2)
284959599516SKenneth E. Jansen
285059599516SKenneth E. Jansen            xnd(:,1) = xnd(:,1)+xnude(:,1)
285159599516SKenneth E. Jansen            xnd(:,2) = xnd(:,2)+xnude(:,2)
285259599516SKenneth E. Jansen
285359599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2)) ! + 1.d-09)
285459599516SKenneth E. Jansen
285559599516SKenneth E. Jansenc            cdelsq(:) = xnude(ifath(:),1)/(xnude(ifath(:),2))!+1.d-09)
285659599516SKenneth E. Jansen
285759599516SKenneth E. Jansen
285859599516SKenneth E. Jansen          cdelsq2(:) = ynude(ifath(:),6)  ! For comparison w/ cdelsq
285959599516SKenneth E. Jansen
286059599516SKenneth E. Jansen            xmodcomp(:,1) = xmodcomp(:,1)+ynude(:,1)
286159599516SKenneth E. Jansen            xmodcomp(:,2) = xmodcomp(:,2)+ynude(:,2)
286259599516SKenneth E. Jansen            xmodcomp(:,3) = xmodcomp(:,3)+ynude(:,3)
286359599516SKenneth E. Jansen            xmodcomp(:,4) = xmodcomp(:,4)+ynude(:,4)
286459599516SKenneth E. Jansen            xmodcomp(:,5) = xmodcomp(:,5)+ynude(:,5)
286559599516SKenneth E. Jansen
286659599516SKenneth E. Jansen            xmcomp(:,:) = xmcomp(:,:)+xm(:,:)
286759599516SKenneth E. Jansen            xlcomp(:,:) = xlcomp(:,:)+xl(:,:)
286859599516SKenneth E. Jansen
286959599516SKenneth E. Jansen            xl1comp(:,:) = xl1comp(:,:)+xl1(:,:)
287059599516SKenneth E. Jansen            xl2comp(:,:) = xl2comp(:,:)+xl2(:,:)
287159599516SKenneth E. Jansen
287259599516SKenneth E. Jansen            ucomp(:,:) = ucomp(:,:)+ui(:,:)
287359599516SKenneth E. Jansen            u1 = ui(32,1)
287459599516SKenneth E. Jansen            scomp(:)   = scomp(:)+snorm(:)
287559599516SKenneth E. Jansen
287659599516SKenneth E. Jansen         endif
287759599516SKenneth E. Jansen
287859599516SKenneth E. Jansen
287959599516SKenneth E. Jansenc         do i = 1, nfath
288059599516SKenneth E. Jansenc            xmodcomp(i,:) = xmodcomp(i,:)/nsons(i)
288159599516SKenneth E. Jansenc            xmcomp(i,:) = xmcomp(i,:)/nsons(i)
288259599516SKenneth E. Jansenc            xlcomp(i,:) = xlcomp(i,:)/nsons(i)
288359599516SKenneth E. Jansenc            xl2comp(i,:) = xl2comp(i,:)/nsons(i)
288459599516SKenneth E. Jansenc            xl1comp(i,:) = xl1comp(i,:)/nsons(i)
288559599516SKenneth E. Jansenc            xnd(i,:) = xnd(i,:)/nsons(i)
288659599516SKenneth E. Jansenc            scomp(i) = scomp(i)/nsons(i)
288759599516SKenneth E. Jansenc            ucomp(i,:) = ucomp(i,:)/nsons(i)
288859599516SKenneth E. Jansenc         enddo
288959599516SKenneth E. Jansen
289059599516SKenneth E. Jansen         if ( istep .eq. (nstep(1)-1) ) then
289159599516SKenneth E. Jansen         if ( myrank .eq. master) then
289259599516SKenneth E. Jansen
289359599516SKenneth E. Jansen            do i = 1, nfath
289459599516SKenneth E. Jansen            write(365,*)xmodcomp(i,1),xmodcomp(i,2),xmodcomp(i,3),
289559599516SKenneth E. Jansen     &              xmodcomp(i,4),xmodcomp(i,5)
289659599516SKenneth E. Jansen
289759599516SKenneth E. Jansen            write(366,*)xmcomp(i,1),xmcomp(i,2),xmcomp(i,3)
289859599516SKenneth E. Jansen            write(367,*)xmcomp(i,4),xmcomp(i,5),xmcomp(i,6)
289959599516SKenneth E. Jansen
290059599516SKenneth E. Jansen            write(368,*)xlcomp(i,1),xlcomp(i,2),xlcomp(i,3)
290159599516SKenneth E. Jansen            write(369,*)xlcomp(i,4),xlcomp(i,5),xlcomp(i,6)
290259599516SKenneth E. Jansen
290359599516SKenneth E. Jansen            write(370,*)xl1comp(i,1),xl1comp(i,2),xl1comp(i,3)
290459599516SKenneth E. Jansen            write(371,*)xl1comp(i,4),xl1comp(i,5),xl1comp(i,6)
290559599516SKenneth E. Jansen
290659599516SKenneth E. Jansen            write(372,*)xl2comp(i,1),xl2comp(i,2),xl2comp(i,3)
290759599516SKenneth E. Jansen            write(373,*)xl2comp(i,4),xl2comp(i,5),xl2comp(i,6)
290859599516SKenneth E. Jansen
290959599516SKenneth E. Jansen            write(374,*)xnd(i,1),xnd(i,2),scomp(i)
291059599516SKenneth E. Jansen            write(375,*)ucomp(i,1),ucomp(i,2),ucomp(i,3)
291159599516SKenneth E. Jansen
291259599516SKenneth E. Jansenc            write(*,*)'uit uic=', ucomp(32,1),u1
291359599516SKenneth E. Jansen            enddo
291459599516SKenneth E. Jansen
291559599516SKenneth E. Jansen
291659599516SKenneth E. Jansen            call flush(365)
291759599516SKenneth E. Jansen            call flush(366)
291859599516SKenneth E. Jansen            call flush(367)
291959599516SKenneth E. Jansen            call flush(368)
292059599516SKenneth E. Jansen            call flush(369)
292159599516SKenneth E. Jansen            call flush(370)
292259599516SKenneth E. Jansen            call flush(371)
292359599516SKenneth E. Jansen            call flush(372)
292459599516SKenneth E. Jansen            call flush(373)
292559599516SKenneth E. Jansen            call flush(374)
292659599516SKenneth E. Jansen            call flush(375)
292759599516SKenneth E. Jansen
292859599516SKenneth E. Jansenc            if (myrank .eq. master) then
292959599516SKenneth E. Jansenc               write(*,*)'uit uic=', ucomp(32,1),u1
293059599516SKenneth E. Jansenc            endif
293159599516SKenneth E. Jansen
293259599516SKenneth E. Jansen
293359599516SKenneth E. Jansenc            close(852)
293459599516SKenneth E. Jansenc            close(853)
293559599516SKenneth E. Jansenc            close(854)
293659599516SKenneth E. Jansen
293759599516SKenneth E. Jansen         endif
293859599516SKenneth E. Jansen         endif
293959599516SKenneth E. Jansen
294059599516SKenneth E. Jansen            if (myrank .eq. master) then
294159599516SKenneth E. Jansen               write(*,*)'uit uic=', ucomp(32,1),u1
294259599516SKenneth E. Jansen            endif
294359599516SKenneth E. Jansen
294459599516SKenneth E. Jansen
294559599516SKenneth E. Jansen 555     format(e14.7,4(2x,e14.7))
294659599516SKenneth E. Jansen 556     format(e14.7,5(2x,e14.7))
294759599516SKenneth E. Jansen
294859599516SKenneth E. Jansenc         close(849)
294959599516SKenneth E. Jansenc         close(850)
295059599516SKenneth E. Jansenc         close(851)
295159599516SKenneth E. Jansenc         close(852)
295259599516SKenneth E. Jansenc         close(853)
295359599516SKenneth E. Jansenc         close(854)
295459599516SKenneth E. Jansen
295559599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
295659599516SKenneth E. Jansen      tmp1 =  MINVAL(cdelsq)
295759599516SKenneth E. Jansen      tmp2 =  MAXVAL(cdelsq)
295859599516SKenneth E. Jansen      if(numpe>1) then
295959599516SKenneth E. Jansen         call MPI_REDUCE (tmp1, tmp3, 1,MPI_DOUBLE_PRECISION,
296059599516SKenneth E. Jansen     &        MPI_MIN, master, MPI_COMM_WORLD, ierr)
296159599516SKenneth E. Jansen         call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
296259599516SKenneth E. Jansen     &        MPI_MAX, master, MPI_COMM_WORLD, ierr)
296359599516SKenneth E. Jansen         tmp1=tmp3
296459599516SKenneth E. Jansen         tmp2=tmp4
296559599516SKenneth E. Jansen      endif
296659599516SKenneth E. Jansen      if (myrank .EQ. master) then !print CDelta^2 range
296759599516SKenneth E. Jansen         write(34,*)lstep,tmp1,tmp2
296859599516SKenneth E. Jansen         call flush(34)
296959599516SKenneth E. Jansen      endif
297059599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
297159599516SKenneth E. Jansen
297259599516SKenneth E. Jansen      if (myrank .eq. master) then
297359599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq(1),cdelsq(2)
297459599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq2(1),cdelsq2(2)
297559599516SKenneth E. Jansen         write(22,*) lstep, cdelsq(1)
297659599516SKenneth E. Jansen         call flush(22)
297759599516SKenneth E. Jansen      endif
297859599516SKenneth E. Jansen
297959599516SKenneth E. Jansen      do iblk = 1,nelblk
298059599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
298159599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
298259599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
298359599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
298459599516SKenneth E. Jansen         inum  = iel + npro - 1
298559599516SKenneth E. Jansen
298659599516SKenneth E. Jansen         ngauss = nint(lcsyst)
298759599516SKenneth E. Jansen
298859599516SKenneth E. Jansen         call scatnu (mien(iblk)%p, strl(iel:inum,:),
298959599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:))
299059599516SKenneth E. Jansen      enddo
299159599516SKenneth E. Jansenc     $$$$$$$$$$$$$$$$$$$$$$$$$$$
299259599516SKenneth E. Jansenc$$$  tmp1 =  MINVAL(xmudmi)
299359599516SKenneth E. Jansenc$$$  tmp2 =  MAXVAL(xmudmi)
299459599516SKenneth E. Jansenc$$$  if(numpe>1) then
299559599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION,
299659599516SKenneth E. Jansenc$$$  &                 MPI_MIN, master, MPI_COMM_WORLD, ierr)
299759599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
299859599516SKenneth E. Jansenc$$$  &                 MPI_MAX, master, MPI_COMM_WORLD, ierr)
299959599516SKenneth E. Jansenc$$$      tmp1=tmp3
300059599516SKenneth E. Jansenc$$$  tmp2=tmp4
300159599516SKenneth E. Jansenc$$$  endif
300259599516SKenneth E. Jansenc$$$  if (myrank .EQ. master) then
300359599516SKenneth E. Jansenc$$$  write(35,*) lstep,tmp1,tmp2
300459599516SKenneth E. Jansenc$$$  call flush(35)
300559599516SKenneth E. Jansenc$$$  endif
300659599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
300759599516SKenneth E. Jansen
300859599516SKenneth E. Jansenc
300959599516SKenneth E. Jansenc  if flag set, write a restart file with info (reuse xmij's memory)
301059599516SKenneth E. Jansenc
301159599516SKenneth E. Jansen      if(irs.eq.11) then
301259599516SKenneth E. Jansen         lstep=999
301359599516SKenneth E. Jansen         xmij(:,1)=xnum(:)
301459599516SKenneth E. Jansen         xmij(:,2)=xden(:)
301559599516SKenneth E. Jansen         xmij(:,3)=cdelsq(:)
301659599516SKenneth E. Jansen         xmij(:,5)=xlij(:,4)    !leave M_{12} in 4 and put L_{12} here
301759599516SKenneth E. Jansen         call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac
301859599516SKenneth E. Jansen         stop
301959599516SKenneth E. Jansen      endif
302059599516SKenneth E. Jansenc
302159599516SKenneth E. Jansenc  local clipping moved to scatnu with the creation of mxmudmi pointers
302259599516SKenneth E. Jansenc
302359599516SKenneth E. Jansenc$$$      rmu=datmat(1,2,1)
302459599516SKenneth E. Jansenc$$$      xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu
302559599516SKenneth E. Jansenc$$$      xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0
302659599516SKenneth E. Jansenc      stop !uncomment to test dmod
302759599516SKenneth E. Jansenc
302859599516SKenneth E. Jansen
302959599516SKenneth E. Jansen
303059599516SKenneth E. Jansenc  write out the nodal values of xnut (estimate since we don't calc strain
303159599516SKenneth E. Jansenc  there and must use the filtered strain).
303259599516SKenneth E. Jansenc
303359599516SKenneth E. Jansen
303459599516SKenneth E. Jansen      if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
303559599516SKenneth E. Jansenc
303659599516SKenneth E. Jansenc  collect the average strain into xnude(2)
303759599516SKenneth E. Jansenc
303859599516SKenneth E. Jansen         xnude(:,2) = zero
303959599516SKenneth E. Jansen         do i = 1,numnp
304059599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + strnrm(i)
304159599516SKenneth E. Jansen         enddo
304259599516SKenneth E. Jansen
304359599516SKenneth E. Jansen         if(numpe .gt. 1) then
304459599516SKenneth E. Jansen             call drvAllreduce(xnude(:,2), xnuder(:,2),nfath)
304559599516SKenneth E. Jansen          else
304659599516SKenneth E. Jansen             xnuder=xnude
304759599516SKenneth E. Jansen          endif
304859599516SKenneth E. Jansenc
304959599516SKenneth E. Jansenc          nut= cdelsq    * |S|
305059599516SKenneth E. Jansenc
305159599516SKenneth E. Jansen         xnutf=xnuder(:,1)*xnuder(:,2)/nsons(:)
305259599516SKenneth E. Jansenc
305359599516SKenneth E. Jansenc  collect the x and y coords into xnude
305459599516SKenneth E. Jansenc
305559599516SKenneth E. Jansen         xnude = zero
305659599516SKenneth E. Jansen         do i = 1,numnp
305759599516SKenneth E. Jansen            xnude(ifath(i),1) = xnude(ifath(i),1) + x(i,1)
305859599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + x(i,2)
305959599516SKenneth E. Jansen         enddo
306059599516SKenneth E. Jansen
306159599516SKenneth E. Jansen         if(numpe .gt. 1)
306259599516SKenneth E. Jansen     &        call drvAllreduce(xnude, xnuder,2*nfath)
306359599516SKenneth E. Jansen         xnuder(:,1)=xnuder(:,1)/nsons(:)
306459599516SKenneth E. Jansen         xnuder(:,2)=xnuder(:,2)/nsons(:)
306559599516SKenneth E. Jansenc
306659599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
306759599516SKenneth E. Jansenc
306859599516SKenneth E. Jansen         if((myrank.eq.master)) then
306959599516SKenneth E. Jansen            do i=1,nfath      ! cdelsq   * |S|
307059599516SKenneth E. Jansen               write(444,*) xnuder(i,1),xnuder(i,2),xnutf(i)
307159599516SKenneth E. Jansen            enddo
307259599516SKenneth E. Jansen            call flush(444)
307359599516SKenneth E. Jansen         endif
307459599516SKenneth E. Jansen      endif
307559599516SKenneth E. Jansen
307659599516SKenneth E. Jansen      return
307759599516SKenneth E. Jansen      end
3078