xref: /phasta/phSolver/common/getdmc.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine getdmc (y,      shgl,      shp,
2*59599516SKenneth E. Jansen     &                   iper,   ilwork,
3*59599516SKenneth E. Jansen     &                   nsons,  ifath,     x)
4*59599516SKenneth E. Jansen
5*59599516SKenneth E. Jansen      use pointer_data
6*59599516SKenneth E. Jansen
7*59599516SKenneth E. Jansen      use quadfilt   ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf),
8*59599516SKenneth E. Jansenc                    shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf).
9*59599516SKenneth E. Jansenc                    Shpf and shglf are the shape funciotns and their
10*59599516SKenneth E. Jansenc                    gradient evaluated using the quadrature rule desired
11*59599516SKenneth E. Jansenc                    for computing the dmod. Qwt contains the weights of the
12*59599516SKenneth E. Jansenc                    quad. points.
13*59599516SKenneth E. Jansen
14*59599516SKenneth E. Jansen
15*59599516SKenneth E. Jansen
16*59599516SKenneth E. Jansen      include "common.h"
17*59599516SKenneth E. Jansen      include "mpif.h"
18*59599516SKenneth E. Jansen      include "auxmpi.h"
19*59599516SKenneth E. Jansen
20*59599516SKenneth E. Jansenc
21*59599516SKenneth E. Jansen      dimension fres(nshg,24),         fwr(nshg),
22*59599516SKenneth E. Jansen     &          strnrm(nshg),         cdelsq(nshg),
23*59599516SKenneth E. Jansen     &          xnum(nshg),           xden(nshg),
24*59599516SKenneth E. Jansen     &          xmij(nshg,6),         xlij(nshg,6),
25*59599516SKenneth E. Jansen     &          xnude(nfath,2),        xnuder(nfath,2),
26*59599516SKenneth E. Jansen     &          nsons(nfath),
27*59599516SKenneth E. Jansen     &          strl(numel,maxnint),
28*59599516SKenneth E. Jansen     &          y(nshg,5),
29*59599516SKenneth E. Jansen     &          ifath(nshg),          iper(nshg),
30*59599516SKenneth E. Jansen     &          ilwork(nlwork),!        xmudmi(numel,ngauss),
31*59599516SKenneth E. Jansen     &          x(numnp,3),
32*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT)
33*59599516SKenneth E. Jansenc$$$     &          ,xnutf(nfath)  must be uncommmented for diags at bottom
34*59599516SKenneth E. Jansenc
35*59599516SKenneth E. Jansenc
36*59599516SKenneth E. Jansenc   setup the weights for time averaging of cdelsq (now in quadfilt module)
37*59599516SKenneth E. Jansenc
38*59599516SKenneth E. Jansen      denom=max(1.0d0*(lstep),one)
39*59599516SKenneth E. Jansen      if(dtavei.lt.0) then
40*59599516SKenneth E. Jansen         wcur=one/denom
41*59599516SKenneth E. Jansen      else
42*59599516SKenneth E. Jansen         wcur=dtavei
43*59599516SKenneth E. Jansen      endif
44*59599516SKenneth E. Jansen      whist=1.0-wcur
45*59599516SKenneth E. Jansenc
46*59599516SKenneth E. Jansenc  hack in an interesting velocity field (uncomment to test dmod)
47*59599516SKenneth E. Jansenc
48*59599516SKenneth E. Jansenc      y(:,5) = 1.0
49*59599516SKenneth E. Jansenc      y(:,2) = 2.0*x(:,1) - 3*x(:,2)
50*59599516SKenneth E. Jansenc      y(:,3) = 3.0*x(:,1) + 4.0*x(:,2)
51*59599516SKenneth E. Jansenc      y(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3)
52*59599516SKenneth E. Jansenc      y(:,1) = Rgas * y(:,5) ! Necessary to make model suitable suitable
53*59599516SKenneth E. Jansen                             ! for the incompressible case.
54*59599516SKenneth E. Jansenc
55*59599516SKenneth E. Jansen
56*59599516SKenneth E. Jansen
57*59599516SKenneth E. Jansen      fres = zero
58*59599516SKenneth E. Jansenc
59*59599516SKenneth E. Jansenc       y(:,5) = 1.0
60*59599516SKenneth E. Jansenc       y(:,1) = 2.0*x(:,1) - 3*x(:,2)
61*59599516SKenneth E. Jansenc       y(:,2) = 3.0*x(:,1) + 4.0*x(:,2)
62*59599516SKenneth E. Jansenc       y(:,3) = 4.0*x(:,1) + x(:,2) + x(:,3)
63*59599516SKenneth E. Jansenc       y(:,4) = 1.0    ! Necessary to make model suitable suitable
64*59599516SKenneth E. Jansen                             ! for the incompressible case.
65*59599516SKenneth E. Jansenc
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansen
68*59599516SKenneth E. Jansen      intrul=intg(1,itseq)
69*59599516SKenneth E. Jansen      intind=intpt(intrul)
70*59599516SKenneth E. Jansen
71*59599516SKenneth E. Jansen      do iblk = 1,nelblk
72*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
73*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
74*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
75*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
76*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
77*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
78*59599516SKenneth E. Jansen        inum  = iel + npro - 1
79*59599516SKenneth E. Jansen
80*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
81*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
82*59599516SKenneth E. Jansen
83*59599516SKenneth E. Jansen        call asithf (y, x, strl(iel:inum,:), mien(iblk)%p, fres,
84*59599516SKenneth E. Jansen     &               shglf(lcsyst,:,1:nshl,:),
85*59599516SKenneth E. Jansen     &               shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf))
86*59599516SKenneth E. Jansen
87*59599516SKenneth E. Jansen      enddo
88*59599516SKenneth E. Jansenc
89*59599516SKenneth E. Jansen
90*59599516SKenneth E. Jansen      do iblk = 1,nelblk
91*59599516SKenneth E. Jansen        lcsyst = lcblk(3,iblk)
92*59599516SKenneth E. Jansen        iel  = lcblk(1,iblk) !Element number where this block begins
93*59599516SKenneth E. Jansen        npro = lcblk(1,iblk+1) - iel
94*59599516SKenneth E. Jansen        lelCat = lcblk(2,iblk)
95*59599516SKenneth E. Jansen        nenl = lcblk(5,iblk)
96*59599516SKenneth E. Jansen        nshl = lcblk(10,iblk)
97*59599516SKenneth E. Jansen        inum  = iel + npro - 1
98*59599516SKenneth E. Jansen
99*59599516SKenneth E. Jansen        ngauss = nint(lcsyst)
100*59599516SKenneth E. Jansen        ngaussf = nintf(lcsyst)
101*59599516SKenneth E. Jansen
102*59599516SKenneth E. Jansen        if (ngaussf .ne. ngauss) then
103*59599516SKenneth E. Jansen        call getstrl (y, x,      mien(iblk)%p,
104*59599516SKenneth E. Jansen     &               strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:),
105*59599516SKenneth E. Jansen     &               shp(lcsyst,1:nshl,:))
106*59599516SKenneth E. Jansen        endif
107*59599516SKenneth E. Jansen
108*59599516SKenneth E. Jansen      enddo
109*59599516SKenneth E. Jansenc
110*59599516SKenneth E. Jansenc
111*59599516SKenneth E. JansenC must fix for abc and dynamic model
112*59599516SKenneth E. Jansenc      if(iabc==1)   !are there any axisym bc's
113*59599516SKenneth E. Jansenc     &      call rotabc(res, iBC,  'in ')
114*59599516SKenneth E. Jansenc
115*59599516SKenneth E. Jansen      if(numpe>1) call commu (fres, ilwork, 24, 'in ')
116*59599516SKenneth E. Jansen!proc-masters = proc-masters + proc-slaves
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansenc account for periodicity in filtered variables
119*59599516SKenneth E. Jansenc
120*59599516SKenneth E. Jansen      do j = 1,nshg
121*59599516SKenneth E. Jansen        i = iper(j)
122*59599516SKenneth E. Jansen        if (i .ne. j) then
123*59599516SKenneth E. Jansen           fres(i,:) = fres(i,:) + fres(j,:) ! masters = masters + slaves
124*59599516SKenneth E. Jansen        endif
125*59599516SKenneth E. Jansen      enddo
126*59599516SKenneth E. Jansen      do j = 1,nshg
127*59599516SKenneth E. Jansen        i = iper(j)
128*59599516SKenneth E. Jansen        if (i .ne. j) then
129*59599516SKenneth E. Jansen           fres(j,:) = fres(i,:)  !slaves get copy of the complete master
130*59599516SKenneth E. Jansen        endif
131*59599516SKenneth E. Jansen      enddo
132*59599516SKenneth E. Jansen
133*59599516SKenneth E. Jansen      if (nfath .eq. 0) then
134*59599516SKenneth E. Jansen         if(numpe>1)   call commu (fres, ilwork, 24, 'out')
135*59599516SKenneth E. Jansenc again we will need a  call
136*59599516SKenneth E. Jansenc      if(iabc==1)   !are there any axisym bc's
137*59599516SKenneth E. Jansenc     &   rotabc(y, iBC,  'out')
138*59599516SKenneth E. Jansen      endif
139*59599516SKenneth E. Jansen
140*59599516SKenneth E. Jansen      fres(:,23) = one / fres(:,23)
141*59599516SKenneth E. Jansen      do j = 1,22
142*59599516SKenneth E. Jansen        fres(:,j) = fres(:,j) * fres(:,23)  !"solve"
143*59599516SKenneth E. Jansen      enddo
144*59599516SKenneth E. Jansenc     fres(:,24) = fres(:,24) * fres(:,23)
145*59599516SKenneth E. Jansenc
146*59599516SKenneth E. Jansenc.....at this point fres is really all of our filtered quantities
147*59599516SKenneth E. Jansenc     at the nodes
148*59599516SKenneth E. Jansenc
149*59599516SKenneth E. Jansen
150*59599516SKenneth E. Jansen      strnrm = sqrt(
151*59599516SKenneth E. Jansen     &  two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2)
152*59599516SKenneth E. Jansen     &  + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) )
153*59599516SKenneth E. Jansen
154*59599516SKenneth E. Jansen      fwr = fwr1 * fres(:,22) * strnrm
155*59599516SKenneth E. Jansen
156*59599516SKenneth E. Jansen
157*59599516SKenneth E. Jansen
158*59599516SKenneth E. Jansenc... There is a difference in xmij(:,1:3) between the compressible
159*59599516SKenneth E. Jansenc... and incompressible forms of the model.
160*59599516SKenneth E. Jansen
161*59599516SKenneth E. Jansen
162*59599516SKenneth E. Jansen      if(matflg(1,1).eq.0) then ! compressible
163*59599516SKenneth E. Jansen
164*59599516SKenneth E. Jansen      xmij(:,1) = -fwr
165*59599516SKenneth E. Jansen     &             * pt33 * (two*fres(:,10) - fres(:,11) - fres(:,12))
166*59599516SKenneth E. Jansen     &             + pt33 * (two*fres(:,16) - fres(:,17) - fres(:,18))
167*59599516SKenneth E. Jansen      xmij(:,2) = -fwr
168*59599516SKenneth E. Jansen     &             * pt33 * (two*fres(:,11) - fres(:,10) - fres(:,12))
169*59599516SKenneth E. Jansen     &             + pt33 * (two*fres(:,17) - fres(:,16) - fres(:,18))
170*59599516SKenneth E. Jansen      xmij(:,3) = -fwr
171*59599516SKenneth E. Jansen     &             * pt33 * (two*fres(:,12) - fres(:,10) - fres(:,11))
172*59599516SKenneth E. Jansen     &             + pt33 * (two*fres(:,18) - fres(:,16) - fres(:,17))
173*59599516SKenneth E. Jansen
174*59599516SKenneth E. Jansen      else
175*59599516SKenneth E. Jansen
176*59599516SKenneth E. Jansen      xmij(:,1) = -fwr
177*59599516SKenneth E. Jansen     &             * fres(:,10) + fres(:,16)
178*59599516SKenneth E. Jansen      xmij(:,2) = -fwr
179*59599516SKenneth E. Jansen     &             * fres(:,11) + fres(:,17)
180*59599516SKenneth E. Jansen      xmij(:,3) = -fwr
181*59599516SKenneth E. Jansen     &             * fres(:,12) + fres(:,18)
182*59599516SKenneth E. Jansen
183*59599516SKenneth E. Jansen      endif
184*59599516SKenneth E. Jansen
185*59599516SKenneth E. Jansen      xmij(:,4) = -fwr * fres(:,13) + fres(:,19)
186*59599516SKenneth E. Jansen      xmij(:,5) = -fwr * fres(:,14) + fres(:,20)
187*59599516SKenneth E. Jansen      xmij(:,6) = -fwr * fres(:,15) + fres(:,21)
188*59599516SKenneth E. Jansen
189*59599516SKenneth E. Jansen      fres(:,22) = one / fres(:,22)
190*59599516SKenneth E. Jansen
191*59599516SKenneth E. Jansen      xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1) * fres(:,22)
192*59599516SKenneth E. Jansen      xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2) * fres(:,22)
193*59599516SKenneth E. Jansen      xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3) * fres(:,22)
194*59599516SKenneth E. Jansen      xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2) * fres(:,22)
195*59599516SKenneth E. Jansen      xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3) * fres(:,22)
196*59599516SKenneth E. Jansen      xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3) * fres(:,22)
197*59599516SKenneth E. Jansen
198*59599516SKenneth E. Jansen      xnum =        xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2)
199*59599516SKenneth E. Jansen     &                                    + xlij(:,3) * xmij(:,3)
200*59599516SKenneth E. Jansen     &     + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5)
201*59599516SKenneth E. Jansen     &                                    + xlij(:,6) * xmij(:,6))
202*59599516SKenneth E. Jansen      xden =        xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2)
203*59599516SKenneth E. Jansen     &                                    + xmij(:,3) * xmij(:,3)
204*59599516SKenneth E. Jansen     &     + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5)
205*59599516SKenneth E. Jansen     &                                    + xmij(:,6) * xmij(:,6))
206*59599516SKenneth E. Jansen      xden = two * xden
207*59599516SKenneth E. Jansen
208*59599516SKenneth E. Jansenc  zero on processor periodic nodes so that they will not be added twice
209*59599516SKenneth E. Jansen        do j = 1,numnp
210*59599516SKenneth E. Jansen          i = iper(j)
211*59599516SKenneth E. Jansen          if (i .ne. j) then
212*59599516SKenneth E. Jansen            xnum(j) = zero
213*59599516SKenneth E. Jansen            xden(j) = zero
214*59599516SKenneth E. Jansen          endif
215*59599516SKenneth E. Jansen        enddo
216*59599516SKenneth E. Jansen
217*59599516SKenneth E. Jansen      if (numpe.gt.1 .and. nsons(1).gt.1) then
218*59599516SKenneth E. Jansen
219*59599516SKenneth E. Jansen         numtask = ilwork(1)
220*59599516SKenneth E. Jansen         itkbeg = 1
221*59599516SKenneth E. Jansen
222*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors
223*59599516SKenneth E. Jansen         do itask = 1, numtask
224*59599516SKenneth E. Jansen
225*59599516SKenneth E. Jansen            iacc   = ilwork (itkbeg + 2)
226*59599516SKenneth E. Jansen            numseg = ilwork (itkbeg + 4)
227*59599516SKenneth E. Jansen
228*59599516SKenneth E. Jansen            if (iacc .eq. 0) then
229*59599516SKenneth E. Jansen               do is = 1,numseg
230*59599516SKenneth E. Jansen                  isgbeg = ilwork (itkbeg + 3 + 2*is)
231*59599516SKenneth E. Jansen                  lenseg = ilwork (itkbeg + 4 + 2*is)
232*59599516SKenneth E. Jansen                  isgend = isgbeg + lenseg - 1
233*59599516SKenneth E. Jansen                  xnum(isgbeg:isgend) = zero
234*59599516SKenneth E. Jansen                  xden(isgbeg:isgend) = zero
235*59599516SKenneth E. Jansen               enddo
236*59599516SKenneth E. Jansen            endif
237*59599516SKenneth E. Jansen
238*59599516SKenneth E. Jansen            itkbeg = itkbeg + 4 + 2*numseg
239*59599516SKenneth E. Jansen
240*59599516SKenneth E. Jansen         enddo
241*59599516SKenneth E. Jansen
242*59599516SKenneth E. Jansen      endif
243*59599516SKenneth E. Jansenc
244*59599516SKenneth E. Jansenc Description of arrays.   Each processor has an array of length equal
245*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect
246*59599516SKenneth E. Jansenc the numerator and one to collect the denominator.  There is also an array
247*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each
248*59599516SKenneth E. Jansenc on processor node, ifath(nnshg).  Finally, there is an arry of length
249*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons
250*59599516SKenneth E. Jansenc for each father.
251*59599516SKenneth E. Jansenc
252*59599516SKenneth E. Jansenc  Now loop over nodes and accumlate the numerator and the denominator
253*59599516SKenneth E. Jansenc  to the father nodes.  Only on processor addition at this point.
254*59599516SKenneth E. Jansenc  Note that serrogate fathers are collect some for the case where some
255*59599516SKenneth E. Jansenc  sons are on another processor
256*59599516SKenneth E. Jansenc
257*59599516SKenneth E. Jansen      ihomog=1
258*59599516SKenneth E. Jansen      if(maxval(nsons).eq.1) ihomog=0
259*59599516SKenneth E. Jansen      if(ihomog.eq.1) then
260*59599516SKenneth E. Jansen         xnude = zero
261*59599516SKenneth E. Jansen         do i = 1,nshg
262*59599516SKenneth E. Jansen            xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i)
263*59599516SKenneth E. Jansen            xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i)
264*59599516SKenneth E. Jansen         enddo
265*59599516SKenneth E. Jansen      else                      ! no homogeneity assumed
266*59599516SKenneth E. Jansen         xnude(:,1)=xnum(:)
267*59599516SKenneth E. Jansen         xnude(:,2)=xden(:)
268*59599516SKenneth E. Jansen      endif
269*59599516SKenneth E. Jansen
270*59599516SKenneth E. Jansenc
271*59599516SKenneth E. Jansenc Now  the true fathers and serrogates combine results and update
272*59599516SKenneth E. Jansenc each other.
273*59599516SKenneth E. Jansenc
274*59599516SKenneth E. Jansenc ONLY DO THIS IF  1) multiprocessors AND 2) homogenous directions exist
275*59599516SKenneth E. Jansen
276*59599516SKenneth E. Jansen      if(numpe .gt. 1 .and. ihomog.eq.1 )then
277*59599516SKenneth E. Jansen         call drvAllreduce(xnude, xnuder,2*nfath)
278*59599516SKenneth E. Jansenc
279*59599516SKenneth E. Jansenc  xnude is the sum of the sons for each father on this processor
280*59599516SKenneth E. Jansenc
281*59599516SKenneth E. Jansenc  xnuder is the sum of the sons for each father on all processor combined
282*59599516SKenneth E. Jansenc  (the same as if we had not partitioned the mesh for each processor)
283*59599516SKenneth E. Jansenc
284*59599516SKenneth E. Jansenc   For each father we have precomputed the number of sons (including
285*59599516SKenneth E. Jansenc   the sons off processor).
286*59599516SKenneth E. Jansenc
287*59599516SKenneth E. Jansenc   Now divide by number of sons to get the average (not really necessary
288*59599516SKenneth E. Jansenc   for dynamic model since ratio will cancel nsons at each father)
289*59599516SKenneth E. Jansenc
290*59599516SKenneth E. Jansenc         xnuder(:,1) = xnuder(:,1) ! / nsons(:)
291*59599516SKenneth E. Jansenc         xnuder(:,2) = xnuder(:,2) ! / nsons(:)
292*59599516SKenneth E. Jansenc
293*59599516SKenneth E. Jansenc  the next line is c \Delta^2
294*59599516SKenneth E. Jansenc
295*59599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnuder(ifath(:),1)
296*59599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnuder(ifath(:),2)
297*59599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
298*59599516SKenneth E. Jansenc  note that we have whist and wcur in here to allow for both time
299*59599516SKenneth E. Jansenc  averaging to be used in conjunction with spatial homogenous averaging
300*59599516SKenneth E. Jansen
301*59599516SKenneth E. Jansen      else
302*59599516SKenneth E. Jansenc
303*59599516SKenneth E. Jansenc     the next line is c \Delta^2, not nu_T but we want to save the
304*59599516SKenneth E. Jansenc     memory
305*59599516SKenneth E. Jansenc
306*59599516SKenneth E. Jansen
307*59599516SKenneth E. Jansenc$$$            write(400+myrank,555) (numNden(j*500,1),j=1,5)
308*59599516SKenneth E. Jansenc$$$            write(410+myrank,555) (numNden(j*500,2),j=1,5)
309*59599516SKenneth E. Jansenc$$$            write(500+myrank,555) (numNden(j+500,1),j=1,5)
310*59599516SKenneth E. Jansenc$$$            write(510+myrank,555) (numNden(j+500,2),j=1,5)
311*59599516SKenneth E. Jansenc$$$
312*59599516SKenneth E. Jansenc$$$            write(430+myrank,555) (xnude(j*500,1),j=1,5)
313*59599516SKenneth E. Jansenc$$$            write(440+myrank,555) (xnude(j*500,2),j=1,5)
314*59599516SKenneth E. Jansenc$$$            write(530+myrank,555) (xnude(j+500,1),j=1,5)
315*59599516SKenneth E. Jansenc$$$            write(540+myrank,555) (xnude(j+500,2),j=1,5)
316*59599516SKenneth E. Jansen
317*59599516SKenneth E. Jansen            numNden(:,1) = whist*numNden(:,1)+wcur*xnude(ifath(:),1)
318*59599516SKenneth E. Jansen            numNden(:,2) = whist*numNden(:,2)+wcur*xnude(ifath(:),2)
319*59599516SKenneth E. Jansen            cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09)
320*59599516SKenneth E. Jansen
321*59599516SKenneth E. Jansenc
322*59599516SKenneth E. Jansenc  to get started we hold cdelsq fixed
323*59599516SKenneth E. Jansenc
324*59599516SKenneth E. Jansenc            cdelsq(:) = 2.27e-4
325*59599516SKenneth E. Jansenc            cdelsq(:) = 0
326*59599516SKenneth E. Jansen
327*59599516SKenneth E. Jansen
328*59599516SKenneth E. Jansenc$$$
329*59599516SKenneth E. Jansenc$$$            write(450+myrank,555) (cdelsq(j*500),j=1,5)
330*59599516SKenneth E. Jansenc$$$            write(460+myrank,555) (y(j*500,1),j=1,5)
331*59599516SKenneth E. Jansenc$$$            write(470+myrank,555) (y(j*500,2),j=1,5)
332*59599516SKenneth E. Jansenc$$$            write(480+myrank,555) (y(j*500,3),j=1,5)
333*59599516SKenneth E. Jansenc$$$            write(490+myrank,555) (strnrm(j*500),j=1,5)
334*59599516SKenneth E. Jansenc$$$
335*59599516SKenneth E. Jansenc$$$            write(550+myrank,555) (cdelsq(j+500),j=1,5)
336*59599516SKenneth E. Jansenc$$$            write(560+myrank,555) (y(j+500,1),j=1,5)
337*59599516SKenneth E. Jansenc$$$            write(570+myrank,555) (y(j+500,2),j=1,5)
338*59599516SKenneth E. Jansenc$$$            write(580+myrank,555) (y(j+500,3),j=1,5)
339*59599516SKenneth E. Jansenc$$$            write(590+myrank,555) (strnrm(j+500),j=1,5)
340*59599516SKenneth E. Jansenc$$$
341*59599516SKenneth E. Jansenc$$$            call flush(400+myrank)
342*59599516SKenneth E. Jansenc$$$            call flush(410+myrank)
343*59599516SKenneth E. Jansenc$$$            call flush(430+myrank)
344*59599516SKenneth E. Jansenc$$$            call flush(440+myrank)
345*59599516SKenneth E. Jansenc$$$            call flush(450+myrank)
346*59599516SKenneth E. Jansenc$$$            call flush(460+myrank)
347*59599516SKenneth E. Jansenc$$$            call flush(470+myrank)
348*59599516SKenneth E. Jansenc$$$            call flush(480+myrank)
349*59599516SKenneth E. Jansenc$$$            call flush(490+myrank)
350*59599516SKenneth E. Jansenc$$$            call flush(500+myrank)
351*59599516SKenneth E. Jansenc$$$            call flush(510+myrank)
352*59599516SKenneth E. Jansenc$$$            call flush(530+myrank)
353*59599516SKenneth E. Jansenc$$$            call flush(540+myrank)
354*59599516SKenneth E. Jansenc$$$            call flush(550+myrank)
355*59599516SKenneth E. Jansenc$$$            call flush(560+myrank)
356*59599516SKenneth E. Jansenc$$$            call flush(570+myrank)
357*59599516SKenneth E. Jansenc$$$            call flush(580+myrank)
358*59599516SKenneth E. Jansenc$$$            call flush(590+myrank)
359*59599516SKenneth E. Jansen      endif
360*59599516SKenneth E. Jansen 555  format(5(2x,e14.7))
361*59599516SKenneth E. Jansen
362*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
363*59599516SKenneth E. Jansen      tmp1 =  MINVAL(cdelsq)
364*59599516SKenneth E. Jansen      tmp2 =  MAXVAL(cdelsq)
365*59599516SKenneth E. Jansen      if(numpe>1) then
366*59599516SKenneth E. Jansen         call MPI_REDUCE (tmp1, tmp3, 1,MPI_DOUBLE_PRECISION,
367*59599516SKenneth E. Jansen     &        MPI_MIN, master, MPI_COMM_WORLD, ierr)
368*59599516SKenneth E. Jansen         call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
369*59599516SKenneth E. Jansen     &        MPI_MAX, master, MPI_COMM_WORLD, ierr)
370*59599516SKenneth E. Jansen         tmp1=tmp3
371*59599516SKenneth E. Jansen         tmp2=tmp4
372*59599516SKenneth E. Jansen      endif
373*59599516SKenneth E. Jansen      if (myrank .EQ. master) then !print CDelta^2 range
374*59599516SKenneth E. Jansen         write(34,*)lstep,tmp1,tmp2
375*59599516SKenneth E. Jansen         call flush(34)
376*59599516SKenneth E. Jansen      endif
377*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
378*59599516SKenneth E. Jansen
379*59599516SKenneth E. Jansen      if (myrank .eq. master) then
380*59599516SKenneth E. Jansen         write(*,*)'xnut=',sum(cdelsq)/nshg
381*59599516SKenneth E. Jansen         write(*,*) 'cdelsq=', cdelsq(1),cdelsq(2)
382*59599516SKenneth E. Jansen      endif
383*59599516SKenneth E. Jansen
384*59599516SKenneth E. Jansen      do iblk = 1,nelblk
385*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
386*59599516SKenneth E. Jansen         iel  = lcblk(1,iblk)
387*59599516SKenneth E. Jansen         npro = lcblk(1,iblk+1) - iel
388*59599516SKenneth E. Jansen         lelCat = lcblk(2,iblk)
389*59599516SKenneth E. Jansen         inum  = iel + npro - 1
390*59599516SKenneth E. Jansen
391*59599516SKenneth E. Jansen         ngauss = nint(lcsyst)
392*59599516SKenneth E. Jansen
393*59599516SKenneth E. Jansen         call scatnu (mien(iblk)%p, strl(iel:inum,:),
394*59599516SKenneth E. Jansen     &        mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:))
395*59599516SKenneth E. Jansen      enddo
396*59599516SKenneth E. Jansenc     $$$$$$$$$$$$$$$$$$$$$$$$$$$
397*59599516SKenneth E. Jansenc$$$  tmp1 =  MINVAL(xmudmi)
398*59599516SKenneth E. Jansenc$$$  tmp2 =  MAXVAL(xmudmi)
399*59599516SKenneth E. Jansenc$$$  if(numpe>1) then
400*59599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION,
401*59599516SKenneth E. Jansenc$$$  &                 MPI_MIN, master, MPI_COMM_WORLD, ierr)
402*59599516SKenneth E. Jansenc$$$  call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION,
403*59599516SKenneth E. Jansenc$$$  &                 MPI_MAX, master, MPI_COMM_WORLD, ierr)
404*59599516SKenneth E. Jansenc$$$      tmp1=tmp3
405*59599516SKenneth E. Jansenc$$$  tmp2=tmp4
406*59599516SKenneth E. Jansenc$$$  endif
407*59599516SKenneth E. Jansenc$$$  if (myrank .EQ. master) then
408*59599516SKenneth E. Jansenc$$$  write(35,*) lstep,tmp1,tmp2
409*59599516SKenneth E. Jansenc$$$  call flush(35)
410*59599516SKenneth E. Jansenc$$$  endif
411*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$
412*59599516SKenneth E. Jansen
413*59599516SKenneth E. Jansenc$$$c
414*59599516SKenneth E. Jansenc$$$c  if flag set, write a restart file with info (reuse xmij's memory)
415*59599516SKenneth E. Jansenc$$$c
416*59599516SKenneth E. Jansenc$$$      if(irs.eq.11) then
417*59599516SKenneth E. Jansenc$$$         lstep=999
418*59599516SKenneth E. Jansenc$$$         xmij(:,1)=xnum(:)
419*59599516SKenneth E. Jansenc$$$         xmij(:,2)=xden(:)
420*59599516SKenneth E. Jansenc$$$         xmij(:,3)=cdelsq(:)
421*59599516SKenneth E. Jansenc$$$         xmij(:,5)=xlij(:,4)    !leave M_{12} in 4 and put L_{12} here
422*59599516SKenneth E. Jansenc$$$         call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac
423*59599516SKenneth E. Jansenc$$$         stop
424*59599516SKenneth E. Jansenc$$$      endif
425*59599516SKenneth E. Jansenc$$$      if(lhs.eq.1) then
426*59599516SKenneth E. Jansenc$$$         lstepsafe=lstep
427*59599516SKenneth E. Jansenc$$$         lstep=999
428*59599516SKenneth E. Jansenc$$$
429*59599516SKenneth E. Jansenc$$$         xmij(:,1)=xnum(:)
430*59599516SKenneth E. Jansenc$$$         xmij(:,2)=xden(:)
431*59599516SKenneth E. Jansenc$$$         xmij(:,3)=cdelsq(:)
432*59599516SKenneth E. Jansenc$$$         xmij(:,4)=xmij(:,6)    !put M_{23} in 4
433*59599516SKenneth E. Jansenc$$$         xmij(:,5)=xlij(:,6)    !put L_{23} here
434*59599516SKenneth E. Jansenc$$$         call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac
435*59599516SKenneth E. Jansenc$$$         lstep=lstepsafe
436*59599516SKenneth E. Jansenc$$$      endif
437*59599516SKenneth E. Jansenc$$$c
438*59599516SKenneth E. Jansenc$$$c  local clipping moved to scatnu with the creation of mxmudmi pointers
439*59599516SKenneth E. Jansenc$$$c
440*59599516SKenneth E. Jansenc$$$c$$$      rmu=datmat(1,2,1)
441*59599516SKenneth E. Jansenc$$$c$$$      xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu
442*59599516SKenneth E. Jansenc$$$c$$$      xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0
443*59599516SKenneth E. Jansenc$$$c      stop !uncomment to test dmod
444*59599516SKenneth E. Jansenc$$$c
445*59599516SKenneth E. Jansenc$$$
446*59599516SKenneth E. Jansenc$$$
447*59599516SKenneth E. Jansenc$$$c  write out the nodal values of xnut (estimate since we don't calc strain
448*59599516SKenneth E. Jansenc$$$c  there and must use the filtered strain).
449*59599516SKenneth E. Jansenc$$$c
450*59599516SKenneth E. Jansenc$$$
451*59599516SKenneth E. Jansenc$$$      if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then
452*59599516SKenneth E. Jansenc$$$c
453*59599516SKenneth E. Jansenc$$$c  collect the average strain into xnude(2)
454*59599516SKenneth E. Jansenc$$$c
455*59599516SKenneth E. Jansenc$$$         xnude(:,2) = zero
456*59599516SKenneth E. Jansenc$$$         do i = 1,numnp
457*59599516SKenneth E. Jansenc$$$            xnude(ifath(i),2) = xnude(ifath(i),2) + strnrm(i)
458*59599516SKenneth E. Jansenc$$$         enddo
459*59599516SKenneth E. Jansenc$$$
460*59599516SKenneth E. Jansenc$$$         if(numpe .gt. 1 .and. ihomog.eq.1 )then
461*59599516SKenneth E. Jansenc$$$            call drvAllreduce(xnude(:,2), xnuder(:,2),nfath)
462*59599516SKenneth E. Jansenc$$$         else
463*59599516SKenneth E. Jansenc$$$            xnuder=xnude
464*59599516SKenneth E. Jansenc$$$         endif
465*59599516SKenneth E. Jansenc$$$c
466*59599516SKenneth E. Jansenc$$$c          nut= cdelsq    * |S|
467*59599516SKenneth E. Jansenc$$$c
468*59599516SKenneth E. Jansenc$$$         xnutf=xnuder(:,1)*xnuder(:,2)/nsons(:) ! off by one
469*59599516SKenneth E. Jansenc$$$c
470*59599516SKenneth E. Jansenc$$$c  collect the x and y coords into xnude
471*59599516SKenneth E. Jansenc$$$c
472*59599516SKenneth E. Jansenc$$$         xnude = zero
473*59599516SKenneth E. Jansenc$$$         do i = 1,numnp
474*59599516SKenneth E. Jansenc$$$            xnude(ifath(i),1) = xnude(ifath(i),1) + x(i,3)
475*59599516SKenneth E. Jansenc$$$            xnude(ifath(i),2) = xnude(ifath(i),2) + x(i,2)
476*59599516SKenneth E. Jansenc$$$         enddo
477*59599516SKenneth E. Jansenc$$$
478*59599516SKenneth E. Jansenc$$$         if(numpe .gt. 1 .and. nsons(1).ne.1 )then
479*59599516SKenneth E. Jansenc$$$            call drvAllreduce(xnude, xnuder,2*nfath)
480*59599516SKenneth E. Jansenc$$$            xnuder(:,1)=xnuder(:,1)/nsons(:)
481*59599516SKenneth E. Jansenc$$$            xnuder(:,2)=xnuder(:,2)/nsons(:)
482*59599516SKenneth E. Jansenc$$$         else
483*59599516SKenneth E. Jansenc$$$            xnuder=xnude
484*59599516SKenneth E. Jansenc$$$         endif
485*59599516SKenneth E. Jansenc$$$c
486*59599516SKenneth E. Jansenc$$$c  xnude is the sum of the sons for each father on this processor
487*59599516SKenneth E. Jansenc$$$c
488*59599516SKenneth E. Jansenc$$$         if((myrank.eq.master)) then
489*59599516SKenneth E. Jansenc$$$            do i=1,nfath      ! cdelsq   * |S|
490*59599516SKenneth E. Jansenc$$$               write(444,*) xnuder(i,1),xnuder(i,2),xnutf(i)
491*59599516SKenneth E. Jansenc$$$            enddo
492*59599516SKenneth E. Jansenc$$$            call flush(444)
493*59599516SKenneth E. Jansenc$$$         endif
494*59599516SKenneth E. Jansenc$$$      endif
495*59599516SKenneth E. Jansen
496*59599516SKenneth E. Jansen      return
497*59599516SKenneth E. Jansen      end
498