xref: /phasta/phSolver/incompressible/elmStats.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine elmStatsLhs( x,  iBC,   iper,  ilwork )
2*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
3*59599516SKenneth E. Jansenc     compute the necessary terms for the statistics projection
4*59599516SKenneth E. Jansenc     matrices.
5*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
6*59599516SKenneth E. Jansen      use     stats
7*59599516SKenneth E. Jansen      use     pointer_data
8*59599516SKenneth E. Jansen
9*59599516SKenneth E. Jansen      include "common.h"
10*59599516SKenneth E. Jansen
11*59599516SKenneth E. Jansen      real*8  x(numnp,3)
12*59599516SKenneth E. Jansen      integer iBC(nshg), iper(nshg), ilwork(nlwork)
13*59599516SKenneth E. Jansen
14*59599516SKenneth E. Jansen      real*8, allocatable :: xl(:,:,:)
15*59599516SKenneth E. Jansen      real*8, allocatable :: lStsVec(:,:,:)
16*59599516SKenneth E. Jansen
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansenc.... loop over element blocks
19*59599516SKenneth E. Jansenc
20*59599516SKenneth E. Jansen      stsVec = zero
21*59599516SKenneth E. Jansen
22*59599516SKenneth E. Jansen      do iblk = 1, nelblk
23*59599516SKenneth E. Jansen         iel    = lcblk(1,iblk)
24*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
25*59599516SKenneth E. Jansen         nenl   = lcblk(5,iblk) ! no. of vertices per element
26*59599516SKenneth E. Jansen         nshl   = lcblk(10,iblk)
27*59599516SKenneth E. Jansen         ndofl  = lcblk(8,iblk)
28*59599516SKenneth E. Jansen         npro   = lcblk(1,iblk+1) - iel
29*59599516SKenneth E. Jansen
30*59599516SKenneth E. Jansen         allocate ( xl(npro,nenl,3)             )
31*59599516SKenneth E. Jansen         allocate ( lStsVec(npro,nshl,nResDims) )
32*59599516SKenneth E. Jansenc
33*59599516SKenneth E. Jansenc.... localize needed data
34*59599516SKenneth E. Jansenc
35*59599516SKenneth E. Jansen         call localx ( x,    xl,  mien(iblk)%p, nsd,   'gather  ' )
36*59599516SKenneth E. Jansenc
37*59599516SKenneth E. Jansenc.... form the Lhs
38*59599516SKenneth E. Jansenc
39*59599516SKenneth E. Jansen         call e3StsLhs( xl, lStsVec )
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansenc.... assemble
42*59599516SKenneth E. Jansenc
43*59599516SKenneth E. Jansen         call local (stsVec, lStsVec, mien(iblk)%p,
44*59599516SKenneth E. Jansen     &               nResDims, 'scatter ' )
45*59599516SKenneth E. Jansen
46*59599516SKenneth E. Jansen         deallocate ( xl       )
47*59599516SKenneth E. Jansen         deallocate ( lStsVec  )
48*59599516SKenneth E. Jansenc
49*59599516SKenneth E. Jansenc.... end loop over element blocks
50*59599516SKenneth E. Jansenc
51*59599516SKenneth E. Jansen      enddo
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansen      if (numpe > 1) then
54*59599516SKenneth E. Jansen        call commu (stsVec, ilwork, nResDims  , 'in ')
55*59599516SKenneth E. Jansen      endif
56*59599516SKenneth E. Jansenc
57*59599516SKenneth E. Jansenc.... local periodic boundary conditions (no communications)
58*59599516SKenneth E. Jansenc
59*59599516SKenneth E. Jansen      do j = 1,nshg
60*59599516SKenneth E. Jansen         if (btest(iBC(j),10)) then
61*59599516SKenneth E. Jansen            i = iper(j)
62*59599516SKenneth E. Jansen            stsVec(i,:) = stsVec(i,:) + stsVec(j,:)
63*59599516SKenneth E. Jansen         endif
64*59599516SKenneth E. Jansen      enddo
65*59599516SKenneth E. Jansenc
66*59599516SKenneth E. Jansen      do i = 1,nshg
67*59599516SKenneth E. Jansen         stsVec(i,:) = stsVec(iper(i),:)
68*59599516SKenneth E. Jansen      enddo
69*59599516SKenneth E. Jansen      if (numpe > 1) then
70*59599516SKenneth E. Jansen        call commu (stsVec, ilwork, nResDims  , 'out')
71*59599516SKenneth E. Jansen      endif
72*59599516SKenneth E. Jansen
73*59599516SKenneth E. Jansen      return
74*59599516SKenneth E. Jansen      end
75*59599516SKenneth E. Jansen
76*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
77*59599516SKenneth E. Jansenc  Assemble the residual for the statistics
78*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
79*59599516SKenneth E. Jansen      subroutine elmStatsRes( y,        ac,    x,      shp,     shgl,
80*59599516SKenneth E. Jansen     &                        shpb,     shglb,       iBC,     BC,
81*59599516SKenneth E. Jansen     &                        iper,     ilwork,      rowp,    colm,
82*59599516SKenneth E. Jansen     &                        lhsK,     lhsP )
83*59599516SKenneth E. Jansen
84*59599516SKenneth E. Jansen      use     stats
85*59599516SKenneth E. Jansen      include "common.h"
86*59599516SKenneth E. Jansen
87*59599516SKenneth E. Jansen
88*59599516SKenneth E. Jansen      real*8  y(nshg,ndof),             ac(nshg,ndof), x(numnp,nsd),
89*59599516SKenneth E. Jansen     &        shp(MAXTOP,maxsh,MAXQPT),  shgl(MAXTOP,nsd,maxsh,MAXQPT),
90*59599516SKenneth E. Jansen     &        shpb(MAXTOP,maxsh,MAXQPT),
91*59599516SKenneth E. Jansen     &        shglb(MAXTOP,nsd,maxsh,MAXQPT),
92*59599516SKenneth E. Jansen     &        BC(nshg,ndofBC),          lhsK(9,nnz_tot),
93*59599516SKenneth E. Jansen     &        lhsP(4,nnz_tot),         res(nshg,ndof)
94*59599516SKenneth E. Jansen
95*59599516SKenneth E. Jansen      integer iBC(nshg),                iper(nshg),
96*59599516SKenneth E. Jansen     &        ilwork(nlwork),           rowp(nshg,nnz),
97*59599516SKenneth E. Jansen     &        colm(nshg+1)
98*59599516SKenneth E. Jansen
99*59599516SKenneth E. Jansen
100*59599516SKenneth E. Jansen      lhs    = 0
101*59599516SKenneth E. Jansen      stsVec = zero
102*59599516SKenneth E. Jansen
103*59599516SKenneth E. Jansen      stsResFlg = 1
104*59599516SKenneth E. Jansen      ierrcalctmp=ierrcalc ! save the current value of ierrcalc
105*59599516SKenneth E. Jansen      ierrcalc=0           ! set it to zero so that we don't calculate error
106*59599516SKenneth E. Jansen                           ! here (which would overflow memory around rjunk)
107*59599516SKenneth E. Jansen      call ElmGMR (y,         ac,         x,
108*59599516SKenneth E. Jansen     &             shp,       shgl,       iBC,
109*59599516SKenneth E. Jansen     &             BC,        shpb,       shglb,
110*59599516SKenneth E. Jansen     &             res,       iper,       ilwork,
111*59599516SKenneth E. Jansen     &             rowp,      colm,       lhsK,
112*59599516SKenneth E. Jansen     &             lhsP,      rjunk   )
113*59599516SKenneth E. Jansen      stsResFlg = 0
114*59599516SKenneth E. Jansen      ierrcalc=ierrcalctmp  ! reset it back to original value
115*59599516SKenneth E. Jansen      return
116*59599516SKenneth E. Jansen      end
117*59599516SKenneth E. Jansen
118