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