xref: /phasta/phSolver/common/aveprep.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      module aveall
2*59599516SKenneth E. Jansen
3*59599516SKenneth E. Jansen      real*8, allocatable :: ylist(:)
4*59599516SKenneth E. Jansen      integer, allocatable :: ifathe(:,:)
5*59599516SKenneth E. Jansen
6*59599516SKenneth E. Jansen      end module
7*59599516SKenneth E. Jansen
8*59599516SKenneth E. Jansenc------------------------------------------------------------------------------
9*59599516SKenneth E. Jansen
10*59599516SKenneth E. Jansen      subroutine setave
11*59599516SKenneth E. Jansen
12*59599516SKenneth E. Jansen      use aveall
13*59599516SKenneth E. Jansen
14*59599516SKenneth E. Jansen      include "common.h"
15*59599516SKenneth E. Jansen
16*59599516SKenneth E. Jansen      idim = numel*intg(1,1)
17*59599516SKenneth E. Jansen      allocate ( ylist(idim) )
18*59599516SKenneth E. Jansen      allocate ( ifathe(numel,maxsh) )
19*59599516SKenneth E. Jansen
20*59599516SKenneth E. Jansenc.... return
21*59599516SKenneth E. Jansen
22*59599516SKenneth E. Jansen      return
23*59599516SKenneth E. Jansen      end
24*59599516SKenneth E. Jansen
25*59599516SKenneth E. Jansenc------------------------------------------------------------------------------
26*59599516SKenneth E. Jansen
27*59599516SKenneth E. Jansen      subroutine aveprep(shp,x)
28*59599516SKenneth E. Jansen
29*59599516SKenneth E. Jansen      use pointer_data
30*59599516SKenneth E. Jansen      use aveall
31*59599516SKenneth E. Jansen
32*59599516SKenneth E. Jansen      include "common.h"
33*59599516SKenneth E. Jansen
34*59599516SKenneth E. Jansen      dimension shp(MAXTOP,maxsh,MAXQPT)
35*59599516SKenneth E. Jansen      dimension x(numnp,3)
36*59599516SKenneth E. Jansen      integer   nlist
37*59599516SKenneth E. Jansen
38*59599516SKenneth E. Jansen      nlist  = 0
39*59599516SKenneth E. Jansen      ylist  = zero
40*59599516SKenneth E. Jansen      lfathe = 0
41*59599516SKenneth E. Jansen      do iblk = 1,nelblk
42*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
43*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
44*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
45*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
46*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
47*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
48*59599516SKenneth E. Jansen        inum  = iel + npro - 1
49*59599516SKenneth E. Jansen
50*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
51*59599516SKenneth E. Jansen
52*59599516SKenneth E. Jansen        call getylist( ylist, ifathe(iel:inum,:), shp(lcsyst,1:nshl,:),
53*59599516SKenneth E. Jansen     &       x, mien(iblk)%p)
54*59599516SKenneth E. Jansen
55*59599516SKenneth E. Jansen
56*59599516SKenneth E. Jansen      enddo
57*59599516SKenneth E. Jansen
58*59599516SKenneth E. Jansen      return
59*59599516SKenneth E. Jansen      end
60*59599516SKenneth E. Jansen
61*59599516SKenneth E. Jansen
62*59599516SKenneth E. Jansen
63*59599516SKenneth E. Jansen
64*59599516SKenneth E. Jansen
65*59599516SKenneth E. Jansen
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansen
68*59599516SKenneth E. Jansen
69*59599516SKenneth E. Jansen
70*59599516SKenneth E. Jansen
71*59599516SKenneth E. Jansen
72*59599516SKenneth E. Jansen
73*59599516SKenneth E. Jansen
74*59599516SKenneth E. Jansen
75*59599516SKenneth E. Jansen      subroutine getnu (ien, strl, xmudmi, cdelsq, lfathe)
76*59599516SKenneth E. Jansen
77*59599516SKenneth E. Jansen      include "common.h"
78*59599516SKenneth E. Jansen
79*59599516SKenneth E. Jansen      dimension  ien(npro,nshl),       strl(npro,ngauss),
80*59599516SKenneth E. Jansen     &           xmudmi(npro,ngauss),   cdelsq(nlist),
81*59599516SKenneth E. Jansen     &           lfathe(npro,ngauss)
82*59599516SKenneth E. Jansen
83*59599516SKenneth E. Jansen      do intp = 1, ngauss
84*59599516SKenneth E. Jansen      do iel  = 1, npro
85*59599516SKenneth E. Jansen
86*59599516SKenneth E. Jansen         xmudmi(iel,intp) = cdelsq( lfathe(iel,intp) )*
87*59599516SKenneth E. Jansen     &        strl(iel,intp)
88*59599516SKenneth E. Jansen
89*59599516SKenneth E. Jansen      enddo
90*59599516SKenneth E. Jansen      enddo
91*59599516SKenneth E. Jansen
92*59599516SKenneth E. Jansenc
93*59599516SKenneth E. Jansenc  local clipping
94*59599516SKenneth E. Jansenc
95*59599516SKenneth E. Jansen      rmu=datmat(1,2,1)
96*59599516SKenneth E. Jansencc      xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu
97*59599516SKenneth E. Jansencc      xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0
98*59599516SKenneth E. Jansen
99*59599516SKenneth E. Jansen      do int = 1, ngauss
100*59599516SKenneth E. Jansen      xmudmi(:,int) =
101*59599516SKenneth E. Jansen     &     min(xmudmi(:,int),1000.0*rmu) !don't let it get larger than 1000 mu
102*59599516SKenneth E. Jansen      xmudmi(:,int) =
103*59599516SKenneth E. Jansen     &     max(xmudmi(:,int), -rmu)    ! don't let (xmudmi + mu) < 0
104*59599516SKenneth E. Jansen      enddo
105*59599516SKenneth E. Jansen
106*59599516SKenneth E. Jansen      return
107*59599516SKenneth E. Jansen      end
108*59599516SKenneth E. Jansen      subroutine getxnut (fres, xden, xnum, ien, shp)
109*59599516SKenneth E. Jansen
110*59599516SKenneth E. Jansen      include "common.h"
111*59599516SKenneth E. Jansen
112*59599516SKenneth E. Jansen      dimension ien(npro,nshl),          fres(nshg,22),
113*59599516SKenneth E. Jansen     &          shp(nshl,maxsh),         fresli(npro,22),
114*59599516SKenneth E. Jansen     &          fresl(npro,nshl,22),     strnrmi(npro),
115*59599516SKenneth E. Jansen     &          xnutl(npro),             fwr(npro),
116*59599516SKenneth E. Jansen     &          xmij(npro,6),            xlij(npro,6),
117*59599516SKenneth E. Jansen     &          xdenli(npro),            xnumli(npro),
118*59599516SKenneth E. Jansen     &          xdenl(npro),             xnuml(npro),
119*59599516SKenneth E. Jansen     &          xden(1),                 xnum(1)
120*59599516SKenneth E. Jansen
121*59599516SKenneth E. Jansen
122*59599516SKenneth E. Jansen      call local (fres, fresl, ien, 22, 'gather  ')
123*59599516SKenneth E. Jansen
124*59599516SKenneth E. Jansen      xnuml  = zero
125*59599516SKenneth E. Jansen      xdenl  = zero
126*59599516SKenneth E. Jansen
127*59599516SKenneth E. Jansen      do intp = 1, ngauss
128*59599516SKenneth E. Jansen
129*59599516SKenneth E. Jansen         fresli = zero
130*59599516SKenneth E. Jansen         do i = 1, nenl
131*59599516SKenneth E. Jansen            do j = 1, 22
132*59599516SKenneth E. Jansen               fresli(:,j) = fresli(:,j) + shp(i,intp)*fresl(:,i,j)
133*59599516SKenneth E. Jansen            enddo
134*59599516SKenneth E. Jansen         enddo
135*59599516SKenneth E. Jansen
136*59599516SKenneth E. Jansen         strnrmi(:) =  sqrt(
137*59599516SKenneth E. Jansen     &   two * (fresli(:,10)**2 + fresli(:,11)**2 + fresli(:,12)**2)
138*59599516SKenneth E. Jansen     &   + four * ( fresli(:,13)**2 + fresli(:,14)**2 +
139*59599516SKenneth E. Jansen     &   fresli(:,15)**2 ) )
140*59599516SKenneth E. Jansen
141*59599516SKenneth E. Jansen         fwr = fwr1 * fresli(:,22) * strnrmi(:)
142*59599516SKenneth E. Jansen
143*59599516SKenneth E. Jansen         xmij(:,1) = -fwr
144*59599516SKenneth E. Jansen     &        * fresli(:,10) + fresli(:,16)
145*59599516SKenneth E. Jansen
146*59599516SKenneth E. Jansen         xmij(:,2) = -fwr
147*59599516SKenneth E. Jansen     &        * fresli(:,11) + fresli(:,17)
148*59599516SKenneth E. Jansen
149*59599516SKenneth E. Jansen         xmij(:,3) = -fwr
150*59599516SKenneth E. Jansen     &        * fresli(:,12) + fresli(:,18)
151*59599516SKenneth E. Jansen
152*59599516SKenneth E. Jansen         xmij(:,4) = -fwr * fresli(:,13) + fresli(:,19)
153*59599516SKenneth E. Jansen         xmij(:,5) = -fwr * fresli(:,14) + fresli(:,20)
154*59599516SKenneth E. Jansen         xmij(:,6) = -fwr * fresli(:,15) + fresli(:,21)
155*59599516SKenneth E. Jansen
156*59599516SKenneth E. Jansen         fresli(:,22) = one/fresli(:,22)
157*59599516SKenneth E. Jansen
158*59599516SKenneth E. Jansen         xlij(:,1) = fresli(:,4) - fresli(:,1) *
159*59599516SKenneth E. Jansen     &        fresli(:,1) * fresli(:,22)
160*59599516SKenneth E. Jansen         xlij(:,2) = fresli(:,5) - fresli(:,2) *
161*59599516SKenneth E. Jansen     &        fresli(:,2) * fresli(:,22)
162*59599516SKenneth E. Jansen         xlij(:,3) = fresli(:,6) - fresli(:,3) *
163*59599516SKenneth E. Jansen     &        fresli(:,3) * fresli(:,22)
164*59599516SKenneth E. Jansen         xlij(:,4) = fresli(:,7) - fresli(:,1) *
165*59599516SKenneth E. Jansen     &        fresli(:,2) * fresli(:,22)
166*59599516SKenneth E. Jansen         xlij(:,5) = fresli(:,8) - fresli(:,1) *
167*59599516SKenneth E. Jansen     &        fresli(:,3) * fresli(:,22)
168*59599516SKenneth E. Jansen         xlij(:,6) = fresli(:,9) - fresli(:,2) *
169*59599516SKenneth E. Jansen     &        fresli(:,3) * fresli(:,22)
170*59599516SKenneth E. Jansen
171*59599516SKenneth E. Jansen         xnumli(:) =    xlij(:,1) * xmij(:,1)
172*59599516SKenneth E. Jansen     &        + xlij(:,2) * xmij(:,2)
173*59599516SKenneth E. Jansen     &        + xlij(:,3) * xmij(:,3)
174*59599516SKenneth E. Jansen     &        + two * (xlij(:,4) * xmij(:,4)
175*59599516SKenneth E. Jansen     &        + xlij(:,5) * xmij(:,5)
176*59599516SKenneth E. Jansen     &        + xlij(:,6) * xmij(:,6))
177*59599516SKenneth E. Jansen         xdenli(:) =        xmij(:,1) * xmij(:,1)
178*59599516SKenneth E. Jansen     &        + xmij(:,2) * xmij(:,2)
179*59599516SKenneth E. Jansen     &        + xmij(:,3) * xmij(:,3)
180*59599516SKenneth E. Jansen     &        + two * (xmij(:,4) * xmij(:,4)
181*59599516SKenneth E. Jansen     &        + xmij(:,5) * xmij(:,5)
182*59599516SKenneth E. Jansen     &        + xmij(:,6) * xmij(:,6))
183*59599516SKenneth E. Jansen
184*59599516SKenneth E. Jansenc         xdenli = xdenli
185*59599516SKenneth E. Jansen
186*59599516SKenneth E. Jansen         xdenl(:) = xdenl(:) + xdenli(:)
187*59599516SKenneth E. Jansen         xnuml(:) = xnuml(:) + xnumli(:)
188*59599516SKenneth E. Jansen
189*59599516SKenneth E. Jansen      enddo
190*59599516SKenneth E. Jansen
191*59599516SKenneth E. Jansen      do nel = 1, npro
192*59599516SKenneth E. Jansen         xden(1) = xden(1) + xdenl(nel)
193*59599516SKenneth E. Jansen         xnum(1) = xnum(1) + xnuml(nel)
194*59599516SKenneth E. Jansen      enddo
195*59599516SKenneth E. Jansen
196*59599516SKenneth E. Jansen      return
197*59599516SKenneth E. Jansen
198*59599516SKenneth E. Jansen      end
199*59599516SKenneth E. Jansen
200*59599516SKenneth E. Jansen
201*59599516SKenneth E. Jansen
202*59599516SKenneth E. Jansen
203*59599516SKenneth E. Jansen
204*59599516SKenneth E. Jansen
205*59599516SKenneth E. Jansen
206*59599516SKenneth E. Jansen
207*59599516SKenneth E. Jansen
208*59599516SKenneth E. Jansen      subroutine getylist (ylist, lfathe, shp, x, ien)
209*59599516SKenneth E. Jansen
210*59599516SKenneth E. Jansen      include "common.h"
211*59599516SKenneth E. Jansen
212*59599516SKenneth E. Jansen      dimension lfathe(npro,maxsh),    shp(nshl,maxsh),
213*59599516SKenneth E. Jansen     &          x(numnp,3),            ien(npro,nshl),
214*59599516SKenneth E. Jansen     &          xl(npro,nenl,nsd),     ylist(idim)
215*59599516SKenneth E. Jansen
216*59599516SKenneth E. Jansen      integer intp
217*59599516SKenneth E. Jansen
218*59599516SKenneth E. Jansen      call localx (x,      xl,     ien,    3,  'gather  ')
219*59599516SKenneth E. Jansen
220*59599516SKenneth E. Jansen
221*59599516SKenneth E. Jansen      do nel  = 1, npro
222*59599516SKenneth E. Jansen      do intp = 1, ngauss
223*59599516SKenneth E. Jansen
224*59599516SKenneth E. Jansenc... Compute the y-coordinate of the current quad. pt. and call it yint.
225*59599516SKenneth E. Jansen
226*59599516SKenneth E. Jansen         yint = zero
227*59599516SKenneth E. Jansen         xint = zero
228*59599516SKenneth E. Jansen         zint = zero
229*59599516SKenneth E. Jansen         do n = 1, nenl
230*59599516SKenneth E. Jansen            yint = yint + xl(nel,n,2)*shp(n,intp)
231*59599516SKenneth E. Jansen            xint = xint + xl(nel,n,1)*shp(n,intp)
232*59599516SKenneth E. Jansen            zint = zint + xl(nel,n,3)*shp(n,intp)
233*59599516SKenneth E. Jansen         enddo
234*59599516SKenneth E. Jansen
235*59599516SKenneth E. Jansenc... Check ylist to see if yint is already included in ylist.
236*59599516SKenneth E. Jansen
237*59599516SKenneth E. Jansen         if(nlist .eq. 0)then ! In this case yint is definitely not in ylist.
238*59599516SKenneth E. Jansen            nlist            = nlist + 1
239*59599516SKenneth E. Jansen            ylist(nlist)     = yint
240*59599516SKenneth E. Jansen            lfathe(nel,intp) = nlist
241*59599516SKenneth E. Jansen
242*59599516SKenneth E. Jansen         else
243*59599516SKenneth E. Jansen
244*59599516SKenneth E. Jansen            do ilist = 1, nlist
245*59599516SKenneth E. Jansen               imatch = ilist
246*59599516SKenneth E. Jansen               if( abs(yint-ylist(ilist)) .lt. 0.00001 ) then
247*59599516SKenneth E. Jansen                  lfathe(nel,intp) = imatch
248*59599516SKenneth E. Jansen                  goto 5
249*59599516SKenneth E. Jansen               endif
250*59599516SKenneth E. Jansen            enddo
251*59599516SKenneth E. Jansen
252*59599516SKenneth E. Jansen            nlist            = nlist + 1
253*59599516SKenneth E. Jansen            ylist(nlist)     = yint
254*59599516SKenneth E. Jansen            lfathe(nel,intp) = nlist
255*59599516SKenneth E. Jansen
256*59599516SKenneth E. Jansen         endif
257*59599516SKenneth E. Jansen
258*59599516SKenneth E. Jansen 5       yint = zero
259*59599516SKenneth E. Jansen
260*59599516SKenneth E. Jansenc         if( nlist .eq. 5)then
261*59599516SKenneth E. Jansenc            write(*,*)'ylist yint=',ylist(4),ylist(5)
262*59599516SKenneth E. Jansenc            stop
263*59599516SKenneth E. Jansenc         endif
264*59599516SKenneth E. Jansen
265*59599516SKenneth E. Jansen      enddo ! End loop over quad. pts.
266*59599516SKenneth E. Jansen      enddo ! End loop over elements in current block.
267*59599516SKenneth E. Jansen
268*59599516SKenneth E. Jansen      return
269*59599516SKenneth E. Jansen      end
270*59599516SKenneth E. Jansen      subroutine projdmc (y,      shgl,      shp,
271*59599516SKenneth E. Jansen     &                   iper,   ilwork,       x)
272*59599516SKenneth E. Jansen
273*59599516SKenneth E. Jansen      use pointer_data
274*59599516SKenneth E. Jansen
275*59599516SKenneth E. Jansen      use aveall   ! This module helps us average cdelsq computed at quad pts
276*59599516SKenneth E. Jansen
277*59599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
278*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
279*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
280*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
281*59599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
282*59599516SKenneth E. Jansenc                    quad. points.
283*59599516SKenneth E. Jansen
284*59599516SKenneth E. Jansen      include "common.h"
285*59599516SKenneth E. Jansen      include "mpif.h"
286*59599516SKenneth E. Jansen      include "auxmpi.h"
287*59599516SKenneth E. Jansen
288*59599516SKenneth E. Jansenc
289*59599516SKenneth E. Jansen      dimension fres(nshg,24),         fwr(nshg),
290*59599516SKenneth E. Jansen     &          strnrm(nshg),          cdelsq(nshg),
291*59599516SKenneth E. Jansen     &          strl(numel,ngauss),
292*59599516SKenneth E. Jansen     &          y(nshg,5),            yold(nshg,5),
293*59599516SKenneth E. Jansen     &          iper(nshg),
294*59599516SKenneth E. Jansen     &          ilwork(nlwork),
295*59599516SKenneth E. Jansen     &          x(numnp,3),
296*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT),
297*59599516SKenneth E. Jansen     &          xden(idim),                    xnum(idim),
298*59599516SKenneth E. Jansen     &          xdent(idim),                   xnumt(idim)
299*59599516SKenneth E. Jansen
300*59599516SKenneth E. Jansen      fres = zero
301*59599516SKenneth E. Jansen      yold(:,1)=y(:,4)
302*59599516SKenneth E. Jansen      yold(:,2:4)=y(:,1:3)
303*59599516SKenneth E. Jansenc
304*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
305*59599516SKenneth E. Jansenc
306*59599516SKenneth E. Jansenc      yold(:,5) = 1.0
307*59599516SKenneth E. Jansenc      yold(:,2) = 2.0*x(:,1) - 3*x(:,2)
308*59599516SKenneth E. Jansenc      yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
309*59599516SKenneth E. Jansenc      yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
310*59599516SKenneth E. Jansenc      yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable
311*59599516SKenneth E. Jansenc                               suitable for the
312*59599516SKenneth E. Jansen
313*59599516SKenneth E. Jansen
314*59599516SKenneth E. Jansen      intrul=intg(1,itseq)
315*59599516SKenneth E. Jansen      intind=intpt(intrul)
316*59599516SKenneth E. Jansen
317*59599516SKenneth E. Jansen      do iblk = 1,nelblk
318*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
319*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
320*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
321*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
322*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
323*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
324*59599516SKenneth E. Jansen        inum  = iel + npro - 1
325*59599516SKenneth E. Jansen
326*59599516SKenneth E. Jansen        ngauss  = nint(lcsyst)
327*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
328*59599516SKenneth E. Jansen
329*59599516SKenneth E. Jansen        call asithf (yold, x, strl(iel:inum,:), mien(iblk)%p, fres,
330*59599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
331*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
332*59599516SKenneth E. Jansen
333*59599516SKenneth E. Jansen      enddo
334*59599516SKenneth E. Jansenc
335*59599516SKenneth E. Jansen
336*59599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 24, 'in ')
337*59599516SKenneth E. Jansenc
338*59599516SKenneth E. Jansenc account for periodicity in filtered variables
339*59599516SKenneth E. Jansenc
340*59599516SKenneth E. Jansen      do j = 1,nshg
341*59599516SKenneth E. Jansen        i = iper(j)
342*59599516SKenneth E. Jansen        if (i .ne. j) then
343*59599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:)
344*59599516SKenneth E. Jansen        endif
345*59599516SKenneth E. Jansen      enddo
346*59599516SKenneth E. Jansen
347*59599516SKenneth E. Jansen      do j = 1,nshg
348*59599516SKenneth E. Jansen        i = iper(j)
349*59599516SKenneth E. Jansen        if (i .ne. j) then
350*59599516SKenneth E. Jansen           fres(j,:) = fres(i,:)
351*59599516SKenneth E. Jansen        endif
352*59599516SKenneth E. Jansen      enddo
353*59599516SKenneth E. Jansen
354*59599516SKenneth E. Jansen      if(numpe>1)then
355*59599516SKenneth E. Jansen         call commu (fres, ilwork, 24, 'out')
356*59599516SKenneth E. Jansen      endif
357*59599516SKenneth E. Jansen
358*59599516SKenneth E. Jansen      fres(:,23) = one / fres(:,23)
359*59599516SKenneth E. Jansen      do j = 1,22
360*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,23)
361*59599516SKenneth E. Jansen      enddo
362*59599516SKenneth E. Jansen
363*59599516SKenneth E. Jansen      xden   = zero
364*59599516SKenneth E. Jansen      xdent  = zero
365*59599516SKenneth E. Jansen      xnum   = zero
366*59599516SKenneth E. Jansen      xnumt  = zero
367*59599516SKenneth E. Jansen
368*59599516SKenneth E. Jansen      do iblk = 1,nelblk
369*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
370*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
371*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
372*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
373*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
374*59599516SKenneth E. Jansen        inum  = iel + npro - 1
375*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
376*59599516SKenneth E. Jansen        call smagcoeff (fres(:,1:22), xden, xnum, mien(iblk)%p,
377*59599516SKenneth E. Jansen     &                  shp(lcsyst,1:nshl,:), ifathe(iel:inum,:))
378*59599516SKenneth E. Jansen
379*59599516SKenneth E. Jansen      enddo
380*59599516SKenneth E. Jansen
381*59599516SKenneth E. Jansen      if(numpe.gt.1)then
382*59599516SKenneth E. Jansen         call drvAllreduce( xden, xdent, idim )
383*59599516SKenneth E. Jansen         call drvAllreduce( xnum, xnumt, idim )
384*59599516SKenneth E. Jansen      else
385*59599516SKenneth E. Jansen         xdent  = xden
386*59599516SKenneth E. Jansen         xnumt  = xnum
387*59599516SKenneth E. Jansen      endif
388*59599516SKenneth E. Jansen
389*59599516SKenneth E. Jansen      do i = 1, nlist
390*59599516SKenneth E. Jansen         cdelsq(i) = pt5*xnumt(i)/xdent(i)
391*59599516SKenneth E. Jansen      enddo
392*59599516SKenneth E. Jansen
393*59599516SKenneth E. Jansenc...  Uncomment for averaging over all directions
394*59599516SKenneth E. Jansen
395*59599516SKenneth E. Jansenc      sumc1 = 0.0
396*59599516SKenneth E. Jansenc      sumc2 = 0.0
397*59599516SKenneth E. Jansenc      do i = 1, nlist
398*59599516SKenneth E. Jansenc         sumc1 = sumc1 + xnumt(i)
399*59599516SKenneth E. Jansenc         sumc2 = sumc2 + xdent(i)
400*59599516SKenneth E. Jansenc      enddo
401*59599516SKenneth E. Jansenc      xfact = pt5*sumc1/sumc2
402*59599516SKenneth E. Jansenc      cdelsq(:) = xfact
403*59599516SKenneth E. Jansenc      if(myrank .eq. master)then
404*59599516SKenneth E. Jansenc         write(22,*)cdelsq(1)
405*59599516SKenneth E. Jansenc      endif
406*59599516SKenneth E. Jansen
407*59599516SKenneth E. Jansenc...  End of averaging over all directions.
408*59599516SKenneth E. Jansen
409*59599516SKenneth E. Jansen      do iblk = 1,nelblk
410*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
411*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
412*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
413*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
414*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
415*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
416*59599516SKenneth E. Jansen        inum  = iel + npro - 1
417*59599516SKenneth E. Jansen
418*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
419*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
420*59599516SKenneth E. Jansen
421*59599516SKenneth E. Jansen        if (ngauss .ne. ngaussf) then
422*59599516SKenneth E. Jansen        call getstrl (yold, x,      mien(iblk)%p,
423*59599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
424*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
425*59599516SKenneth E. Jansen        endif
426*59599516SKenneth E. Jansen
427*59599516SKenneth E. Jansen      enddo
428*59599516SKenneth E. Jansen
429*59599516SKenneth E. Jansen      do iblk = 1,nelblk
430*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
431*59599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
432*59599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
433*59599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
434*59599516SKenneth E. Jansen         inum  = iel + npro - 1
435*59599516SKenneth E. Jansen
436*59599516SKenneth E. Jansen         ngauss = nint(lcsyst)
437*59599516SKenneth E. Jansen
438*59599516SKenneth E. Jansen         call getnu (mien(iblk)%p, strl(iel:inum,:),
439*59599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,ifathe(iel:inum,:))
440*59599516SKenneth E. Jansen      enddo
441*59599516SKenneth E. Jansen
442*59599516SKenneth E. Jansen
443*59599516SKenneth E. Jansen      return
444*59599516SKenneth E. Jansen      end
445*59599516SKenneth E. Jansen
446*59599516SKenneth E. Jansen
447*59599516SKenneth E. Jansen
448*59599516SKenneth E. Jansen      subroutine smagcoeff (fres, xden, xnum, ien, shp, lfathe)
449*59599516SKenneth E. Jansen
450*59599516SKenneth E. Jansen      include "common.h"
451*59599516SKenneth E. Jansen
452*59599516SKenneth E. Jansen      dimension ien(npro,nshl),          fres(nshg,22),
453*59599516SKenneth E. Jansen     &          shp(nshl,maxsh),         fresli(npro,22),
454*59599516SKenneth E. Jansen     &          fresl(npro,nshl,22),     strnrmi(npro),
455*59599516SKenneth E. Jansen     &          xnutl(npro),             fwr(npro),
456*59599516SKenneth E. Jansen     &          xmij(npro,6),            xlij(npro,6),
457*59599516SKenneth E. Jansen     &          xdenli(npro,ngauss),      xnumli(npro,ngauss),
458*59599516SKenneth E. Jansen     &          xden(idim),              xnum(idim),
459*59599516SKenneth E. Jansen     &          lfathe(npro,maxsh)
460*59599516SKenneth E. Jansen
461*59599516SKenneth E. Jansen      call local (fres, fresl, ien, 22, 'gather  ')
462*59599516SKenneth E. Jansen
463*59599516SKenneth E. Jansen      do intp = 1, ngauss
464*59599516SKenneth E. Jansen
465*59599516SKenneth E. Jansen         fresli = zero
466*59599516SKenneth E. Jansen         do i = 1, nenl
467*59599516SKenneth E. Jansen            do j = 1, 22
468*59599516SKenneth E. Jansen               fresli(:,j) = fresli(:,j) + shp(i,intp)*fresl(:,i,j)
469*59599516SKenneth E. Jansen            enddo
470*59599516SKenneth E. Jansen         enddo
471*59599516SKenneth E. Jansen
472*59599516SKenneth E. Jansen         strnrmi(:) =  sqrt(
473*59599516SKenneth E. Jansen     &   two * (fresli(:,10)**2 + fresli(:,11)**2 + fresli(:,12)**2)
474*59599516SKenneth E. Jansen     &   + four * ( fresli(:,13)**2 + fresli(:,14)**2 +
475*59599516SKenneth E. Jansen     &   fresli(:,15)**2 ) )
476*59599516SKenneth E. Jansen
477*59599516SKenneth E. Jansen         fwr = fwr1 * fresli(:,22) * strnrmi(:)
478*59599516SKenneth E. Jansen
479*59599516SKenneth E. Jansen         xmij(:,1) = -fwr
480*59599516SKenneth E. Jansen     &        * fresli(:,10) + fresli(:,16)
481*59599516SKenneth E. Jansen
482*59599516SKenneth E. Jansen         xmij(:,2) = -fwr
483*59599516SKenneth E. Jansen     &        * fresli(:,11) + fresli(:,17)
484*59599516SKenneth E. Jansen
485*59599516SKenneth E. Jansen         xmij(:,3) = -fwr
486*59599516SKenneth E. Jansen     &        * fresli(:,12) + fresli(:,18)
487*59599516SKenneth E. Jansen
488*59599516SKenneth E. Jansen         xmij(:,4) = -fwr * fresli(:,13) + fresli(:,19)
489*59599516SKenneth E. Jansen         xmij(:,5) = -fwr * fresli(:,14) + fresli(:,20)
490*59599516SKenneth E. Jansen         xmij(:,6) = -fwr * fresli(:,15) + fresli(:,21)
491*59599516SKenneth E. Jansen
492*59599516SKenneth E. Jansen         fresli(:,22) = one/fresli(:,22)
493*59599516SKenneth E. Jansen
494*59599516SKenneth E. Jansen         xlij(:,1) = fresli(:,4) - fresli(:,1) *
495*59599516SKenneth E. Jansen     &        fresli(:,1) * fresli(:,22)
496*59599516SKenneth E. Jansen         xlij(:,2) = fresli(:,5) - fresli(:,2) *
497*59599516SKenneth E. Jansen     &        fresli(:,2) * fresli(:,22)
498*59599516SKenneth E. Jansen         xlij(:,3) = fresli(:,6) - fresli(:,3) *
499*59599516SKenneth E. Jansen     &        fresli(:,3) * fresli(:,22)
500*59599516SKenneth E. Jansen         xlij(:,4) = fresli(:,7) - fresli(:,1) *
501*59599516SKenneth E. Jansen     &        fresli(:,2) * fresli(:,22)
502*59599516SKenneth E. Jansen         xlij(:,5) = fresli(:,8) - fresli(:,1) *
503*59599516SKenneth E. Jansen     &        fresli(:,3) * fresli(:,22)
504*59599516SKenneth E. Jansen         xlij(:,6) = fresli(:,9) - fresli(:,2) *
505*59599516SKenneth E. Jansen     &        fresli(:,3) * fresli(:,22)
506*59599516SKenneth E. Jansen
507*59599516SKenneth E. Jansen         xnumli(:,intp) =    xlij(:,1) * xmij(:,1)
508*59599516SKenneth E. Jansen     &        + xlij(:,2) * xmij(:,2)
509*59599516SKenneth E. Jansen     &        + xlij(:,3) * xmij(:,3)
510*59599516SKenneth E. Jansen     &        + two * (xlij(:,4) * xmij(:,4)
511*59599516SKenneth E. Jansen     &        + xlij(:,5) * xmij(:,5)
512*59599516SKenneth E. Jansen     &        + xlij(:,6) * xmij(:,6))
513*59599516SKenneth E. Jansen         xdenli(:,intp) =        xmij(:,1) * xmij(:,1)
514*59599516SKenneth E. Jansen     &        + xmij(:,2) * xmij(:,2)
515*59599516SKenneth E. Jansen     &        + xmij(:,3) * xmij(:,3)
516*59599516SKenneth E. Jansen     &        + two * (xmij(:,4) * xmij(:,4)
517*59599516SKenneth E. Jansen     &        + xmij(:,5) * xmij(:,5)
518*59599516SKenneth E. Jansen     &        + xmij(:,6) * xmij(:,6))
519*59599516SKenneth E. Jansen
520*59599516SKenneth E. Jansen
521*59599516SKenneth E. Jansen      enddo ! End loop over quad pts
522*59599516SKenneth E. Jansen
523*59599516SKenneth E. Jansenc... For debugging
524*59599516SKenneth E. Jansen
525*59599516SKenneth E. Jansenc      do nel = 1, npro
526*59599516SKenneth E. Jansenc      do intp = 1, ngauss
527*59599516SKenneth E. Jansen
528*59599516SKenneth E. Jansenc         if ( mod(lfathe(nel,intp),2) .eq. 0 )then
529*59599516SKenneth E. Jansenc            xnumli(nel,intp) = 2.0
530*59599516SKenneth E. Jansenc            xdenli(nel,intp) = 3.0
531*59599516SKenneth E. Jansenc         else
532*59599516SKenneth E. Jansenc            xnumli(nel,intp) = 5.0
533*59599516SKenneth E. Jansenc            xdenli(nel,intp) = 2.5
534*59599516SKenneth E. Jansenc         endif
535*59599516SKenneth E. Jansen
536*59599516SKenneth E. Jansenc      enddo
537*59599516SKenneth E. Jansenc      enddo
538*59599516SKenneth E. Jansen
539*59599516SKenneth E. Jansenc...  End of debugging stuff.
540*59599516SKenneth E. Jansen
541*59599516SKenneth E. Jansen
542*59599516SKenneth E. Jansen      do intp = 1, ngauss
543*59599516SKenneth E. Jansen      do nel  = 1, npro
544*59599516SKenneth E. Jansen
545*59599516SKenneth E. Jansen         xden( lfathe(nel,intp) ) = xden( lfathe(nel,intp) ) +
546*59599516SKenneth E. Jansen     &        xdenli(nel,intp)
547*59599516SKenneth E. Jansen
548*59599516SKenneth E. Jansen         xnum( lfathe(nel,intp) ) = xnum( lfathe(nel,intp) ) +
549*59599516SKenneth E. Jansen     &        xnumli(nel,intp)
550*59599516SKenneth E. Jansen
551*59599516SKenneth E. Jansen      enddo
552*59599516SKenneth E. Jansen      enddo
553*59599516SKenneth E. Jansen
554*59599516SKenneth E. Jansen      return
555*59599516SKenneth E. Jansen
556*59599516SKenneth E. Jansen      end
557*59599516SKenneth E. Jansen
558*59599516SKenneth E. Jansen
559*59599516SKenneth E. Jansen
560*59599516SKenneth E. Jansen
561*59599516SKenneth E. Jansen
562*59599516SKenneth E. Jansen
563*59599516SKenneth E. Jansen
564*59599516SKenneth E. Jansen
565*59599516SKenneth E. Jansen
566