1*59599516SKenneth E. Jansen 2*59599516SKenneth E. Jansenc--------------------------------------------------------------------------- 3*59599516SKenneth E. Jansen 4*59599516SKenneth E. Jansen subroutine SUPGstress (y, ac, x, qres, ien, xmudmi, 5*59599516SKenneth E. Jansen & cdelsq, shgl, shp, Qwtf, shglo, shpo, stress, diss, vol) 6*59599516SKenneth E. Jansen 7*59599516SKenneth E. Jansen use stats 8*59599516SKenneth E. Jansen use rlssave ! Use the resolved Leonard stresses at the nodes. 9*59599516SKenneth E. Jansen 10*59599516SKenneth E. Jansen include "common.h" 11*59599516SKenneth E. Jansen 12*59599516SKenneth E. Jansen dimension y(nshg,5), ac(nshg,5), 13*59599516SKenneth E. Jansen & x(numnp,nsd), ien(npro,nshl), 14*59599516SKenneth E. Jansen & shp(nshl,ngauss), shpfun(npro,nshl), 15*59599516SKenneth E. Jansen & shgl(nsd,nshl,ngauss), shg(npro,nshl,nsd), 16*59599516SKenneth E. Jansen & shglo(nsd,nshl,ngauss), shpo(nshl,ngauss), 17*59599516SKenneth E. Jansen & Qwtf(ngaussf), acl(npro,nshl,ndof), 18*59599516SKenneth E. Jansen & yl(npro,nshl,ndof), xl(npro,nenl,nsd) 19*59599516SKenneth E. Jansen dimension stress(nshg,9), stressl(npro,9), 20*59599516SKenneth E. Jansen & stressli(npro,9), 21*59599516SKenneth E. Jansen & dxdxi(npro,nsd,nsd), dxidx(npro,nsd,nsd), 22*59599516SKenneth E. Jansen & WdetJ(npro), rho(npro), 23*59599516SKenneth E. Jansen & tmp(npro), aci(npro,nsd), 24*59599516SKenneth E. Jansen & pres(npro), u1(npro), 25*59599516SKenneth E. Jansen & u2(npro), u3(npro) 26*59599516SKenneth E. Jansen dimension qres(nshg,nsd*nsd), ql(npro,nshl,nsd*nsd), 27*59599516SKenneth E. Jansen & g1yi(npro,ndof), g2yi(npro,ndof), 28*59599516SKenneth E. Jansen & g3yi(npro,ndof), divqi(npro,3), 29*59599516SKenneth E. Jansen & src(npro,nsd), Temp(npro), 30*59599516SKenneth E. Jansen & xx(npro,nsd), 31*59599516SKenneth E. Jansen & rlsl(npro,nshl,6), rlsli(npro,6), 32*59599516SKenneth E. Jansen & rLui(npro,3), 33*59599516SKenneth E. Jansen & tauC(npro), tauM(npro), 34*59599516SKenneth E. Jansen & tauBar(npro), uBar(npro,nsd) 35*59599516SKenneth E. Jansen dimension Sij(npro,6), Snorm(npro), 36*59599516SKenneth E. Jansen & Snorm2(npro), cdelsq(nshg), 37*59599516SKenneth E. Jansen & xmudmi(npro,ngauss), xmudmif(npro,ngauss), 38*59599516SKenneth E. Jansen & dissi(npro,3), dissl(npro,3), 39*59599516SKenneth E. Jansen & voli(npro), voll(npro), 40*59599516SKenneth E. Jansen & vol(nshg), diss(nshg,3), 41*59599516SKenneth E. Jansen & rmu(npro) 42*59599516SKenneth E. Jansen 43*59599516SKenneth E. Jansen real*8 omega(3), divu(npro) 44*59599516SKenneth E. Jansen 45*59599516SKenneth E. Jansenc.... Note that the xmudmi passed in here is 46*59599516SKenneth E. Jansenc.... evaluated at quadrature points of the flow. xmudmif will 47*59599516SKenneth E. Jansenc... be evaluated at the ngaussf quad. pts. 48*59599516SKenneth E. Jansen 49*59599516SKenneth E. Jansen xmudmif = zero 50*59599516SKenneth E. Jansen 51*59599516SKenneth E. Jansenc.... Debuggin 52*59599516SKenneth E. Jansen 53*59599516SKenneth E. Jansenc xmudmi = zero 54*59599516SKenneth E. Jansen 55*59599516SKenneth E. Jansenc.... Localization 56*59599516SKenneth E. Jansen 57*59599516SKenneth E. Jansen call localy(y, yl, ien, ndofl, 'gather ') 58*59599516SKenneth E. Jansen call localy(ac, acl, ien, ndofl, 'gather ') 59*59599516SKenneth E. Jansen call localx(x, xl, ien, nsd, 'gather ') 60*59599516SKenneth E. Jansen 61*59599516SKenneth E. Jansen if (idiff==1 .or. idiff==3) then ! global reconstruction of qdiff 62*59599516SKenneth E. Jansen call local (qres, ql, ien, nsd*nsd, 'gather ') 63*59599516SKenneth E. Jansen endif 64*59599516SKenneth E. Jansen 65*59599516SKenneth E. Jansen if ( idiff==2 .and. ires .eq. 1 ) then 66*59599516SKenneth E. Jansen call e3ql (yl, shpo, shglo, 67*59599516SKenneth E. Jansen & xl, ql, xmudmi, 68*59599516SKenneth E. Jansen & sgn) 69*59599516SKenneth E. Jansen endif 70*59599516SKenneth E. Jansen 71*59599516SKenneth E. Jansen if( (iLES.gt.10).and.(iLES.lt.20)) then ! bardina 72*59599516SKenneth E. Jansen call local (rls, rlsl, ien, 6, 'gather ') 73*59599516SKenneth E. Jansen else 74*59599516SKenneth E. Jansen rlsl = zero 75*59599516SKenneth E. Jansen endif 76*59599516SKenneth E. Jansen 77*59599516SKenneth E. Jansenc... Now that everything is localized, begin loop over ngaussf quad. pts. 78*59599516SKenneth E. Jansen 79*59599516SKenneth E. Jansen 80*59599516SKenneth E. Jansen stressl = zero 81*59599516SKenneth E. Jansen dissl = zero 82*59599516SKenneth E. Jansen voll = zero 83*59599516SKenneth E. Jansen 84*59599516SKenneth E. Jansen do intp = 1, ngaussf 85*59599516SKenneth E. Jansen 86*59599516SKenneth E. Jansenc 87*59599516SKenneth E. Jansenc.... -------------> Primitive variables at int. point <-------------- 88*59599516SKenneth E. Jansenc 89*59599516SKenneth E. Jansen pres = zero 90*59599516SKenneth E. Jansen u1 = zero 91*59599516SKenneth E. Jansen u2 = zero 92*59599516SKenneth E. Jansen u3 = zero 93*59599516SKenneth E. Jansenc 94*59599516SKenneth E. Jansen do n = 1, nshl 95*59599516SKenneth E. Jansen pres(:) = pres(:) + shp(n,intp) * yl(:,n,1) 96*59599516SKenneth E. Jansen u1(:) = u1(:) + shp(n,intp) * yl(:,n,2) 97*59599516SKenneth E. Jansen u2(:) = u2(:) + shp(n,intp) * yl(:,n,3) 98*59599516SKenneth E. Jansen u3(:) = u3(:) + shp(n,intp) * yl(:,n,4) 99*59599516SKenneth E. Jansen enddo 100*59599516SKenneth E. Jansen 101*59599516SKenneth E. Jansenc 102*59599516SKenneth E. Jansenc.... -----------------------> accel. at int. point <---------------------- 103*59599516SKenneth E. Jansenc 104*59599516SKenneth E. Jansen aci = zero 105*59599516SKenneth E. Jansen do n = 1, nshl 106*59599516SKenneth E. Jansen aci(:,1) = aci(:,1) + shp(n,intp) * acl(:,n,2) 107*59599516SKenneth E. Jansen aci(:,2) = aci(:,2) + shp(n,intp) * acl(:,n,3) 108*59599516SKenneth E. Jansen aci(:,3) = aci(:,3) + shp(n,intp) * acl(:,n,4) 109*59599516SKenneth E. Jansen enddo 110*59599516SKenneth E. Jansen 111*59599516SKenneth E. Jansen 112*59599516SKenneth E. Jansenc 113*59599516SKenneth E. Jansenc.... ---------------> Element Metrics at int. point <------------- 114*59599516SKenneth E. Jansenc 115*59599516SKenneth E. Jansenc.... compute the deformation gradient 116*59599516SKenneth E. Jansenc 117*59599516SKenneth E. Jansen dxdxi = zero 118*59599516SKenneth E. Jansenc 119*59599516SKenneth E. Jansen do n = 1, nenl 120*59599516SKenneth E. Jansen dxdxi(:,1,1) = dxdxi(:,1,1) + xl(:,n,1) * shgl(1,n,intp) 121*59599516SKenneth E. Jansen dxdxi(:,1,2) = dxdxi(:,1,2) + xl(:,n,1) * shgl(2,n,intp) 122*59599516SKenneth E. Jansen dxdxi(:,1,3) = dxdxi(:,1,3) + xl(:,n,1) * shgl(3,n,intp) 123*59599516SKenneth E. Jansen dxdxi(:,2,1) = dxdxi(:,2,1) + xl(:,n,2) * shgl(1,n,intp) 124*59599516SKenneth E. Jansen dxdxi(:,2,2) = dxdxi(:,2,2) + xl(:,n,2) * shgl(2,n,intp) 125*59599516SKenneth E. Jansen dxdxi(:,2,3) = dxdxi(:,2,3) + xl(:,n,2) * shgl(3,n,intp) 126*59599516SKenneth E. Jansen dxdxi(:,3,1) = dxdxi(:,3,1) + xl(:,n,3) * shgl(1,n,intp) 127*59599516SKenneth E. Jansen dxdxi(:,3,2) = dxdxi(:,3,2) + xl(:,n,3) * shgl(2,n,intp) 128*59599516SKenneth E. Jansen dxdxi(:,3,3) = dxdxi(:,3,3) + xl(:,n,3) * shgl(3,n,intp) 129*59599516SKenneth E. Jansen enddo 130*59599516SKenneth E. Jansenc 131*59599516SKenneth E. Jansenc.... compute the inverse of deformation gradient 132*59599516SKenneth E. Jansenc 133*59599516SKenneth E. Jansen dxidx(:,1,1) = dxdxi(:,2,2) * dxdxi(:,3,3) 134*59599516SKenneth E. Jansen & - dxdxi(:,3,2) * dxdxi(:,2,3) 135*59599516SKenneth E. Jansen dxidx(:,1,2) = dxdxi(:,3,2) * dxdxi(:,1,3) 136*59599516SKenneth E. Jansen & - dxdxi(:,1,2) * dxdxi(:,3,3) 137*59599516SKenneth E. Jansen dxidx(:,1,3) = dxdxi(:,1,2) * dxdxi(:,2,3) 138*59599516SKenneth E. Jansen & - dxdxi(:,1,3) * dxdxi(:,2,2) 139*59599516SKenneth E. Jansen tmp = one / ( dxidx(:,1,1) * dxdxi(:,1,1) 140*59599516SKenneth E. Jansen & + dxidx(:,1,2) * dxdxi(:,2,1) 141*59599516SKenneth E. Jansen & + dxidx(:,1,3) * dxdxi(:,3,1) ) 142*59599516SKenneth E. Jansen dxidx(:,1,1) = dxidx(:,1,1) * tmp 143*59599516SKenneth E. Jansen dxidx(:,1,2) = dxidx(:,1,2) * tmp 144*59599516SKenneth E. Jansen dxidx(:,1,3) = dxidx(:,1,3) * tmp 145*59599516SKenneth E. Jansen dxidx(:,2,1) = (dxdxi(:,2,3) * dxdxi(:,3,1) 146*59599516SKenneth E. Jansen & - dxdxi(:,2,1) * dxdxi(:,3,3)) * tmp 147*59599516SKenneth E. Jansen dxidx(:,2,2) = (dxdxi(:,1,1) * dxdxi(:,3,3) 148*59599516SKenneth E. Jansen & - dxdxi(:,3,1) * dxdxi(:,1,3)) * tmp 149*59599516SKenneth E. Jansen dxidx(:,2,3) = (dxdxi(:,2,1) * dxdxi(:,1,3) 150*59599516SKenneth E. Jansen & - dxdxi(:,1,1) * dxdxi(:,2,3)) * tmp 151*59599516SKenneth E. Jansen dxidx(:,3,1) = (dxdxi(:,2,1) * dxdxi(:,3,2) 152*59599516SKenneth E. Jansen & - dxdxi(:,2,2) * dxdxi(:,3,1)) * tmp 153*59599516SKenneth E. Jansen dxidx(:,3,2) = (dxdxi(:,3,1) * dxdxi(:,1,2) 154*59599516SKenneth E. Jansen & - dxdxi(:,1,1) * dxdxi(:,3,2)) * tmp 155*59599516SKenneth E. Jansen dxidx(:,3,3) = (dxdxi(:,1,1) * dxdxi(:,2,2) 156*59599516SKenneth E. Jansen & - dxdxi(:,1,2) * dxdxi(:,2,1)) * tmp 157*59599516SKenneth E. Jansenc 158*59599516SKenneth E. Jansen 159*59599516SKenneth E. Jansen wght=Qwtf(intp) 160*59599516SKenneth E. Jansen WdetJ = wght / tmp 161*59599516SKenneth E. Jansen 162*59599516SKenneth E. Jansenc Obtain the global gradient of the shape functions at current qpt. 163*59599516SKenneth E. Jansen 164*59599516SKenneth E. Jansen do n = 1,nshl 165*59599516SKenneth E. Jansen shg(:,n,1) = (shgl(1,n,intp) * dxidx(:,1,1) 166*59599516SKenneth E. Jansen & + shgl(2,n,intp) * dxidx(:,2,1) 167*59599516SKenneth E. Jansen & + shgl(3,n,intp) * dxidx(:,3,1)) 168*59599516SKenneth E. Jansen shg(:,n,2) = (shgl(1,n,intp) * dxidx(:,1,2) 169*59599516SKenneth E. Jansen & + shgl(2,n,intp) * dxidx(:,2,2) 170*59599516SKenneth E. Jansen & + shgl(3,n,intp) * dxidx(:,3,2)) 171*59599516SKenneth E. Jansen shg(:,n,3) = (shgl(1,n,intp) * dxidx(:,1,3) 172*59599516SKenneth E. Jansen & + shgl(2,n,intp) * dxidx(:,2,3) 173*59599516SKenneth E. Jansen & + shgl(3,n,intp) * dxidx(:,3,3)) 174*59599516SKenneth E. Jansen enddo 175*59599516SKenneth E. Jansen 176*59599516SKenneth E. Jansenc 177*59599516SKenneth E. Jansenc.... compute the global gradient of u and P 178*59599516SKenneth E. Jansenc 179*59599516SKenneth E. Jansenc 180*59599516SKenneth E. Jansen g1yi = zero 181*59599516SKenneth E. Jansen g2yi = zero 182*59599516SKenneth E. Jansen g3yi = zero 183*59599516SKenneth E. Jansen do n = 1, nshl 184*59599516SKenneth E. Jansen g1yi(:,1) = g1yi(:,1) + shg(:,n,1) * yl(:,n,1) 185*59599516SKenneth E. Jansen g1yi(:,2) = g1yi(:,2) + shg(:,n,1) * yl(:,n,2) 186*59599516SKenneth E. Jansen g1yi(:,3) = g1yi(:,3) + shg(:,n,1) * yl(:,n,3) 187*59599516SKenneth E. Jansen g1yi(:,4) = g1yi(:,4) + shg(:,n,1) * yl(:,n,4) 188*59599516SKenneth E. Jansenc 189*59599516SKenneth E. Jansen g2yi(:,1) = g2yi(:,1) + shg(:,n,2) * yl(:,n,1) 190*59599516SKenneth E. Jansen g2yi(:,2) = g2yi(:,2) + shg(:,n,2) * yl(:,n,2) 191*59599516SKenneth E. Jansen g2yi(:,3) = g2yi(:,3) + shg(:,n,2) * yl(:,n,3) 192*59599516SKenneth E. Jansen g2yi(:,4) = g2yi(:,4) + shg(:,n,2) * yl(:,n,4) 193*59599516SKenneth E. Jansenc 194*59599516SKenneth E. Jansen g3yi(:,1) = g3yi(:,1) + shg(:,n,3) * yl(:,n,1) 195*59599516SKenneth E. Jansen g3yi(:,2) = g3yi(:,2) + shg(:,n,3) * yl(:,n,2) 196*59599516SKenneth E. Jansen g3yi(:,3) = g3yi(:,3) + shg(:,n,3) * yl(:,n,3) 197*59599516SKenneth E. Jansen g3yi(:,4) = g3yi(:,4) + shg(:,n,3) * yl(:,n,4) 198*59599516SKenneth E. Jansen enddo 199*59599516SKenneth E. Jansen 200*59599516SKenneth E. Jansenc.... Let us build the Sij tensor and its norms 201*59599516SKenneth E. Jansen 202*59599516SKenneth E. Jansen Sij(:,1) = g1yi(:,2) 203*59599516SKenneth E. Jansen Sij(:,2) = g2yi(:,3) 204*59599516SKenneth E. Jansen Sij(:,3) = g3yi(:,4) 205*59599516SKenneth E. Jansen Sij(:,4) = (g2yi(:,2)+g1yi(:,3))*pt5 206*59599516SKenneth E. Jansen Sij(:,5) = (g3yi(:,2)+g1yi(:,4))*pt5 207*59599516SKenneth E. Jansen Sij(:,6) = (g3yi(:,3)+g2yi(:,4))*pt5 208*59599516SKenneth E. Jansen 209*59599516SKenneth E. Jansen Snorm(:) = Sij(:,1)**2 + Sij(:,2)**2 + Sij(:,3)**2 210*59599516SKenneth E. Jansen & + two*(Sij(:,4)**2 + Sij(:,5)**2 + Sij(:,6)**2) 211*59599516SKenneth E. Jansen 212*59599516SKenneth E. Jansen Snorm2(:) = sqrt( two*(Sij(:,1)**2 + Sij(:,2)**2 + Sij(:,3)**2) 213*59599516SKenneth E. Jansen & + four*(Sij(:,4)**2 + Sij(:,5)**2 + Sij(:,6)**2) ) 214*59599516SKenneth E. Jansen 215*59599516SKenneth E. Jansenc... Let us build xmudmif at current quad pt. a la scatnu.f 216*59599516SKenneth E. Jansen 217*59599516SKenneth E. Jansen do n = 1,nshl 218*59599516SKenneth E. Jansen xmudmif(:,intp) = xmudmif(:,intp) + 219*59599516SKenneth E. Jansen & cdelsq(ien(:,n)) * Snorm2(:)*shp(n,intp) 220*59599516SKenneth E. Jansen enddo 221*59599516SKenneth E. Jansen 222*59599516SKenneth E. Jansen rmu=datmat(1,2,1) 223*59599516SKenneth E. Jansen xmudmif(:,intp)=min(xmudmif(:,intp),1000.0*rmu(:)) ! 224*59599516SKenneth E. Jansenc don't let it get larger than 1000 mu 225*59599516SKenneth E. Jansen xmudmif(:,intp)=max(xmudmif(:,intp), zero) ! don't let (xmudmi) < 0 226*59599516SKenneth E. Jansen 227*59599516SKenneth E. Jansenc.... Debugging 228*59599516SKenneth E. Jansen 229*59599516SKenneth E. Jansenc xmudmif(:,intp) = rmu(:) 230*59599516SKenneth E. Jansen 231*59599516SKenneth E. Jansen 232*59599516SKenneth E. Jansenc 233*59599516SKenneth E. Jansenc.... get necessary fluid properties (including the updated viscosity) 234*59599516SKenneth E. Jansenc 235*59599516SKenneth E. Jansen do i = 1, npro 236*59599516SKenneth E. Jansen do n = 1, nshl 237*59599516SKenneth E. Jansen shpfun(i,n) = shp(n,intp) 238*59599516SKenneth E. Jansen enddo 239*59599516SKenneth E. Jansen enddo 240*59599516SKenneth E. Jansen 241*59599516SKenneth E. Jansen call getdiff(yl, shpfun, xmudmif,xl, rmu, rho) 242*59599516SKenneth E. Jansen 243*59599516SKenneth E. Jansen 244*59599516SKenneth E. Jansen divqi = zero 245*59599516SKenneth E. Jansen if ( idiff >= 1 ) then 246*59599516SKenneth E. Jansenc 247*59599516SKenneth E. Jansenc.... compute divergence of diffusive flux vector, qi,i 248*59599516SKenneth E. Jansenc 249*59599516SKenneth E. Jansen do n=1, nshl 250*59599516SKenneth E. Jansen divqi(:,1) = divqi(:,1) + shg(:,n,1)*ql(:,n,1 ) 251*59599516SKenneth E. Jansen & + shg(:,n,2)*ql(:,n,4 ) 252*59599516SKenneth E. Jansen & + shg(:,n,3)*ql(:,n,7 ) 253*59599516SKenneth E. Jansen 254*59599516SKenneth E. Jansen divqi(:,2) = divqi(:,2) + shg(:,n,1)*ql(:,n,2 ) 255*59599516SKenneth E. Jansen & + shg(:,n,2)*ql(:,n,5 ) 256*59599516SKenneth E. Jansen & + shg(:,n,3)*ql(:,n,8) 257*59599516SKenneth E. Jansen 258*59599516SKenneth E. Jansen divqi(:,3) = divqi(:,3) + shg(:,n,1)*ql(:,n,3 ) 259*59599516SKenneth E. Jansen & + shg(:,n,2)*ql(:,n,6 ) 260*59599516SKenneth E. Jansen & + shg(:,n,3)*ql(:,n,9 ) 261*59599516SKenneth E. Jansen 262*59599516SKenneth E. Jansen enddo 263*59599516SKenneth E. Jansen 264*59599516SKenneth E. Jansen endif ! diffusive flux computation 265*59599516SKenneth E. Jansen 266*59599516SKenneth E. Jansenc 267*59599516SKenneth E. Jansenc.... take care of the body force term here 268*59599516SKenneth E. Jansenc 269*59599516SKenneth E. Jansen src = zero 270*59599516SKenneth E. Jansen if(matflg(5,1) .ge. 1) then 271*59599516SKenneth E. Jansenc 272*59599516SKenneth E. Jansen bfx = datmat(1,5,1) ! Boussinesq, g*alfap 273*59599516SKenneth E. Jansen bfy = datmat(2,5,1) 274*59599516SKenneth E. Jansen bfz = datmat(3,5,1) 275*59599516SKenneth E. Jansen 276*59599516SKenneth E. Jansen select case ( matflg(5,1) ) 277*59599516SKenneth E. Jansen case ( 1 ) ! standard linear body force 278*59599516SKenneth E. Jansen src(:,1) = bfx 279*59599516SKenneth E. Jansen src(:,2) = bfy 280*59599516SKenneth E. Jansen src(:,3) = bfz 281*59599516SKenneth E. Jansen case ( 2 ) ! boussinesq body force 282*59599516SKenneth E. Jansen Temp = zero 283*59599516SKenneth E. Jansen do n = 1, nshl 284*59599516SKenneth E. Jansen Temp = Temp + shp(n,intp) * yl(:,n,5) 285*59599516SKenneth E. Jansen enddo 286*59599516SKenneth E. Jansen Tref = datmat(2,2,1) 287*59599516SKenneth E. Jansen src(:,1) = bfx * (Temp(:)-Tref) 288*59599516SKenneth E. Jansen src(:,2) = bfy * (Temp(:)-Tref) 289*59599516SKenneth E. Jansen src(:,3) = bfz * (Temp(:)-Tref) 290*59599516SKenneth E. Jansen case ( 3 ) ! user specified f(x,y,z) 291*59599516SKenneth E. Jansen xx = zero 292*59599516SKenneth E. Jansen do n = 1,nenl 293*59599516SKenneth E. Jansen xx(:,1) = xx(:,1) + shp(n,intp) * xl(:,n,1) 294*59599516SKenneth E. Jansen xx(:,2) = xx(:,2) + shp(n,intp) * xl(:,n,2) 295*59599516SKenneth E. Jansen xx(:,3) = xx(:,3) + shp(n,intp) * xl(:,n,3) 296*59599516SKenneth E. Jansen enddo 297*59599516SKenneth E. Jansen 298*59599516SKenneth E. Jansen call e3source(xx, src) 299*59599516SKenneth E. Jansen end select 300*59599516SKenneth E. Jansen 301*59599516SKenneth E. Jansen endif 302*59599516SKenneth E. Jansenc 303*59599516SKenneth E. Jansenc.... -------------------> Coriolis force <----------------- 304*59599516SKenneth E. Jansenc 305*59599516SKenneth E. Jansen omag=datmat(3,5,1) ! frame rotation rate 306*59599516SKenneth E. Jansen if(omag.ne.0) then 307*59599516SKenneth E. Jansenc 308*59599516SKenneth E. Jansenc.... unit vector of axis of rotation currently selecting the i,j,k 309*59599516SKenneth E. Jansenc 310*59599516SKenneth E. Jansen e1 = one/sqrt(3.0d0) 311*59599516SKenneth E. Jansen e2 = e1 312*59599516SKenneth E. Jansen e3 = e1 313*59599516SKenneth E. Jansen 314*59599516SKenneth E. Jansen omega(1)=omag*e1 315*59599516SKenneth E. Jansen omega(2)=omag*e2 316*59599516SKenneth E. Jansen omega(3)=omag*e3 317*59599516SKenneth E. Jansen 318*59599516SKenneth E. Jansen if(matflg(5,1) .ne. 3) then ! we need to calculate the int pt. coords 319*59599516SKenneth E. Jansen xx = zero 320*59599516SKenneth E. Jansen do n = 1,nenl 321*59599516SKenneth E. Jansen xx(:,1) = xx(:,1) + shp(n,intp) * xl(:,n,1) 322*59599516SKenneth E. Jansen xx(:,2) = xx(:,2) + shp(n,intp) * xl(:,n,2) 323*59599516SKenneth E. Jansen xx(:,3) = xx(:,3) + shp(n,intp) * xl(:,n,3) 324*59599516SKenneth E. Jansen enddo 325*59599516SKenneth E. Jansen 326*59599516SKenneth E. Jansen endif 327*59599516SKenneth E. Jansenc 328*59599516SKenneth E. Jansenc note that we calculate f as if it contains the usual source 329*59599516SKenneth E. Jansenc plus the Coriolis and the centrifugal forces taken to the rhs (sign change) 330*59599516SKenneth E. Jansenc as long as we are doing SUPG with no accounting for these terms in the 331*59599516SKenneth E. Jansenc LHS this is the only change (which will find its way to the RHS momentum 332*59599516SKenneth E. Jansenc equation (both Galerkin and SUPG parts)). 333*59599516SKenneth E. Jansenc 334*59599516SKenneth E. Jansenc uncomment later if you want rotation always about z axis 335*59599516SKenneth E. Jansenc orig_src - om x om x r - two om x u 336*59599516SKenneth E. Jansenc 337*59599516SKenneth E. Jansenc$$$ src(:,1)=src(:,1)+omega(3)*omega(3)*xx(:,1)+two*omega(3)*u2 338*59599516SKenneth E. Jansenc$$$ src(:,2)=src(:,2)+omega(3)*omega(3)*xx(:,2)-two*omega(3)*u1 339*59599516SKenneth E. Jansenc 340*59599516SKenneth E. Jansenc more general for testing 341*59599516SKenneth E. Jansenc 342*59599516SKenneth E. Jansen src(:,1)=src(:,1) 343*59599516SKenneth E. Jansen & -(omega(2)*(omega(1)*xx(:,2)-omega(2)*xx(:,1)) 344*59599516SKenneth E. Jansen & -omega(3)*(omega(3)*xx(:,1)-omega(1)*xx(:,3))) 345*59599516SKenneth E. Jansen & -two*(omega(2)*u3-omega(3)*u2) 346*59599516SKenneth E. Jansen src(:,2)=src(:,2) 347*59599516SKenneth E. Jansen & -(omega(3)*(omega(2)*xx(:,3)-omega(3)*xx(:,2)) 348*59599516SKenneth E. Jansen & -omega(1)*(omega(1)*xx(:,2)-omega(2)*xx(:,1))) 349*59599516SKenneth E. Jansen & -two*(omega(3)*u1-omega(1)*u3) 350*59599516SKenneth E. Jansen src(:,3)=src(:,3) 351*59599516SKenneth E. Jansen & -(omega(1)*(omega(3)*xx(:,1)-omega(1)*xx(:,3)) 352*59599516SKenneth E. Jansen & -omega(2)*(omega(2)*xx(:,3)-omega(3)*xx(:,2))) 353*59599516SKenneth E. Jansen & -two*(omega(1)*u2-omega(2)*u1) 354*59599516SKenneth E. Jansen endif 355*59599516SKenneth E. Jansenc 356*59599516SKenneth E. Jansenc.... -------------------> momentum residual <----------------- 357*59599516SKenneth E. Jansenc 358*59599516SKenneth E. Jansen rLui(:,1) =(aci(:,1) + u1 * g1yi(:,2) 359*59599516SKenneth E. Jansen & + u2 * g2yi(:,2) 360*59599516SKenneth E. Jansen & + u3 * g3yi(:,2) - src(:,1) ) * rho 361*59599516SKenneth E. Jansen & + g1yi(:,1) 362*59599516SKenneth E. Jansen & - divqi(:,1) 363*59599516SKenneth E. Jansen rLui(:,2) =(aci(:,2) + u1 * g1yi(:,3) 364*59599516SKenneth E. Jansen & + u2 * g2yi(:,3) 365*59599516SKenneth E. Jansen & + u3 * g3yi(:,3) - src(:,2) ) * rho 366*59599516SKenneth E. Jansen & + g2yi(:,1) 367*59599516SKenneth E. Jansen & - divqi(:,2) 368*59599516SKenneth E. Jansen rLui(:,3) =(aci(:,3) + u1 * g1yi(:,4) 369*59599516SKenneth E. Jansen & + u2 * g2yi(:,4) 370*59599516SKenneth E. Jansen & + u3 * g3yi(:,4) - src(:,3) ) * rho 371*59599516SKenneth E. Jansen & + g3yi(:,1) 372*59599516SKenneth E. Jansen & - divqi(:,3) 373*59599516SKenneth E. Jansen if(iconvflow.eq.1) then 374*59599516SKenneth E. Jansen divu(:) = (g1yi(:,2) + g2yi(:,3) + g3yi(:,4))*rho 375*59599516SKenneth E. Jansen rLui(:,1)=rlui(:,1)+u1*divu 376*59599516SKenneth E. Jansen rLui(:,2)=rlui(:,2)+u2*divu 377*59599516SKenneth E. Jansen rLui(:,3)=rlui(:,3)+u3*divu 378*59599516SKenneth E. Jansen endif 379*59599516SKenneth E. Jansen 380*59599516SKenneth E. Jansenc 381*59599516SKenneth E. Jansenc.... compute the stabilization terms 382*59599516SKenneth E. Jansenc 383*59599516SKenneth E. Jansen call e3stab (rho, u1, u2, 384*59599516SKenneth E. Jansen & u3, dxidx, rLui, 385*59599516SKenneth E. Jansen & rmu, tauC, tauM, 386*59599516SKenneth E. Jansen & tauBar, uBar ) 387*59599516SKenneth E. Jansenc 388*59599516SKenneth E. Jansenc... Compute the SUPG stress at the current quad point multiplied 389*59599516SKenneth E. Jansenc... by the quadrature point weight. 390*59599516SKenneth E. Jansenc 391*59599516SKenneth E. Jansen stressli(:,1) = u1(:)*rLui(:,1) 392*59599516SKenneth E. Jansen stressli(:,2) = u1(:)*rLui(:,2) 393*59599516SKenneth E. Jansen stressli(:,3) = u1(:)*rLui(:,3) 394*59599516SKenneth E. Jansen stressli(:,4) = u2(:)*rLui(:,1) 395*59599516SKenneth E. Jansen stressli(:,5) = u2(:)*rLui(:,2) 396*59599516SKenneth E. Jansen stressli(:,6) = u2(:)*rLui(:,3) 397*59599516SKenneth E. Jansen stressli(:,7) = u3(:)*rLui(:,1) 398*59599516SKenneth E. Jansen stressli(:,8) = u3(:)*rLui(:,2) 399*59599516SKenneth E. Jansen stressli(:,9) = u3(:)*rLui(:,3) 400*59599516SKenneth E. Jansen 401*59599516SKenneth E. Jansen if (iconvflow .eq. 1) then 402*59599516SKenneth E. Jansen stressli(:,1) = stressli(:,1) + u1(:)*rLui(:,1) 403*59599516SKenneth E. Jansen stressli(:,2) = stressli(:,2) + u2(:)*rLui(:,1) 404*59599516SKenneth E. Jansen stressli(:,3) = stressli(:,3) + u3(:)*rLui(:,1) 405*59599516SKenneth E. Jansen stressli(:,4) = stressli(:,4) + u1(:)*rLui(:,2) 406*59599516SKenneth E. Jansen stressli(:,5) = stressli(:,5) + u2(:)*rLui(:,2) 407*59599516SKenneth E. Jansen stressli(:,6) = stressli(:,6) + u3(:)*rLui(:,2) 408*59599516SKenneth E. Jansen stressli(:,7) = stressli(:,7) + u1(:)*rLui(:,3) 409*59599516SKenneth E. Jansen stressli(:,8) = stressli(:,8) + u2(:)*rLui(:,3) 410*59599516SKenneth E. Jansen stressli(:,9) = stressli(:,9) + u3(:)*rLui(:,3) 411*59599516SKenneth E. Jansen endif 412*59599516SKenneth E. Jansen 413*59599516SKenneth E. Jansenc.... Debugging 414*59599516SKenneth E. Jansen 415*59599516SKenneth E. Jansenc stressli = two 416*59599516SKenneth E. Jansenc tauM = one 417*59599516SKenneth E. Jansen 418*59599516SKenneth E. Jansenc.... Multiply ui*Luj times tauM and times WdetJ 419*59599516SKenneth E. Jansen 420*59599516SKenneth E. Jansen do l = 1, 9 421*59599516SKenneth E. Jansen do k = 1, npro 422*59599516SKenneth E. Jansen stressli(k,l) = stressli(k,l)*WdetJ(k)*tauM(k) 423*59599516SKenneth E. Jansen enddo 424*59599516SKenneth E. Jansen enddo 425*59599516SKenneth E. Jansen 426*59599516SKenneth E. Jansenc.... Obtain the SUPG energy dissipation (tau_{ij} S_{ij}) at the 427*59599516SKenneth E. Jansenc.... current qpt. 428*59599516SKenneth E. Jansen 429*59599516SKenneth E. Jansen dissi(:,1) = stressli(:,1)*Sij(:,1) + stressli(:,5)*Sij(:,2) 430*59599516SKenneth E. Jansen & + stressli(:,9)*Sij(:,3) + stressli(:,4)*Sij(:,4) 431*59599516SKenneth E. Jansen & + stressli(:,7)*Sij(:,5) + stressli(:,8)*Sij(:,6) 432*59599516SKenneth E. Jansen & + stressli(:,2)*Sij(:,4) + stressli(:,3)*Sij(:,5) 433*59599516SKenneth E. Jansen & + stressli(:,6)*Sij(:,6) 434*59599516SKenneth E. Jansen 435*59599516SKenneth E. Jansenc.... Obtain the eddy viscosity dissipation multiplied by WdetJ 436*59599516SKenneth E. Jansen 437*59599516SKenneth E. Jansen dissi(:,2) = xmudmif(:,intp)*Snorm(:)*rho(:)*WdetJ(:) 438*59599516SKenneth E. Jansen dissi(:,3) = rmu(:)*Snorm(:)*rho(:)*WdetJ(:) ! Total dissipation 439*59599516SKenneth E. Jansenc from molec. and eddy 440*59599516SKenneth E. Jansen 441*59599516SKenneth E. Jansenc.... Debugging 442*59599516SKenneth E. Jansen 443*59599516SKenneth E. Jansenc dissi(:,1) = two*WdetJ(:) 444*59599516SKenneth E. Jansenc dissi(:,2) = two*WdetJ(:) 445*59599516SKenneth E. Jansenc dissi(:,3) = two*WdetJ(:) 446*59599516SKenneth E. Jansen 447*59599516SKenneth E. Jansenc..... Volume of element 448*59599516SKenneth E. Jansen 449*59599516SKenneth E. Jansen voli = WdetJ ! Volume of element patch 450*59599516SKenneth E. Jansenc 451*59599516SKenneth E. Jansenc.... For debugging purposes let us keep track of rLui 452*59599516SKenneth E. Jansen 453*59599516SKenneth E. Jansenc rLui(:,1) = rLui(:,1)*WdetJ(:) 454*59599516SKenneth E. Jansenc rLui(:,1) = rLui(:,2)*WdetJ(:) 455*59599516SKenneth E. Jansenc rLui(:,1) = rLui(:,3)*WdetJ(:) 456*59599516SKenneth E. Jansen 457*59599516SKenneth E. Jansenc.... Acumulate integration point contributions for each each element 458*59599516SKenneth E. Jansen 459*59599516SKenneth E. Jansen do l = 1, 9 460*59599516SKenneth E. Jansen stressl(:,l) = stressl(:,l) + stressli(:,l) 461*59599516SKenneth E. Jansen enddo 462*59599516SKenneth E. Jansen 463*59599516SKenneth E. Jansen do l = 1, 3 464*59599516SKenneth E. Jansen dissl(:,l) = dissl(:,l) + dissi(:,l) 465*59599516SKenneth E. Jansen enddo 466*59599516SKenneth E. Jansen 467*59599516SKenneth E. Jansen voll = voll + voli 468*59599516SKenneth E. Jansen 469*59599516SKenneth E. Jansen enddo ! End loop over quadrature points. 470*59599516SKenneth E. Jansen 471*59599516SKenneth E. Jansen do j = 1,nshl 472*59599516SKenneth E. Jansen do nel = 1,npro 473*59599516SKenneth E. Jansen stress(ien(nel,j),:) = stress(ien(nel,j),:) + stressl(nel,:) 474*59599516SKenneth E. Jansen enddo 475*59599516SKenneth E. Jansen enddo 476*59599516SKenneth E. Jansen 477*59599516SKenneth E. Jansen do j = 1,nshl 478*59599516SKenneth E. Jansen do nel = 1,npro 479*59599516SKenneth E. Jansen diss(ien(nel,j),:) = diss(ien(nel,j),:) + dissl(nel,:) 480*59599516SKenneth E. Jansen enddo 481*59599516SKenneth E. Jansen enddo 482*59599516SKenneth E. Jansen 483*59599516SKenneth E. Jansen do j = 1,nshl 484*59599516SKenneth E. Jansen do nel = 1,npro 485*59599516SKenneth E. Jansen vol(ien(nel,j)) = vol(ien(nel,j)) + voll(nel) 486*59599516SKenneth E. Jansen enddo 487*59599516SKenneth E. Jansen enddo 488*59599516SKenneth E. Jansen 489*59599516SKenneth E. Jansen return 490*59599516SKenneth E. Jansen end 491*59599516SKenneth E. Jansen subroutine cpjdmcnoi (y, shgl, shp, 492*59599516SKenneth E. Jansen & iper, ilwork, x, 493*59599516SKenneth E. Jansen & rowp, colm, 494*59599516SKenneth E. Jansen & iBC, BC) 495*59599516SKenneth E. Jansen 496*59599516SKenneth E. Jansen use pointer_data 497*59599516SKenneth E. Jansen 498*59599516SKenneth E. Jansen use lhsGkeep ! This module stores the mass (Gram) matrix. 499*59599516SKenneth E. Jansen 500*59599516SKenneth E. Jansen use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf), 501*59599516SKenneth E. Jansenc shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf). 502*59599516SKenneth E. Jansenc Shpf and shglf are the shape funciotns and their 503*59599516SKenneth E. Jansenc gradient evaluated using the quadrature rule desired 504*59599516SKenneth E. Jansenc for computing the dmod. Qwt contains the weights of the 505*59599516SKenneth E. Jansenc quad. points. 506*59599516SKenneth E. Jansen 507*59599516SKenneth E. Jansen include "common.h" 508*59599516SKenneth E. Jansen include "mpif.h" 509*59599516SKenneth E. Jansen include "auxmpi.h" 510*59599516SKenneth E. Jansen 511*59599516SKenneth E. Jansenc 512*59599516SKenneth E. Jansen dimension fres(nshg,24), fwr(nshg), 513*59599516SKenneth E. Jansen & strnrm(nshg), cdelsq(nshg), 514*59599516SKenneth E. Jansen & xnum(nshg), xden(nshg), 515*59599516SKenneth E. Jansen & xmij(nshg,6), xlij(nshg,6), 516*59599516SKenneth E. Jansen & xnude(nfath,2), xnuder(nfath,2), 517*59599516SKenneth E. Jansen & strl(numel,ngauss), 518*59599516SKenneth E. Jansen & y(nshg,5), yold(nshg,5), 519*59599516SKenneth E. Jansen & iper(nshg), 520*59599516SKenneth E. Jansen & ilwork(nlwork), 521*59599516SKenneth E. Jansen & x(numnp,3), 522*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT), 523*59599516SKenneth E. Jansen & pfres(nshg,22), ifath(nshg), 524*59599516SKenneth E. Jansen & nsons(nshg), iBC(nshg), 525*59599516SKenneth E. Jansen & BC(nshg,ndofBC), xnutf(nfath), 526*59599516SKenneth E. Jansen & xnut(nshg) 527*59599516SKenneth E. Jansen 528*59599516SKenneth E. Jansen integer rowp(nshg*nnz), colm(nshg+1) 529*59599516SKenneth E. Jansen 530*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: em 531*59599516SKenneth E. Jansen 532*59599516SKenneth E. Jansen 533*59599516SKenneth E. Jansen denom=max(1.0d0*(lstep),one) 534*59599516SKenneth E. Jansen if(dtavei.lt.0) then 535*59599516SKenneth E. Jansen wcur=one/denom 536*59599516SKenneth E. Jansen else 537*59599516SKenneth E. Jansen wcur=dtavei 538*59599516SKenneth E. Jansen endif 539*59599516SKenneth E. Jansen whist=1.0-wcur 540*59599516SKenneth E. Jansen 541*59599516SKenneth E. Jansen if (istep .eq. 0) then 542*59599516SKenneth E. Jansen lhsG = zero 543*59599516SKenneth E. Jansen endif 544*59599516SKenneth E. Jansen 545*59599516SKenneth E. Jansen fres = zero 546*59599516SKenneth E. Jansen yold(:,1)=y(:,4) 547*59599516SKenneth E. Jansen yold(:,2:4)=y(:,1:3) 548*59599516SKenneth E. Jansenc 549*59599516SKenneth E. Jansenc hack in an interesting velocity field (uncomment to test dmod) 550*59599516SKenneth E. Jansenc 551*59599516SKenneth E. Jansenc do i = 1, nshg ! No periodicity for testing 552*59599516SKenneth E. Jansenc iper(i) = i 553*59599516SKenneth E. Jansenc enddo 554*59599516SKenneth E. Jansenc yold(:,5) = 1.0 555*59599516SKenneth E. Jansenc yold(:,2) = 3.0d0 556*59599516SKenneth E. Jansenc yold(:,2) = 2.0*x(:,1) - 3*x(:,2) 557*59599516SKenneth E. Jansenc yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2) 558*59599516SKenneth E. Jansenc yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3) 559*59599516SKenneth E. Jansenc yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable 560*59599516SKenneth E. Jansenc suitable for the 561*59599516SKenneth E. Jansen 562*59599516SKenneth E. Jansen 563*59599516SKenneth E. Jansen intrul=intg(1,itseq) 564*59599516SKenneth E. Jansen intind=intpt(intrul) 565*59599516SKenneth E. Jansen 566*59599516SKenneth E. Jansen do iblk = 1,nelblk 567*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 568*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 569*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 570*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 571*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 572*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 573*59599516SKenneth E. Jansen inum = iel + npro - 1 574*59599516SKenneth E. Jansen 575*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 576*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 577*59599516SKenneth E. Jansen 578*59599516SKenneth E. Jansen call hfilterBB (yold, x, mien(iblk)%p, fres, 579*59599516SKenneth E. Jansen & shglf(lcsyst,:,1:nshl,:), 580*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 581*59599516SKenneth E. Jansen 582*59599516SKenneth E. Jansen 583*59599516SKenneth E. Jansen if ( istep.eq.0 ) then 584*59599516SKenneth E. Jansen 585*59599516SKenneth E. Jansen allocate ( em(npro,nshl,nshl) ) 586*59599516SKenneth E. Jansen 587*59599516SKenneth E. Jansen call getgram2 (x, mien(iblk)%p, 588*59599516SKenneth E. Jansen & shgl(lcsyst,:,1:nshl,:), shp(lcsyst,1:nshl,:), 589*59599516SKenneth E. Jansen & shglf(lcsyst,:,1:nshl,:), shpf(lcsyst,1:nshl,:), em, 590*59599516SKenneth E. Jansen & Qwtf(lcsyst,1:ngaussf)) 591*59599516SKenneth E. Jansen 592*59599516SKenneth E. Jansen call fillsparseSclr (mien(iblk)%p, 593*59599516SKenneth E. Jansen & em, lhsG, 594*59599516SKenneth E. Jansen & rowp, colm) 595*59599516SKenneth E. Jansen 596*59599516SKenneth E. Jansen 597*59599516SKenneth E. Jansen deallocate ( em ) 598*59599516SKenneth E. Jansen 599*59599516SKenneth E. Jansen endif 600*59599516SKenneth E. Jansen 601*59599516SKenneth E. Jansen enddo ! End loop over element blocks 602*59599516SKenneth E. Jansenc 603*59599516SKenneth E. Jansen 604*59599516SKenneth E. Jansenc write(*,*)'Im here' 605*59599516SKenneth E. Jansen 606*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 24, 'in ') 607*59599516SKenneth E. Jansenc 608*59599516SKenneth E. Jansenc account for periodicity in filtered variables 609*59599516SKenneth E. Jansenc 610*59599516SKenneth E. Jansen do j = 1,nshg 611*59599516SKenneth E. Jansen i = iper(j) 612*59599516SKenneth E. Jansen if (i .ne. j) then 613*59599516SKenneth E. Jansen fres(i,:) = fres(i,:) + fres(j,:) 614*59599516SKenneth E. Jansen endif 615*59599516SKenneth E. Jansen enddo 616*59599516SKenneth E. Jansen 617*59599516SKenneth E. Jansen do j = 1,nshg 618*59599516SKenneth E. Jansen i = iper(j) 619*59599516SKenneth E. Jansen if (i .ne. j) then 620*59599516SKenneth E. Jansen fres(j,:) = zero 621*59599516SKenneth E. Jansen endif 622*59599516SKenneth E. Jansen enddo 623*59599516SKenneth E. Jansen 624*59599516SKenneth E. Jansenc Need to zero off-processor slaves as well. 625*59599516SKenneth E. Jansen 626*59599516SKenneth E. Jansen if (numpe.gt.1) then 627*59599516SKenneth E. Jansen 628*59599516SKenneth E. Jansen numtask = ilwork(1) 629*59599516SKenneth E. Jansen itkbeg = 1 630*59599516SKenneth E. Jansen 631*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 632*59599516SKenneth E. Jansen 633*59599516SKenneth E. Jansen do itask = 1, numtask 634*59599516SKenneth E. Jansen 635*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 636*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 637*59599516SKenneth E. Jansen 638*59599516SKenneth E. Jansen if (iacc .eq. 0) then 639*59599516SKenneth E. Jansen do is = 1,numseg 640*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 641*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 642*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 643*59599516SKenneth E. Jansen fres(isgbeg:isgend,:) = zero 644*59599516SKenneth E. Jansen enddo 645*59599516SKenneth E. Jansen endif 646*59599516SKenneth E. Jansen 647*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 648*59599516SKenneth E. Jansen 649*59599516SKenneth E. Jansen enddo 650*59599516SKenneth E. Jansen 651*59599516SKenneth E. Jansen endif 652*59599516SKenneth E. Jansen 653*59599516SKenneth E. Jansenc... At this point fres has the right hand side vector (b) and lhsG has 654*59599516SKenneth E. Jansenc... the Gram matrix (M_{AB}) (in sparse storage). Now we need to solve 655*59599516SKenneth E. Jansenc... Ax = b using the conjugate gradient method to finish off the 656*59599516SKenneth E. Jansenc... L2-projection. 657*59599516SKenneth E. Jansen 658*59599516SKenneth E. Jansen 659*59599516SKenneth E. Jansen do i = 1, 21 660*59599516SKenneth E. Jansen call sparseCG (fres(:,i), pfres(:,i), lhsG, 661*59599516SKenneth E. Jansen & rowp, colm, iper, ilwork, 662*59599516SKenneth E. Jansen & iBC, BC) 663*59599516SKenneth E. Jansen enddo 664*59599516SKenneth E. Jansen 665*59599516SKenneth E. Jansen 666*59599516SKenneth E. Jansen write(*,*)'Done with least-squares projection' 667*59599516SKenneth E. Jansen 668*59599516SKenneth E. Jansen do i = 1, 21 669*59599516SKenneth E. Jansen fres(:,i) = pfres(:,i) 670*59599516SKenneth E. Jansen enddo 671*59599516SKenneth E. Jansen 672*59599516SKenneth E. Jansen fres(:,22) = one 673*59599516SKenneth E. Jansen 674*59599516SKenneth E. Jansen do iblk = 1,nelblk 675*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 676*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 677*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 678*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 679*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 680*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 681*59599516SKenneth E. Jansen inum = iel + npro - 1 682*59599516SKenneth E. Jansen 683*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 684*59599516SKenneth E. Jansen 685*59599516SKenneth E. Jansen call getstrl (yold, x, mien(iblk)%p, 686*59599516SKenneth E. Jansen & strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:), 687*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:)) 688*59599516SKenneth E. Jansen 689*59599516SKenneth E. Jansen enddo 690*59599516SKenneth E. Jansen 691*59599516SKenneth E. Jansen 692*59599516SKenneth E. Jansen strnrm = sqrt( 693*59599516SKenneth E. Jansen & two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2) 694*59599516SKenneth E. Jansen & + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) ) 695*59599516SKenneth E. Jansen 696*59599516SKenneth E. Jansen fwr = fwr1 * fres(:,22) * strnrm 697*59599516SKenneth E. Jansen 698*59599516SKenneth E. Jansen xmij(:,1) = -fwr 699*59599516SKenneth E. Jansen & * fres(:,10) + fres(:,16) 700*59599516SKenneth E. Jansen xmij(:,2) = -fwr 701*59599516SKenneth E. Jansen & * fres(:,11) + fres(:,17) 702*59599516SKenneth E. Jansen xmij(:,3) = -fwr 703*59599516SKenneth E. Jansen & * fres(:,12) + fres(:,18) 704*59599516SKenneth E. Jansen 705*59599516SKenneth E. Jansen xmij(:,4) = -fwr * fres(:,13) + fres(:,19) 706*59599516SKenneth E. Jansen xmij(:,5) = -fwr * fres(:,14) + fres(:,20) 707*59599516SKenneth E. Jansen xmij(:,6) = -fwr * fres(:,15) + fres(:,21) 708*59599516SKenneth E. Jansen 709*59599516SKenneth E. Jansen fres(:,22) = one / fres(:,22) 710*59599516SKenneth E. Jansen 711*59599516SKenneth E. Jansen xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1) * fres(:,22) 712*59599516SKenneth E. Jansen xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2) * fres(:,22) 713*59599516SKenneth E. Jansen xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3) * fres(:,22) 714*59599516SKenneth E. Jansen xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2) * fres(:,22) 715*59599516SKenneth E. Jansen xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3) * fres(:,22) 716*59599516SKenneth E. Jansen xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3) * fres(:,22) 717*59599516SKenneth E. Jansen 718*59599516SKenneth E. Jansen xnum = xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2) 719*59599516SKenneth E. Jansen & + xlij(:,3) * xmij(:,3) 720*59599516SKenneth E. Jansen & + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5) 721*59599516SKenneth E. Jansen & + xlij(:,6) * xmij(:,6)) 722*59599516SKenneth E. Jansen xden = xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2) 723*59599516SKenneth E. Jansen & + xmij(:,3) * xmij(:,3) 724*59599516SKenneth E. Jansen & + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5) 725*59599516SKenneth E. Jansen & + xmij(:,6) * xmij(:,6)) 726*59599516SKenneth E. Jansen xden = two * xden 727*59599516SKenneth E. Jansen 728*59599516SKenneth E. Jansenc 729*59599516SKenneth E. Jansenc don't account for periodic nodes twice 730*59599516SKenneth E. Jansenc 731*59599516SKenneth E. Jansen do j = 1,numnp 732*59599516SKenneth E. Jansen i = iper(j) 733*59599516SKenneth E. Jansen if (i .ne. j) then 734*59599516SKenneth E. Jansen xden(j) = zero 735*59599516SKenneth E. Jansen xnum(j) = zero 736*59599516SKenneth E. Jansen endif 737*59599516SKenneth E. Jansen enddo 738*59599516SKenneth E. Jansen 739*59599516SKenneth E. Jansen if(numpe.gt.1) then 740*59599516SKenneth E. Jansenc 741*59599516SKenneth E. Jansenc.... nodes treated on another processor are eliminated 742*59599516SKenneth E. Jansenc 743*59599516SKenneth E. Jansen numtask = ilwork(1) 744*59599516SKenneth E. Jansen itkbeg = 1 745*59599516SKenneth E. Jansen 746*59599516SKenneth E. Jansen do itask = 1, numtask 747*59599516SKenneth E. Jansen 748*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 749*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 750*59599516SKenneth E. Jansen 751*59599516SKenneth E. Jansen if (iacc .eq. 0) then 752*59599516SKenneth E. Jansen do is = 1,numseg 753*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 754*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 755*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 756*59599516SKenneth E. Jansen xnum(isgbeg:isgend) = zero 757*59599516SKenneth E. Jansen xden(isgbeg:isgend) = zero 758*59599516SKenneth E. Jansen enddo 759*59599516SKenneth E. Jansen endif 760*59599516SKenneth E. Jansen 761*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 762*59599516SKenneth E. Jansen 763*59599516SKenneth E. Jansen enddo 764*59599516SKenneth E. Jansen 765*59599516SKenneth E. Jansenc if (myrank.eq.0)then 766*59599516SKenneth E. Jansenc do i = 1, numnp 767*59599516SKenneth E. Jansenc write(253,*)xnum(i),xden(i),myrank 768*59599516SKenneth E. Jansenc enddo 769*59599516SKenneth E. Jansenc endif 770*59599516SKenneth E. Jansenc if (myrank.eq.1)then 771*59599516SKenneth E. Jansenc do i = 1, numnp 772*59599516SKenneth E. Jansenc write(254,*)xnum(i),xden(i),myrank 773*59599516SKenneth E. Jansenc enddo 774*59599516SKenneth E. Jansenc endif 775*59599516SKenneth E. Jansen 776*59599516SKenneth E. Jansenc xnuml = sum(xnum) 777*59599516SKenneth E. Jansenc xdenl = sum(xden) 778*59599516SKenneth E. Jansen 779*59599516SKenneth E. Jansen xnuml = zero 780*59599516SKenneth E. Jansen xdenl = zero 781*59599516SKenneth E. Jansen do i = 1, numnp 782*59599516SKenneth E. Jansen xnuml = xnuml + xnum(i) 783*59599516SKenneth E. Jansen xdenl = xdenl + xden(i) 784*59599516SKenneth E. Jansen enddo 785*59599516SKenneth E. Jansen 786*59599516SKenneth E. Jansenc write(*,*)xnuml,xdenl,myrank 787*59599516SKenneth E. Jansen 788*59599516SKenneth E. Jansen call drvAllreducesclr ( xnuml, xnumt ) 789*59599516SKenneth E. Jansen call drvAllreducesclr ( xdenl, xdent ) 790*59599516SKenneth E. Jansencd 791*59599516SKenneth E. Jansen else 792*59599516SKenneth E. Jansen 793*59599516SKenneth E. Jansenc xnumt = sum(xnum) 794*59599516SKenneth E. Jansenc xdent = sum(xden) 795*59599516SKenneth E. Jansen xnumt = zero 796*59599516SKenneth E. Jansen xdent = zero 797*59599516SKenneth E. Jansen do i = 1, numnp 798*59599516SKenneth E. Jansen xnumt = xnumt + xnum(i) 799*59599516SKenneth E. Jansen xdent = xdent + xden(i) 800*59599516SKenneth E. Jansen enddo 801*59599516SKenneth E. Jansen 802*59599516SKenneth E. Jansen 803*59599516SKenneth E. Jansen endif 804*59599516SKenneth E. Jansen 805*59599516SKenneth E. Jansen scalar = xnumt / (xdent + 1.d-09) 806*59599516SKenneth E. Jansen xnut = scalar 807*59599516SKenneth E. Jansen 808*59599516SKenneth E. Jansen 809*59599516SKenneth E. Jansen if (myrank .eq. 0)then 810*59599516SKenneth E. Jansen write(*,*) 'xnut=', xnut(100) 811*59599516SKenneth E. Jansen endif 812*59599516SKenneth E. Jansenc do i = 1, numnp 813*59599516SKenneth E. Jansenc write(*,*)xnumt/xdent,myrank 814*59599516SKenneth E. Jansenc enddo 815*59599516SKenneth E. Jansenc 816*59599516SKenneth E. Jansen do iblk = 1,nelblk 817*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 818*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 819*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 820*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 821*59599516SKenneth E. Jansen inum = iel + npro - 1 822*59599516SKenneth E. Jansen 823*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 824*59599516SKenneth E. Jansen 825*59599516SKenneth E. Jansen call scatnu (mien(iblk)%p, strl(iel:inum,:), 826*59599516SKenneth E. Jansen & mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:)) 827*59599516SKenneth E. Jansen enddo 828*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 829*59599516SKenneth E. Jansenc$$$ tmp1 = MINVAL(xmudmi) 830*59599516SKenneth E. Jansenc$$$ tmp2 = MAXVAL(xmudmi) 831*59599516SKenneth E. Jansenc$$$ if(numpe>1) then 832*59599516SKenneth E. Jansenc$$$ call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION, 833*59599516SKenneth E. Jansenc$$$ & MPI_MIN, master, MPI_COMM_WORLD, ierr) 834*59599516SKenneth E. Jansenc$$$ call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION, 835*59599516SKenneth E. Jansenc$$$ & MPI_MAX, master, MPI_COMM_WORLD, ierr) 836*59599516SKenneth E. Jansenc$$$ tmp1=tmp3 837*59599516SKenneth E. Jansenc$$$ tmp2=tmp4 838*59599516SKenneth E. Jansenc$$$ endif 839*59599516SKenneth E. Jansenc$$$ if (myrank .EQ. master) then 840*59599516SKenneth E. Jansenc$$$ write(35,*) lstep,tmp1,tmp2 841*59599516SKenneth E. Jansenc$$$ call flush(35) 842*59599516SKenneth E. Jansenc$$$ endif 843*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 844*59599516SKenneth E. Jansen 845*59599516SKenneth E. Jansenc 846*59599516SKenneth E. Jansenc if flag set, write a restart file with info (reuse xmij's memory) 847*59599516SKenneth E. Jansenc 848*59599516SKenneth E. Jansen if(irs.eq.11) then 849*59599516SKenneth E. Jansen lstep=999 850*59599516SKenneth E. Jansen xmij(:,1)=xnum(:) 851*59599516SKenneth E. Jansen xmij(:,2)=xden(:) 852*59599516SKenneth E. Jansen xmij(:,3)=cdelsq(:) 853*59599516SKenneth E. Jansen xmij(:,5)=xlij(:,4) !leave M_{12} in 4 and put L_{12} here 854*59599516SKenneth E. Jansen call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac 855*59599516SKenneth E. Jansen stop 856*59599516SKenneth E. Jansen endif 857*59599516SKenneth E. Jansenc 858*59599516SKenneth E. Jansenc local clipping moved to scatnu with the creation of mxmudmi pointers 859*59599516SKenneth E. Jansenc 860*59599516SKenneth E. Jansenc$$$ rmu=datmat(1,2,1) 861*59599516SKenneth E. Jansenc$$$ xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu 862*59599516SKenneth E. Jansenc$$$ xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0 863*59599516SKenneth E. Jansenc stop !uncomment to test dmod 864*59599516SKenneth E. Jansenc 865*59599516SKenneth E. Jansen 866*59599516SKenneth E. Jansen 867*59599516SKenneth E. Jansenc write out the nodal values of xnut (estimate since we don't calc strain 868*59599516SKenneth E. Jansenc there and must use the filtered strain). 869*59599516SKenneth E. Jansenc 870*59599516SKenneth E. Jansen 871*59599516SKenneth E. Jansen 872*59599516SKenneth E. Jansen 873*59599516SKenneth E. Jansen return 874*59599516SKenneth E. Jansen end 875*59599516SKenneth E. Jansen 876*59599516SKenneth E. Jansenc----------------------------------------------------- 877*59599516SKenneth E. Jansen 878*59599516SKenneth E. Jansen subroutine getgram (x, ien, shgl, shp, em, Qwtf) 879*59599516SKenneth E. Jansen 880*59599516SKenneth E. Jansen include "common.h" 881*59599516SKenneth E. Jansen 882*59599516SKenneth E. Jansen dimension x(numnp,nsd), xl(npro,nenl,nsd) 883*59599516SKenneth E. Jansen dimension ien(npro,nshl), 884*59599516SKenneth E. Jansen & shgl(nsd,nshl,ngauss), shp(nshl,ngauss), 885*59599516SKenneth E. Jansen & em(npro,nshl,nshl), Qwtf(ngaussf) 886*59599516SKenneth E. Jansen 887*59599516SKenneth E. Jansen call localx(x, xl, ien, nsd, 'gather ') 888*59599516SKenneth E. Jansen 889*59599516SKenneth E. Jansen call cmass(shp,shgl,xl,em) 890*59599516SKenneth E. Jansen 891*59599516SKenneth E. Jansen 892*59599516SKenneth E. Jansen return 893*59599516SKenneth E. Jansen 894*59599516SKenneth E. Jansen end 895*59599516SKenneth E. Jansen 896*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 897*59599516SKenneth E. Jansen 898*59599516SKenneth E. Jansen 899*59599516SKenneth E. Jansen subroutine getgram2 (x, ien, shgl, shp, shglf, shpf, em, Qwtf) 900*59599516SKenneth E. Jansen 901*59599516SKenneth E. Jansen include "common.h" 902*59599516SKenneth E. Jansen 903*59599516SKenneth E. Jansen dimension x(numnp,nsd), xl(npro,nenl,nsd) 904*59599516SKenneth E. Jansen dimension ien(npro,nshl), 905*59599516SKenneth E. Jansen & shgl(nsd,nshl,ngauss), shp(nshl,ngauss), 906*59599516SKenneth E. Jansen & shglf(nsd,nshl,ngauss), shpf(nshl,ngauss), 907*59599516SKenneth E. Jansen & em(npro,nshl,nshl), Qwtf(ngaussf) 908*59599516SKenneth E. Jansen 909*59599516SKenneth E. Jansen 910*59599516SKenneth E. Jansen call localx(x, xl, ien, nsd, 'gather ') 911*59599516SKenneth E. Jansen 912*59599516SKenneth E. Jansen call cmassl(shp,shgl,shpf,shglf,xl,em,Qwtf) 913*59599516SKenneth E. Jansen 914*59599516SKenneth E. Jansen 915*59599516SKenneth E. Jansen return 916*59599516SKenneth E. Jansen 917*59599516SKenneth E. Jansen end 918*59599516SKenneth E. Jansen 919*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 920*59599516SKenneth E. Jansen 921*59599516SKenneth E. Jansen subroutine getgram3 (x, ien, shgl, shp, shglf, shpf, em, Qwtf) 922*59599516SKenneth E. Jansen 923*59599516SKenneth E. Jansen include "common.h" 924*59599516SKenneth E. Jansen 925*59599516SKenneth E. Jansen dimension x(numnp,nsd), xl(npro,nenl,nsd) 926*59599516SKenneth E. Jansen dimension ien(npro,nshl), 927*59599516SKenneth E. Jansen & shgl(nsd,nshl,ngauss), shp(nshl,ngauss), 928*59599516SKenneth E. Jansen & shglf(nsd,nshl,ngauss), shpf(nshl,ngauss), 929*59599516SKenneth E. Jansen & em(npro,nshl,nshl), Qwtf(ngaussf) 930*59599516SKenneth E. Jansen 931*59599516SKenneth E. Jansen 932*59599516SKenneth E. Jansen call localx(x, xl, ien, nsd, 'gather ') 933*59599516SKenneth E. Jansen 934*59599516SKenneth E. Jansen call cmasstl(shp,shgl,shpf,shglf,xl,em,Qwtf) 935*59599516SKenneth E. Jansen 936*59599516SKenneth E. Jansen 937*59599516SKenneth E. Jansen return 938*59599516SKenneth E. Jansen 939*59599516SKenneth E. Jansen end 940*59599516SKenneth E. Jansen subroutine cdelBHsq (y, shgl, shp, 941*59599516SKenneth E. Jansen & iper, ilwork, 942*59599516SKenneth E. Jansen & nsons, ifath, x, cdelsq1) 943*59599516SKenneth E. Jansen 944*59599516SKenneth E. Jansen use pointer_data 945*59599516SKenneth E. Jansen 946*59599516SKenneth E. Jansen use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf), 947*59599516SKenneth E. Jansenc shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf). 948*59599516SKenneth E. Jansenc Shpf and shglf are the shape funciotns and their 949*59599516SKenneth E. Jansenc gradient evaluated using the quadrature rule desired 950*59599516SKenneth E. Jansenc for computing the dmod. Qwtf contains the weights of the 951*59599516SKenneth E. Jansenc quad. points. 952*59599516SKenneth E. Jansen 953*59599516SKenneth E. Jansen include "common.h" 954*59599516SKenneth E. Jansen include "mpif.h" 955*59599516SKenneth E. Jansen include "auxmpi.h" 956*59599516SKenneth E. Jansen 957*59599516SKenneth E. Jansenc 958*59599516SKenneth E. Jansen dimension fres(nshg,33), fwr(nshg), 959*59599516SKenneth E. Jansen & strnrm(nshg), cdelsq1(nfath), 960*59599516SKenneth E. Jansen & xnum(nshg), xden(nshg), 961*59599516SKenneth E. Jansen & xmij(nshg,6), xlij(nshg,6), 962*59599516SKenneth E. Jansen & xnude(nfath,2), xnuder(nfath,2), 963*59599516SKenneth E. Jansen & nsons(nshg), 964*59599516SKenneth E. Jansen & strl(numel,ngauss), 965*59599516SKenneth E. Jansen & y(nshg,5), yold(nshg,5), 966*59599516SKenneth E. Jansen & ifath(nshg), iper(nshg), 967*59599516SKenneth E. Jansen & ilwork(nlwork), 968*59599516SKenneth E. Jansen & x(numnp,3), 969*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT), 970*59599516SKenneth E. Jansen & xnutf(nfath), 971*59599516SKenneth E. Jansen & hfres(nshg,16) 972*59599516SKenneth E. Jansen 973*59599516SKenneth E. Jansenc 974*59599516SKenneth E. Jansen 975*59599516SKenneth E. Jansen fres = zero 976*59599516SKenneth E. Jansen hfres = zero 977*59599516SKenneth E. Jansen 978*59599516SKenneth E. Jansen yold(:,1)=y(:,4) 979*59599516SKenneth E. Jansen yold(:,2:4)=y(:,1:3) 980*59599516SKenneth E. Jansen 981*59599516SKenneth E. Jansenc 982*59599516SKenneth E. Jansenc hack in an interesting velocity field (uncomment to test dmod) 983*59599516SKenneth E. Jansenc 984*59599516SKenneth E. Jansenc yold(:,5) = 1.0 ! Debugging 985*59599516SKenneth E. Jansenc yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2) 986*59599516SKenneth E. Jansenc yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2) 987*59599516SKenneth E. Jansenc yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3) 988*59599516SKenneth E. Jansenc yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable 989*59599516SKenneth E. Jansenc suitable for the 990*59599516SKenneth E. Jansen 991*59599516SKenneth E. Jansen do iblk = 1,nelblk 992*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 993*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 994*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 995*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 996*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 997*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 998*59599516SKenneth E. Jansen inum = iel + npro - 1 999*59599516SKenneth E. Jansen 1000*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1001*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 1002*59599516SKenneth E. Jansen 1003*59599516SKenneth E. Jansenc call hfilterB (yold, x, mien(iblk)%p, hfres, 1004*59599516SKenneth E. Jansenc & shglf(lcsyst,:,1:nshl,:), 1005*59599516SKenneth E. Jansenc & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 1006*59599516SKenneth E. Jansen 1007*59599516SKenneth E. Jansen call hfilterC (yold, x, mien(iblk)%p, hfres, 1008*59599516SKenneth E. Jansen & shglf(lcsyst,:,1:nshl,:), 1009*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 1010*59599516SKenneth E. Jansen 1011*59599516SKenneth E. Jansen enddo 1012*59599516SKenneth E. Jansen 1013*59599516SKenneth E. Jansen if(numpe>1) call commu (hfres, ilwork, 16, 'in ') 1014*59599516SKenneth E. Jansenc 1015*59599516SKenneth E. Jansenc... account for periodicity in filtered variables 1016*59599516SKenneth E. Jansenc 1017*59599516SKenneth E. Jansen do j = 1,nshg ! Add on-processor slave contribution to masters 1018*59599516SKenneth E. Jansen i = iper(j) 1019*59599516SKenneth E. Jansen if (i .ne. j) then 1020*59599516SKenneth E. Jansen hfres(i,:) = hfres(i,:) + hfres(j,:) 1021*59599516SKenneth E. Jansen endif 1022*59599516SKenneth E. Jansen enddo 1023*59599516SKenneth E. Jansen do j = 1,nshg ! Set on-processor slaves to be the same as masters 1024*59599516SKenneth E. Jansen i = iper(j) 1025*59599516SKenneth E. Jansen if (i .ne. j) then 1026*59599516SKenneth E. Jansen hfres(j,:) = hfres(i,:) 1027*59599516SKenneth E. Jansen endif 1028*59599516SKenneth E. Jansen enddo 1029*59599516SKenneth E. Jansen 1030*59599516SKenneth E. Jansenc... Set off-processor slaves to be the same as their masters 1031*59599516SKenneth E. Jansen 1032*59599516SKenneth E. Jansen if(numpe>1) call commu (hfres, ilwork, 16, 'out') 1033*59599516SKenneth E. Jansen 1034*59599516SKenneth E. Jansen 1035*59599516SKenneth E. Jansen hfres(:,16) = one / hfres(:,16) ! one/(volume of hat filter kernel) 1036*59599516SKenneth E. Jansen 1037*59599516SKenneth E. Jansen do j = 1, 15 1038*59599516SKenneth E. Jansen hfres(:,j) = hfres(:,j) * hfres(:,16) 1039*59599516SKenneth E. Jansen enddo 1040*59599516SKenneth E. Jansen 1041*59599516SKenneth E. Jansenc... For debugging 1042*59599516SKenneth E. Jansen 1043*59599516SKenneth E. Jansenc hfres(:,1) = 2.0*x(:,1) - 3.0*x(:,2) 1044*59599516SKenneth E. Jansenc hfres(:,2) = 3.0*x(:,1) + 4.0*x(:,2) 1045*59599516SKenneth E. Jansenc hfres(:,3) = 4.0*x(:,1) + x(:,2) + x(:,3) 1046*59599516SKenneth E. Jansen 1047*59599516SKenneth E. Jansenc... Done w/ h-filtering. Begin 2h-filtering. 1048*59599516SKenneth E. Jansen 1049*59599516SKenneth E. Jansen do iblk = 1,nelblk 1050*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1051*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 1052*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1053*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1054*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 1055*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 1056*59599516SKenneth E. Jansen inum = iel + npro - 1 1057*59599516SKenneth E. Jansen 1058*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1059*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 1060*59599516SKenneth E. Jansen 1061*59599516SKenneth E. Jansen call twohfilterB (yold, x, strl(iel:inum,:), mien(iblk)%p, 1062*59599516SKenneth E. Jansen & fres, hfres, shgl(lcsyst,:,1:nshl,:), 1063*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 1064*59599516SKenneth E. Jansen 1065*59599516SKenneth E. Jansen enddo 1066*59599516SKenneth E. Jansenc 1067*59599516SKenneth E. Jansen 1068*59599516SKenneth E. Jansen 1069*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 33, 'in ') 1070*59599516SKenneth E. Jansenc 1071*59599516SKenneth E. Jansenc account for periodicity in filtered variables 1072*59599516SKenneth E. Jansenc 1073*59599516SKenneth E. Jansen do j = 1,nshg 1074*59599516SKenneth E. Jansen i = iper(j) 1075*59599516SKenneth E. Jansen if (i .ne. j) then 1076*59599516SKenneth E. Jansen fres(i,:) = fres(i,:) + fres(j,:) 1077*59599516SKenneth E. Jansen endif 1078*59599516SKenneth E. Jansen enddo 1079*59599516SKenneth E. Jansen 1080*59599516SKenneth E. Jansen do j = 1,nshg 1081*59599516SKenneth E. Jansen i = iper(j) 1082*59599516SKenneth E. Jansen if (i .ne. j) then 1083*59599516SKenneth E. Jansen fres(j,:) = fres(i,:) 1084*59599516SKenneth E. Jansen endif 1085*59599516SKenneth E. Jansen enddo 1086*59599516SKenneth E. Jansen 1087*59599516SKenneth E. Jansen if(numpe>1)then 1088*59599516SKenneth E. Jansen call commu (fres, ilwork, 33, 'out') 1089*59599516SKenneth E. Jansen endif 1090*59599516SKenneth E. Jansen 1091*59599516SKenneth E. Jansen fres(:,22) = one / fres(:,22) 1092*59599516SKenneth E. Jansen do j = 1,21 1093*59599516SKenneth E. Jansen fres(:,j) = fres(:,j) * fres(:,22) 1094*59599516SKenneth E. Jansen enddo 1095*59599516SKenneth E. Jansen do j = 23,33 1096*59599516SKenneth E. Jansen fres(:,j) = fres(:,j) * fres(:,22) 1097*59599516SKenneth E. Jansen enddo 1098*59599516SKenneth E. Jansen 1099*59599516SKenneth E. Jansen 1100*59599516SKenneth E. Jansen do iblk = 1,nelblk 1101*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1102*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 1103*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1104*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1105*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 1106*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 1107*59599516SKenneth E. Jansen inum = iel + npro - 1 1108*59599516SKenneth E. Jansen 1109*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1110*59599516SKenneth E. Jansen 1111*59599516SKenneth E. Jansen call getstrl (yold, x, mien(iblk)%p, 1112*59599516SKenneth E. Jansen & strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:), 1113*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:)) 1114*59599516SKenneth E. Jansen 1115*59599516SKenneth E. Jansen enddo 1116*59599516SKenneth E. Jansen 1117*59599516SKenneth E. Jansenc 1118*59599516SKenneth E. Jansenc... Obtain the hat-tilde strain rate norm at the nodes 1119*59599516SKenneth E. Jansenc 1120*59599516SKenneth E. Jansen 1121*59599516SKenneth E. Jansen strnrm = sqrt( 1122*59599516SKenneth E. Jansen & two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2) 1123*59599516SKenneth E. Jansen & + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) ) 1124*59599516SKenneth E. Jansen 1125*59599516SKenneth E. Jansen fwr = fwr1 * strnrm 1126*59599516SKenneth E. Jansen 1127*59599516SKenneth E. Jansen xmij(:,1) = -fwr 1128*59599516SKenneth E. Jansen & * fres(:,10) + fres(:,16) 1129*59599516SKenneth E. Jansen xmij(:,2) = -fwr 1130*59599516SKenneth E. Jansen & * fres(:,11) + fres(:,17) 1131*59599516SKenneth E. Jansen xmij(:,3) = -fwr 1132*59599516SKenneth E. Jansen & * fres(:,12) + fres(:,18) 1133*59599516SKenneth E. Jansen 1134*59599516SKenneth E. Jansen xmij(:,4) = -fwr * fres(:,13) + fres(:,19) 1135*59599516SKenneth E. Jansen xmij(:,5) = -fwr * fres(:,14) + fres(:,20) 1136*59599516SKenneth E. Jansen xmij(:,6) = -fwr * fres(:,15) + fres(:,21) 1137*59599516SKenneth E. Jansen 1138*59599516SKenneth E. Jansen 1139*59599516SKenneth E. Jansen xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1) 1140*59599516SKenneth E. Jansen xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2) 1141*59599516SKenneth E. Jansen xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3) 1142*59599516SKenneth E. Jansen xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2) 1143*59599516SKenneth E. Jansen xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3) 1144*59599516SKenneth E. Jansen xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3) 1145*59599516SKenneth E. Jansen 1146*59599516SKenneth E. Jansen xnum = xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2) 1147*59599516SKenneth E. Jansen & + xlij(:,3) * xmij(:,3) 1148*59599516SKenneth E. Jansen & + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5) 1149*59599516SKenneth E. Jansen & + xlij(:,6) * xmij(:,6)) 1150*59599516SKenneth E. Jansen xden = xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2) 1151*59599516SKenneth E. Jansen & + xmij(:,3) * xmij(:,3) 1152*59599516SKenneth E. Jansen & + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5) 1153*59599516SKenneth E. Jansen & + xmij(:,6) * xmij(:,6)) 1154*59599516SKenneth E. Jansen xden = two * xden 1155*59599516SKenneth E. Jansen 1156*59599516SKenneth E. Jansenc zero on processor periodic nodes so that they will not be added twice 1157*59599516SKenneth E. Jansen do j = 1,numnp 1158*59599516SKenneth E. Jansen i = iper(j) 1159*59599516SKenneth E. Jansen if (i .ne. j) then 1160*59599516SKenneth E. Jansen xnum(j) = zero 1161*59599516SKenneth E. Jansen xden(j) = zero 1162*59599516SKenneth E. Jansen endif 1163*59599516SKenneth E. Jansen enddo 1164*59599516SKenneth E. Jansen 1165*59599516SKenneth E. Jansen if (numpe.gt.1) then 1166*59599516SKenneth E. Jansen 1167*59599516SKenneth E. Jansen numtask = ilwork(1) 1168*59599516SKenneth E. Jansen itkbeg = 1 1169*59599516SKenneth E. Jansen 1170*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 1171*59599516SKenneth E. Jansen do itask = 1, numtask 1172*59599516SKenneth E. Jansen 1173*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 1174*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 1175*59599516SKenneth E. Jansen 1176*59599516SKenneth E. Jansen if (iacc .eq. 0) then 1177*59599516SKenneth E. Jansen do is = 1,numseg 1178*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 1179*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 1180*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 1181*59599516SKenneth E. Jansen xnum(isgbeg:isgend) = zero 1182*59599516SKenneth E. Jansen xden(isgbeg:isgend) = zero 1183*59599516SKenneth E. Jansen enddo 1184*59599516SKenneth E. Jansen endif 1185*59599516SKenneth E. Jansen 1186*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 1187*59599516SKenneth E. Jansen 1188*59599516SKenneth E. Jansen enddo 1189*59599516SKenneth E. Jansen 1190*59599516SKenneth E. Jansen endif 1191*59599516SKenneth E. Jansenc 1192*59599516SKenneth E. Jansenc Description of arrays. Each processor has an array of length equal 1193*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect 1194*59599516SKenneth E. Jansenc the numerator and one to collect the denominator. There is also an array 1195*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each 1196*59599516SKenneth E. Jansenc on processor node, ifath(nnshg). Finally, there is an arry of length 1197*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons 1198*59599516SKenneth E. Jansenc for each father. 1199*59599516SKenneth E. Jansenc 1200*59599516SKenneth E. Jansenc Now loop over nodes and accumlate the numerator and the denominator 1201*59599516SKenneth E. Jansenc to the father nodes. Only on processor addition at this point. 1202*59599516SKenneth E. Jansenc Note that serrogate fathers are collect some for the case where some 1203*59599516SKenneth E. Jansenc sons are on another processor 1204*59599516SKenneth E. Jansenc 1205*59599516SKenneth E. Jansen xnude = zero 1206*59599516SKenneth E. Jansen do i = 1,nshg 1207*59599516SKenneth E. Jansen xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i) 1208*59599516SKenneth E. Jansen xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i) 1209*59599516SKenneth E. Jansen enddo 1210*59599516SKenneth E. Jansen 1211*59599516SKenneth E. Jansenc 1212*59599516SKenneth E. Jansenc Now the true fathers and serrogates combine results and update 1213*59599516SKenneth E. Jansenc each other. 1214*59599516SKenneth E. Jansenc 1215*59599516SKenneth E. Jansen if(numpe .gt. 1)then 1216*59599516SKenneth E. Jansen call drvAllreduce(xnude, xnuder,2*nfath) 1217*59599516SKenneth E. Jansenc 1218*59599516SKenneth E. Jansenc xnude is the sum of the sons for each father on this processor 1219*59599516SKenneth E. Jansenc 1220*59599516SKenneth E. Jansenc xnuder is the sum of the sons for each father on all processor combined 1221*59599516SKenneth E. Jansenc (the same as if we had not partitioned the mesh for each processor) 1222*59599516SKenneth E. Jansenc 1223*59599516SKenneth E. Jansenc For each father we have precomputed the number of sons (including 1224*59599516SKenneth E. Jansenc the sons off processor). 1225*59599516SKenneth E. Jansenc 1226*59599516SKenneth E. Jansenc Now divide by number of sons to get the average (not really necessary 1227*59599516SKenneth E. Jansenc for dynamic model since ratio will cancel nsons at each father) 1228*59599516SKenneth E. Jansenc 1229*59599516SKenneth E. Jansenc xnuder(:,1) = xnuder(:,1) ! / nsons(:) 1230*59599516SKenneth E. Jansenc xnuder(:,2) = xnuder(:,2) ! / nsons(:) 1231*59599516SKenneth E. Jansenc 1232*59599516SKenneth E. Jansenc the next line is c \Delta^2 1233*59599516SKenneth E. Jansenc 1234*59599516SKenneth E. Jansen xnuder(:,1) = xnuder(:,1) / (xnuder(:,2) + 1.d-09) 1235*59599516SKenneth E. Jansen do i = 1,nfath 1236*59599516SKenneth E. Jansen cdelsq1(i) = xnuder(i,1) 1237*59599516SKenneth E. Jansen enddo 1238*59599516SKenneth E. Jansen else 1239*59599516SKenneth E. Jansenc 1240*59599516SKenneth E. Jansenc the next line is c \Delta^2, not nu_T but we want to save the 1241*59599516SKenneth E. Jansenc memory 1242*59599516SKenneth E. Jansenc 1243*59599516SKenneth E. Jansen xnude(:,1) = xnude(:,1) / (xnude(:,2) + 1.d-09) 1244*59599516SKenneth E. Jansen do i = 1,nfath 1245*59599516SKenneth E. Jansen cdelsq1(i) = xnude(i,1) 1246*59599516SKenneth E. Jansen enddo 1247*59599516SKenneth E. Jansen endif 1248*59599516SKenneth E. Jansen 1249*59599516SKenneth E. Jansen if (myrank .eq. master) then 1250*59599516SKenneth E. Jansen if (numpe .gt. 1) then 1251*59599516SKenneth E. Jansen do i = 1, nfath 1252*59599516SKenneth E. Jansen write(22,*)i, xnuder(i,1) 1253*59599516SKenneth E. Jansen enddo 1254*59599516SKenneth E. Jansen else 1255*59599516SKenneth E. Jansen do i = 1, nfath 1256*59599516SKenneth E. Jansen write(22,*)i, xnude(i,1) 1257*59599516SKenneth E. Jansen enddo 1258*59599516SKenneth E. Jansen endif 1259*59599516SKenneth E. Jansen endif 1260*59599516SKenneth E. Jansen call flush(22) 1261*59599516SKenneth E. Jansen 1262*59599516SKenneth E. Jansen do i = 1, nfath 1263*59599516SKenneth E. Jansen if (cdelsq1(i) .lt. zero) then 1264*59599516SKenneth E. Jansen cdelsq1(i) = zero 1265*59599516SKenneth E. Jansen endif 1266*59599516SKenneth E. Jansen enddo 1267*59599516SKenneth E. Jansen 1268*59599516SKenneth E. Jansen return 1269*59599516SKenneth E. Jansen end 1270*59599516SKenneth E. Jansen subroutine SUPGdis (y, ac, shgl, 1271*59599516SKenneth E. Jansen & shp, iper, ilwork, 1272*59599516SKenneth E. Jansen & nsons, ifath, x, 1273*59599516SKenneth E. Jansen & iBC, BC, stabdis, xavegt) 1274*59599516SKenneth E. Jansen 1275*59599516SKenneth E. Jansen 1276*59599516SKenneth E. Jansen use stats ! 1277*59599516SKenneth E. Jansen use pointer_data ! brings in the pointers for the blocked arrays 1278*59599516SKenneth E. Jansen use local_mass 1279*59599516SKenneth E. Jansen use rlssave ! Use the resolved Leonard stresses at the nodes. 1280*59599516SKenneth E. Jansen use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf), 1281*59599516SKenneth E. Jansenc shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf). 1282*59599516SKenneth E. Jansenc Shpf and shglf are the shape funciotns and their 1283*59599516SKenneth E. Jansenc gradient evaluated using the quadrature rule desired 1284*59599516SKenneth E. Jansenc for computing the dmod. Qwt contains the weights of the 1285*59599516SKenneth E. Jansenc quad. points. 1286*59599516SKenneth E. Jansen 1287*59599516SKenneth E. Jansen 1288*59599516SKenneth E. Jansen 1289*59599516SKenneth E. Jansen include "common.h" 1290*59599516SKenneth E. Jansen include "mpif.h" 1291*59599516SKenneth E. Jansen include "auxmpi.h" 1292*59599516SKenneth E. Jansen 1293*59599516SKenneth E. Jansen 1294*59599516SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 1295*59599516SKenneth E. Jansen & yold(nshg,ndof), 1296*59599516SKenneth E. Jansen & ifath(nshg), nsons(nshg), 1297*59599516SKenneth E. Jansen & iper(nshg), ilwork(nlwork), 1298*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT), 1299*59599516SKenneth E. Jansen & x(numnp,3), 1300*59599516SKenneth E. Jansen & qres(nshg,nsd*nsd), rmass(nshg), 1301*59599516SKenneth E. Jansen & iBC(nshg), BC(nshg,ndofBC), 1302*59599516SKenneth E. Jansen & cdelsq(nshg), vol(nshg), 1303*59599516SKenneth E. Jansen & stress(nshg,9), diss(nshg,3), 1304*59599516SKenneth E. Jansen & xave(nshg,12), xaveg(nfath,12), 1305*59599516SKenneth E. Jansen & xavegr(nfath,12), stabdis(nfath), 1306*59599516SKenneth E. Jansen & dmodc(nfath), strl(numel,ngauss), 1307*59599516SKenneth E. Jansen & xavegt(nfath,12) 1308*59599516SKenneth E. Jansen 1309*59599516SKenneth E. Jansen character*5 cname 1310*59599516SKenneth E. Jansen character*30 fname 1311*59599516SKenneth E. Jansen 1312*59599516SKenneth E. Jansen yold(:,1)=y(:,4) 1313*59599516SKenneth E. Jansen yold(:,2:4)=y(:,1:3) 1314*59599516SKenneth E. Jansen 1315*59599516SKenneth E. Jansenc 1316*59599516SKenneth E. Jansenc hack in an interesting velocity field (uncomment to test dmod) 1317*59599516SKenneth E. Jansenc 1318*59599516SKenneth E. Jansenc yold(:,5) = 1.0 ! Debugging 1319*59599516SKenneth E. Jansenc yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2) 1320*59599516SKenneth E. Jansenc yold(:,2) = 2.0 1321*59599516SKenneth E. Jansenc yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2) 1322*59599516SKenneth E. Jansenc yold(:,3) = 3.0 1323*59599516SKenneth E. Jansenc yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3) 1324*59599516SKenneth E. Jansenc yold(:,4) = 4.0 1325*59599516SKenneth E. Jansenc yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable 1326*59599516SKenneth E. Jansenc suitable for the 1327*59599516SKenneth E. Jansen 1328*59599516SKenneth E. Jansenc.... First let us obtain cdelsq at each node in the domain. 1329*59599516SKenneth E. Jansenc.... We use numNden which lives in the quadfilt module. 1330*59599516SKenneth E. Jansen 1331*59599516SKenneth E. Jansen if ( (istep .eq. 0) ) then 1332*59599516SKenneth E. Jansen fname = 'dmodc.dat' // cname (myrank+1) 1333*59599516SKenneth E. Jansen open (99,file=fname,form='unformatted',status='unknown') 1334*59599516SKenneth E. Jansen read(99) dmodc 1335*59599516SKenneth E. Jansen close(99) 1336*59599516SKenneth E. Jansen cdelsq(:) = dmodc(ifath(:)) 1337*59599516SKenneth E. Jansen else 1338*59599516SKenneth E. Jansen cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09) 1339*59599516SKenneth E. Jansen endif 1340*59599516SKenneth E. Jansen 1341*59599516SKenneth E. Jansenc if (myrank .eq. master) then 1342*59599516SKenneth E. Jansenc do i = 1, nfath 1343*59599516SKenneth E. Jansenc write(*,*)'dmod=', dmodc(i) 1344*59599516SKenneth E. Jansenc enddo 1345*59599516SKenneth E. Jansenc endif 1346*59599516SKenneth E. Jansen 1347*59599516SKenneth E. Jansen if ( istep .eq. (nstep(1)-1) ) then 1348*59599516SKenneth E. Jansen dmodc(ifath(:)) = cdelsq(:) 1349*59599516SKenneth E. Jansen fname = 'dmodc.dat' // cname (myrank+1) 1350*59599516SKenneth E. Jansen open (99,file=fname,form='unformatted', status='replace') 1351*59599516SKenneth E. Jansen write(99) dmodc 1352*59599516SKenneth E. Jansen close(99) 1353*59599516SKenneth E. Jansenc if (myrank .eq. master) then 1354*59599516SKenneth E. Jansenc do i = 1, nfath 1355*59599516SKenneth E. Jansenc write(*,*)'dmod=', dmodc(i) 1356*59599516SKenneth E. Jansenc enddo 1357*59599516SKenneth E. Jansenc endif 1358*59599516SKenneth E. Jansen 1359*59599516SKenneth E. Jansen endif 1360*59599516SKenneth E. Jansen 1361*59599516SKenneth E. Jansenc if (istep .eq. 0) 1362*59599516SKenneth E. Jansen do iblk = 1,nelblk 1363*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1364*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 1365*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1366*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1367*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 1368*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 1369*59599516SKenneth E. Jansen inum = iel + npro - 1 1370*59599516SKenneth E. Jansen 1371*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1372*59599516SKenneth E. Jansen 1373*59599516SKenneth E. Jansen call getstrl (yold, x, mien(iblk)%p, 1374*59599516SKenneth E. Jansen & strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:), 1375*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:)) 1376*59599516SKenneth E. Jansen 1377*59599516SKenneth E. Jansen enddo 1378*59599516SKenneth E. Jansen 1379*59599516SKenneth E. Jansen do iblk = 1,nelblk 1380*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1381*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 1382*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1383*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1384*59599516SKenneth E. Jansen inum = iel + npro - 1 1385*59599516SKenneth E. Jansen 1386*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1387*59599516SKenneth E. Jansen 1388*59599516SKenneth E. Jansen call scatnu (mien(iblk)%p, strl(iel:inum,:), 1389*59599516SKenneth E. Jansen & mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:)) 1390*59599516SKenneth E. Jansen enddo 1391*59599516SKenneth E. Jansenc endif 1392*59599516SKenneth E. Jansen 1393*59599516SKenneth E. Jansen 1394*59599516SKenneth E. Jansen 1395*59599516SKenneth E. Jansen if (idiff==1 .or. idiff==3) then ! global reconstruction of qdiff 1396*59599516SKenneth E. Jansenc 1397*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction 1398*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass 1399*59599516SKenneth E. Jansenc 1400*59599516SKenneth E. Jansen qres = zero 1401*59599516SKenneth E. Jansen rmass = zero 1402*59599516SKenneth E. Jansen 1403*59599516SKenneth E. Jansen do iblk = 1, nelblk 1404*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 1405*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1406*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1407*59599516SKenneth E. Jansen iorder = lcblk(4,iblk) 1408*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 1409*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 1410*59599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 1411*59599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 1412*59599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 1413*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1414*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1415*59599516SKenneth E. Jansenc 1416*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres, 1417*59599516SKenneth E. Jansenc and lumped mass matrix, rmass 1418*59599516SKenneth E. Jansen 1419*59599516SKenneth E. Jansen call AsIq (y, x, 1420*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:), 1421*59599516SKenneth E. Jansen & shgl(lcsyst,:,1:nshl,:), 1422*59599516SKenneth E. Jansen & mien(iblk)%p, mxmudmi(iblk)%p, 1423*59599516SKenneth E. Jansen & qres, rmass ) 1424*59599516SKenneth E. Jansen enddo 1425*59599516SKenneth E. Jansen 1426*59599516SKenneth E. Jansenc 1427*59599516SKenneth E. Jansenc.... form the diffusive flux approximation 1428*59599516SKenneth E. Jansenc 1429*59599516SKenneth E. Jansen call qpbc( rmass, qres, iBC, BC, iper, ilwork ) 1430*59599516SKenneth E. Jansenc 1431*59599516SKenneth E. Jansen endif 1432*59599516SKenneth E. Jansen 1433*59599516SKenneth E. Jansen 1434*59599516SKenneth E. Jansenc.... form the SUPG stresses well as dissipation due to eddy viscosity, 1435*59599516SKenneth E. Jansenc... and SUPG stabilization. 1436*59599516SKenneth E. Jansen 1437*59599516SKenneth E. Jansen 1438*59599516SKenneth E. Jansen stress = zero 1439*59599516SKenneth E. Jansen vol = zero 1440*59599516SKenneth E. Jansen diss = zero 1441*59599516SKenneth E. Jansen 1442*59599516SKenneth E. Jansen do iblk = 1,nelblk 1443*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1444*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 1445*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1446*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1447*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 1448*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 1449*59599516SKenneth E. Jansen inum = iel + npro - 1 1450*59599516SKenneth E. Jansen 1451*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1452*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 1453*59599516SKenneth E. Jansen 1454*59599516SKenneth E. Jansen call SUPGstress (y, ac, x, qres, mien(iblk)%p, mxmudmi(iblk)%p, 1455*59599516SKenneth E. Jansen & cdelsq, shglf(lcsyst,:,1:nshl,:), 1456*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf), 1457*59599516SKenneth E. Jansen & shgl(lcsyst,:,1:nshl,:), shp(lcsyst,1:nshl,:), 1458*59599516SKenneth E. Jansen & stress, diss, vol) 1459*59599516SKenneth E. Jansen 1460*59599516SKenneth E. Jansen enddo 1461*59599516SKenneth E. Jansen 1462*59599516SKenneth E. Jansen if(numpe>1) call commu (stress, ilwork, 9, 'in ') 1463*59599516SKenneth E. Jansen if(numpe>1) call commu (diss, ilwork, 3, 'in ') 1464*59599516SKenneth E. Jansen if(numpe>1) call commu (vol, ilwork, 1, 'in ') 1465*59599516SKenneth E. Jansen 1466*59599516SKenneth E. Jansenc 1467*59599516SKenneth E. Jansenc account for periodicity 1468*59599516SKenneth E. Jansenc 1469*59599516SKenneth E. Jansen do j = 1,nshg 1470*59599516SKenneth E. Jansen i = iper(j) 1471*59599516SKenneth E. Jansen if (i .ne. j) then 1472*59599516SKenneth E. Jansen stress(i,:) = stress(i,:) + stress(j,:) 1473*59599516SKenneth E. Jansen diss(i,:) = diss(i,:) + diss(j,:) 1474*59599516SKenneth E. Jansen vol(i) = vol(i) + vol(j) 1475*59599516SKenneth E. Jansen endif 1476*59599516SKenneth E. Jansen enddo 1477*59599516SKenneth E. Jansen 1478*59599516SKenneth E. Jansen do j = 1,nshg 1479*59599516SKenneth E. Jansen i = iper(j) 1480*59599516SKenneth E. Jansen if (i .ne. j) then 1481*59599516SKenneth E. Jansen stress(j,:) = stress(i,:) 1482*59599516SKenneth E. Jansen diss(j,:) = diss(i,:) 1483*59599516SKenneth E. Jansen vol(j) = vol(i) 1484*59599516SKenneth E. Jansen endif 1485*59599516SKenneth E. Jansen enddo 1486*59599516SKenneth E. Jansen 1487*59599516SKenneth E. Jansen if(numpe>1) call commu (stress, ilwork, 9, 'out ') 1488*59599516SKenneth E. Jansen if(numpe>1) call commu (diss, ilwork, 3, 'out ') 1489*59599516SKenneth E. Jansen if(numpe>1) call commu (vol, ilwork, 1, 'out ') 1490*59599516SKenneth E. Jansen 1491*59599516SKenneth E. Jansen vol = one / vol 1492*59599516SKenneth E. Jansen do i = 1, 9 1493*59599516SKenneth E. Jansen stress(:,i) = stress(:,i)*vol(:) 1494*59599516SKenneth E. Jansen enddo 1495*59599516SKenneth E. Jansen do i = 1, 3 1496*59599516SKenneth E. Jansen diss(:,i) = diss(:,i)*vol(:) 1497*59599516SKenneth E. Jansen enddo 1498*59599516SKenneth E. Jansen 1499*59599516SKenneth E. Jansenc---------- > Begin averaging dissipations and SUPG stress <-------------- 1500*59599516SKenneth E. Jansen 1501*59599516SKenneth E. Jansen do i = 1, 9 1502*59599516SKenneth E. Jansen xave(:,i) = stress(:,i) 1503*59599516SKenneth E. Jansen enddo 1504*59599516SKenneth E. Jansen xave(:,10) = diss(:,1) 1505*59599516SKenneth E. Jansen xave(:,11) = diss(:,2) 1506*59599516SKenneth E. Jansen xave(:,12) = diss(:,3) 1507*59599516SKenneth E. Jansen 1508*59599516SKenneth E. Jansenc zero on processor periodic nodes so that they will not be added twice 1509*59599516SKenneth E. Jansen do j = 1,numnp 1510*59599516SKenneth E. Jansen i = iper(j) 1511*59599516SKenneth E. Jansen if (i .ne. j) then 1512*59599516SKenneth E. Jansen xave(j,:) = zero 1513*59599516SKenneth E. Jansen endif 1514*59599516SKenneth E. Jansen enddo 1515*59599516SKenneth E. Jansen 1516*59599516SKenneth E. Jansen if (numpe.gt.1) then 1517*59599516SKenneth E. Jansen 1518*59599516SKenneth E. Jansen numtask = ilwork(1) 1519*59599516SKenneth E. Jansen itkbeg = 1 1520*59599516SKenneth E. Jansen 1521*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 1522*59599516SKenneth E. Jansen do itask = 1, numtask 1523*59599516SKenneth E. Jansen 1524*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 1525*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 1526*59599516SKenneth E. Jansen 1527*59599516SKenneth E. Jansen if (iacc .eq. 0) then 1528*59599516SKenneth E. Jansen do is = 1,numseg 1529*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 1530*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 1531*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 1532*59599516SKenneth E. Jansen xave(isgbeg:isgend,:) = zero 1533*59599516SKenneth E. Jansen enddo 1534*59599516SKenneth E. Jansen endif 1535*59599516SKenneth E. Jansen 1536*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 1537*59599516SKenneth E. Jansen 1538*59599516SKenneth E. Jansen enddo 1539*59599516SKenneth E. Jansen 1540*59599516SKenneth E. Jansen endif 1541*59599516SKenneth E. Jansenc 1542*59599516SKenneth E. Jansen 1543*59599516SKenneth E. Jansen xaveg = zero 1544*59599516SKenneth E. Jansen do i = 1,nshg 1545*59599516SKenneth E. Jansen xaveg(ifath(i),:) = xaveg(ifath(i),:) + xave(i,:) 1546*59599516SKenneth E. Jansen enddo 1547*59599516SKenneth E. Jansen 1548*59599516SKenneth E. Jansen if(numpe .gt. 1)then 1549*59599516SKenneth E. Jansen call drvAllreduce(xaveg, xavegr,12*nfath) 1550*59599516SKenneth E. Jansen 1551*59599516SKenneth E. Jansen do m = 1, 12 1552*59599516SKenneth E. Jansen xavegr(:,m) = xavegr(:,m)/nsons(:) 1553*59599516SKenneth E. Jansen enddo 1554*59599516SKenneth E. Jansen 1555*59599516SKenneth E. Jansenc if (myrank .eq. master) then 1556*59599516SKenneth E. Jansenc write(*,*)'diss=', xavegt(14,11), xavegr(14,11) 1557*59599516SKenneth E. Jansenc endif 1558*59599516SKenneth E. Jansen 1559*59599516SKenneth E. Jansen do m = 1, 12 1560*59599516SKenneth E. Jansen xavegt(:,m) = xavegt(:,m) + xavegr(:,m) 1561*59599516SKenneth E. Jansen enddo 1562*59599516SKenneth E. Jansen 1563*59599516SKenneth E. Jansen stabdis(:) = xavegr(:,10) 1564*59599516SKenneth E. Jansen 1565*59599516SKenneth E. Jansen else 1566*59599516SKenneth E. Jansen 1567*59599516SKenneth E. Jansen do m = 1, 12 1568*59599516SKenneth E. Jansen xaveg(:,m) = xaveg(:,m)/nsons(:) 1569*59599516SKenneth E. Jansen enddo 1570*59599516SKenneth E. Jansen 1571*59599516SKenneth E. Jansen do m = 1, 12 1572*59599516SKenneth E. Jansen xavegt(:,m) = xavegt(:,m) + xaveg(:,m) 1573*59599516SKenneth E. Jansen enddo 1574*59599516SKenneth E. Jansen 1575*59599516SKenneth E. Jansen stabdis(:) = xaveg(:,10) 1576*59599516SKenneth E. Jansen 1577*59599516SKenneth E. Jansen endif 1578*59599516SKenneth E. Jansen 1579*59599516SKenneth E. Jansenc if (myrank .eq. master) then 1580*59599516SKenneth E. Jansenc write(*,*)'diss=', xavegt(14,11), xavegr(14,11) 1581*59599516SKenneth E. Jansenc endif 1582*59599516SKenneth E. Jansen 1583*59599516SKenneth E. Jansen if ( istep .eq. (nstep(1)-1) ) then 1584*59599516SKenneth E. Jansen if ( myrank .eq. master) then 1585*59599516SKenneth E. Jansen 1586*59599516SKenneth E. Jansen do i = 1, nfath 1587*59599516SKenneth E. Jansenc write(376,*)xavegt(i,1),xavegt(i,2),xavegt(i,3) 1588*59599516SKenneth E. Jansenc write(377,*)xavegt(i,4),xavegt(i,5),xavegt(i,6) 1589*59599516SKenneth E. Jansenc write(378,*)xavegt(i,7),xavegt(i,8),xavegt(i,9) 1590*59599516SKenneth E. Jansen write(380,*)xavegt(i,10),xavegt(i,11),xavegt(i,12) 1591*59599516SKenneth E. Jansen enddo 1592*59599516SKenneth E. Jansen 1593*59599516SKenneth E. Jansenc call flush(376) 1594*59599516SKenneth E. Jansenc call flush(377) 1595*59599516SKenneth E. Jansenc call flush(378) 1596*59599516SKenneth E. Jansen call flush(380) 1597*59599516SKenneth E. Jansen 1598*59599516SKenneth E. Jansen endif 1599*59599516SKenneth E. Jansen endif 1600*59599516SKenneth E. Jansen 1601*59599516SKenneth E. Jansen 1602*59599516SKenneth E. Jansen return 1603*59599516SKenneth E. Jansen 1604*59599516SKenneth E. Jansen end 1605*59599516SKenneth E. Jansen subroutine dmcSUPG(y, ac, shgl, 1606*59599516SKenneth E. Jansen & shp, iper, ilwork, 1607*59599516SKenneth E. Jansen & nsons, ifath, x, 1608*59599516SKenneth E. Jansen & iBC, BC, rowp, colm, 1609*59599516SKenneth E. Jansen & xavegt, stabdis) 1610*59599516SKenneth E. Jansen 1611*59599516SKenneth E. Jansen use lhsGkeep ! This module stores the mass (Gram) matrix. 1612*59599516SKenneth E. Jansen use stats ! 1613*59599516SKenneth E. Jansen use pointer_data ! brings in the pointers for the blocked arrays 1614*59599516SKenneth E. Jansen use local_mass 1615*59599516SKenneth E. Jansen use rlssave ! Use the resolved Leonard stresses at the nodes. 1616*59599516SKenneth E. Jansen use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf), 1617*59599516SKenneth E. Jansenc shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf). 1618*59599516SKenneth E. Jansenc Shpf and shglf are the shape funciotns and their 1619*59599516SKenneth E. Jansenc gradient evaluated using the quadrature rule desired 1620*59599516SKenneth E. Jansenc for computing the dmod. Qwt contains the weights of the 1621*59599516SKenneth E. Jansenc quad. points. 1622*59599516SKenneth E. Jansen 1623*59599516SKenneth E. Jansen 1624*59599516SKenneth E. Jansen 1625*59599516SKenneth E. Jansen include "common.h" 1626*59599516SKenneth E. Jansen include "mpif.h" 1627*59599516SKenneth E. Jansen include "auxmpi.h" 1628*59599516SKenneth E. Jansen 1629*59599516SKenneth E. Jansen 1630*59599516SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 1631*59599516SKenneth E. Jansen & ifath(nshg), nsons(nshg), 1632*59599516SKenneth E. Jansen & iper(nshg), ilwork(nlwork), 1633*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT), 1634*59599516SKenneth E. Jansen & x(numnp,3), 1635*59599516SKenneth E. Jansen & qres(nshg,nsd*nsd), rmass(nshg), 1636*59599516SKenneth E. Jansen & iBC(nshg), BC(nshg,ndofBC), 1637*59599516SKenneth E. Jansen & cdelsq(nshg), vol(nshg), 1638*59599516SKenneth E. Jansen & stress(nshg,9), diss(nshg,3), 1639*59599516SKenneth E. Jansen & xave(nshg,12), xaveg(nfath,12), 1640*59599516SKenneth E. Jansen & xavegr(nfath,12), stabdis(nfath), 1641*59599516SKenneth E. Jansen & yold(nshg,ndof), xavegt(nfath,12), 1642*59599516SKenneth E. Jansen & fres(nshg,24), pfres(nshg,24), 1643*59599516SKenneth E. Jansen & cdel(nfath), xnume(nfath), 1644*59599516SKenneth E. Jansen & xdeno(nfath), strl(numel,ngauss), 1645*59599516SKenneth E. Jansen & rden(nshg), rnum(nshg) 1646*59599516SKenneth E. Jansen 1647*59599516SKenneth E. Jansen 1648*59599516SKenneth E. Jansen integer rowp(nshg*nnz), colm(nshg+1) 1649*59599516SKenneth E. Jansen 1650*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:,:) :: em 1651*59599516SKenneth E. Jansen 1652*59599516SKenneth E. Jansen real*8, allocatable, dimension(:,:) :: fakexmu 1653*59599516SKenneth E. Jansen 1654*59599516SKenneth E. Jansen 1655*59599516SKenneth E. Jansen yold(:,1)=y(:,4) 1656*59599516SKenneth E. Jansen yold(:,2:4)=y(:,1:3) 1657*59599516SKenneth E. Jansen fres = zero 1658*59599516SKenneth E. Jansen 1659*59599516SKenneth E. Jansenc 1660*59599516SKenneth E. Jansenc hack in an interesting velocity field (uncomment to test dmod) 1661*59599516SKenneth E. Jansenc 1662*59599516SKenneth E. Jansenc yold(:,5) = 1.0 ! Debugging 1663*59599516SKenneth E. Jansenc yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2) 1664*59599516SKenneth E. Jansenc yold(:,2) = 2.0 1665*59599516SKenneth E. Jansenc yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2) 1666*59599516SKenneth E. Jansenc yold(:,3) = 3.0 1667*59599516SKenneth E. Jansenc yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3) 1668*59599516SKenneth E. Jansenc yold(:,4) = 4.0 1669*59599516SKenneth E. Jansenc yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable 1670*59599516SKenneth E. Jansenc suitable for the 1671*59599516SKenneth E. Jansen 1672*59599516SKenneth E. Jansen 1673*59599516SKenneth E. Jansen intrul=intg(1,itseq) 1674*59599516SKenneth E. Jansen intind=intpt(intrul) 1675*59599516SKenneth E. Jansen 1676*59599516SKenneth E. Jansen do iblk = 1,nelblk 1677*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1678*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 1679*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1680*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1681*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 1682*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 1683*59599516SKenneth E. Jansen inum = iel + npro - 1 1684*59599516SKenneth E. Jansen 1685*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1686*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 1687*59599516SKenneth E. Jansen 1688*59599516SKenneth E. Jansen call resSij (yold, x, mien(iblk)%p, fres, 1689*59599516SKenneth E. Jansen & shglf(lcsyst,:,1:nshl,:), 1690*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 1691*59599516SKenneth E. Jansen 1692*59599516SKenneth E. Jansen if ( istep.eq.0 ) then 1693*59599516SKenneth E. Jansen 1694*59599516SKenneth E. Jansen allocate ( em(npro,nshl,nshl) ) 1695*59599516SKenneth E. Jansen 1696*59599516SKenneth E. Jansen call getgram2 (x, mien(iblk)%p, 1697*59599516SKenneth E. Jansen & shgl(lcsyst,:,1:nshl,:), shp(lcsyst,1:nshl,:), 1698*59599516SKenneth E. Jansen & shglf(lcsyst,:,1:nshl,:), shpf(lcsyst,1:nshl,:), em, 1699*59599516SKenneth E. Jansen & Qwtf(lcsyst,1:ngaussf)) 1700*59599516SKenneth E. Jansen 1701*59599516SKenneth E. Jansenc call getgram (x, mien(iblk)%p, 1702*59599516SKenneth E. Jansenc & shgl(lcsyst,:,1:nshl,:), shp(lcsyst,1:nshl,:), 1703*59599516SKenneth E. Jansenc & em, Qwtf(lcsyst,1:ngaussf)) 1704*59599516SKenneth E. Jansen 1705*59599516SKenneth E. Jansen call fillsparseSclr (mien(iblk)%p, 1706*59599516SKenneth E. Jansen & em, lhsG, 1707*59599516SKenneth E. Jansen & rowp, colm) 1708*59599516SKenneth E. Jansen 1709*59599516SKenneth E. Jansen 1710*59599516SKenneth E. Jansen deallocate ( em ) 1711*59599516SKenneth E. Jansen 1712*59599516SKenneth E. Jansen endif 1713*59599516SKenneth E. Jansen 1714*59599516SKenneth E. Jansen enddo ! End loop over element blocks 1715*59599516SKenneth E. Jansenc 1716*59599516SKenneth E. Jansen 1717*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 24, 'in ') 1718*59599516SKenneth E. Jansenc 1719*59599516SKenneth E. Jansenc account for periodicity in filtered variables 1720*59599516SKenneth E. Jansenc 1721*59599516SKenneth E. Jansen do j = 1,nshg 1722*59599516SKenneth E. Jansen i = iper(j) 1723*59599516SKenneth E. Jansen if (i .ne. j) then 1724*59599516SKenneth E. Jansen fres(i,:) = fres(i,:) + fres(j,:) 1725*59599516SKenneth E. Jansen endif 1726*59599516SKenneth E. Jansen enddo 1727*59599516SKenneth E. Jansen do j = 1,nshg 1728*59599516SKenneth E. Jansen i = iper(j) 1729*59599516SKenneth E. Jansen if (i .ne. j) then 1730*59599516SKenneth E. Jansen fres(j,:) = fres(i,:) 1731*59599516SKenneth E. Jansen endif 1732*59599516SKenneth E. Jansen enddo 1733*59599516SKenneth E. Jansen 1734*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 24, 'out') 1735*59599516SKenneth E. Jansen 1736*59599516SKenneth E. Jansen fres(:,22) = one / fres(:,22) 1737*59599516SKenneth E. Jansen do j = 1,21 1738*59599516SKenneth E. Jansen fres(:,j) = fres(:,j) * fres(:,22) 1739*59599516SKenneth E. Jansen enddo 1740*59599516SKenneth E. Jansen pfres = fres 1741*59599516SKenneth E. Jansen 1742*59599516SKenneth E. Jansenc---- Needed for consistent projection 1743*59599516SKenneth E. Jansen 1744*59599516SKenneth E. Jansenc if(numpe>1) call commu (fres, ilwork, 24, 'in ') 1745*59599516SKenneth E. Jansenc 1746*59599516SKenneth E. Jansenc account for periodicity in filtered variables 1747*59599516SKenneth E. Jansenc 1748*59599516SKenneth E. Jansenc do j = 1,nshg 1749*59599516SKenneth E. Jansenc i = iper(j) 1750*59599516SKenneth E. Jansenc if (i .ne. j) then 1751*59599516SKenneth E. Jansenc fres(i,:) = fres(i,:) + fres(j,:) 1752*59599516SKenneth E. Jansenc endif 1753*59599516SKenneth E. Jansenc enddo 1754*59599516SKenneth E. Jansen 1755*59599516SKenneth E. Jansenc do j = 1,nshg 1756*59599516SKenneth E. Jansenc i = iper(j) 1757*59599516SKenneth E. Jansenc if (i .ne. j) then 1758*59599516SKenneth E. Jansenc fres(j,:) = zero 1759*59599516SKenneth E. Jansenc endif 1760*59599516SKenneth E. Jansenc enddo 1761*59599516SKenneth E. Jansen 1762*59599516SKenneth E. Jansenc Need to zero off-processor slaves as well. 1763*59599516SKenneth E. Jansen 1764*59599516SKenneth E. Jansenc if (numpe.gt.1 .and. nsons(1).gt.1) then 1765*59599516SKenneth E. Jansen 1766*59599516SKenneth E. Jansenc numtask = ilwork(1) 1767*59599516SKenneth E. Jansenc itkbeg = 1 1768*59599516SKenneth E. Jansen 1769*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 1770*59599516SKenneth E. Jansen 1771*59599516SKenneth E. Jansenc do itask = 1, numtask 1772*59599516SKenneth E. Jansen 1773*59599516SKenneth E. Jansenc iacc = ilwork (itkbeg + 2) 1774*59599516SKenneth E. Jansenc numseg = ilwork (itkbeg + 4) 1775*59599516SKenneth E. Jansen 1776*59599516SKenneth E. Jansenc if (iacc .eq. 0) then 1777*59599516SKenneth E. Jansenc do is = 1,numseg 1778*59599516SKenneth E. Jansenc isgbeg = ilwork (itkbeg + 3 + 2*is) 1779*59599516SKenneth E. Jansenc lenseg = ilwork (itkbeg + 4 + 2*is) 1780*59599516SKenneth E. Jansenc isgend = isgbeg + lenseg - 1 1781*59599516SKenneth E. Jansenc fres(isgbeg:isgend,:) = zero 1782*59599516SKenneth E. Jansenc enddo 1783*59599516SKenneth E. Jansenc endif 1784*59599516SKenneth E. Jansen 1785*59599516SKenneth E. Jansenc itkbeg = itkbeg + 4 + 2*numseg 1786*59599516SKenneth E. Jansen 1787*59599516SKenneth E. Jansenc enddo 1788*59599516SKenneth E. Jansen 1789*59599516SKenneth E. Jansenc endif 1790*59599516SKenneth E. Jansen 1791*59599516SKenneth E. Jansenc... At this point fres has the right hand side vector (b) and lhsG has 1792*59599516SKenneth E. Jansenc... the Gram matrix (M_{AB}) (in sparse storage). Now we need to solve 1793*59599516SKenneth E. Jansenc... Ax = b using the conjugate gradient method to finish off the 1794*59599516SKenneth E. Jansenc... L2-projection. 1795*59599516SKenneth E. Jansen 1796*59599516SKenneth E. Jansen 1797*59599516SKenneth E. Jansenc do i = 16, 16 1798*59599516SKenneth E. Jansenc call sparseCG (fres(:,i), pfres(:,i), lhsG, 1799*59599516SKenneth E. Jansenc & rowp, colm, iper, ilwork, 1800*59599516SKenneth E. Jansenc & iBC, BC) 1801*59599516SKenneth E. Jansenc write(*,*) 'i=', i 1802*59599516SKenneth E. Jansenc enddo 1803*59599516SKenneth E. Jansen 1804*59599516SKenneth E. Jansen 1805*59599516SKenneth E. Jansenc write(*,*)'Done with least-squares projection' 1806*59599516SKenneth E. Jansen 1807*59599516SKenneth E. Jansen 1808*59599516SKenneth E. Jansen 1809*59599516SKenneth E. Jansen 1810*59599516SKenneth E. Jansen 1811*59599516SKenneth E. Jansenc.... First let us obtain cdelsq at each node in the domain. 1812*59599516SKenneth E. Jansenc.... We use numNden which lives in the quadfilt module. 1813*59599516SKenneth E. Jansen 1814*59599516SKenneth E. Jansen cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09) 1815*59599516SKenneth E. Jansenc cdelsq(:) = zero ! Debugging 1816*59599516SKenneth E. Jansen 1817*59599516SKenneth E. Jansen if (istep .eq. 0) then 1818*59599516SKenneth E. Jansen xavegt = zero ! For averaging dissipations and SUPG stresses 1819*59599516SKenneth E. Jansen endif 1820*59599516SKenneth E. Jansen 1821*59599516SKenneth E. Jansen if (idiff==1 .or. idiff==3) then ! global reconstruction of qdiff 1822*59599516SKenneth E. Jansenc 1823*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction 1824*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass 1825*59599516SKenneth E. Jansenc 1826*59599516SKenneth E. Jansen qres = zero 1827*59599516SKenneth E. Jansen rmass = zero 1828*59599516SKenneth E. Jansen 1829*59599516SKenneth E. Jansen do iblk = 1, nelblk 1830*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 1831*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1832*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1833*59599516SKenneth E. Jansen iorder = lcblk(4,iblk) 1834*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 1835*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 1836*59599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 1837*59599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 1838*59599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 1839*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1840*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1841*59599516SKenneth E. Jansen 1842*59599516SKenneth E. Jansen allocate ( fakexmu(npro,ngauss) ) 1843*59599516SKenneth E. Jansen fakexmu = zero 1844*59599516SKenneth E. Jansen 1845*59599516SKenneth E. Jansenc 1846*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres, 1847*59599516SKenneth E. Jansenc and lumped mass matrix, rmass 1848*59599516SKenneth E. Jansen 1849*59599516SKenneth E. Jansen call AsIq (y, x, 1850*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:), 1851*59599516SKenneth E. Jansen & shgl(lcsyst,:,1:nshl,:), 1852*59599516SKenneth E. Jansen & mien(iblk)%p, mxmudmi(iblk)%p, 1853*59599516SKenneth E. Jansen & qres, rmass ) 1854*59599516SKenneth E. Jansen 1855*59599516SKenneth E. Jansen deallocate ( fakexmu ) 1856*59599516SKenneth E. Jansen enddo 1857*59599516SKenneth E. Jansen 1858*59599516SKenneth E. Jansenc 1859*59599516SKenneth E. Jansenc.... form the diffusive flux approximation 1860*59599516SKenneth E. Jansenc 1861*59599516SKenneth E. Jansen call qpbc( rmass, qres, iBC, BC, iper, ilwork ) 1862*59599516SKenneth E. Jansenc 1863*59599516SKenneth E. Jansen endif 1864*59599516SKenneth E. Jansen 1865*59599516SKenneth E. Jansen 1866*59599516SKenneth E. Jansenc.... form the SUPG stresses well as dissipation due to eddy viscosity, 1867*59599516SKenneth E. Jansenc... and SUPG stabilization. 1868*59599516SKenneth E. Jansen 1869*59599516SKenneth E. Jansen 1870*59599516SKenneth E. Jansen stress = zero 1871*59599516SKenneth E. Jansen vol = zero 1872*59599516SKenneth E. Jansen diss = zero 1873*59599516SKenneth E. Jansen 1874*59599516SKenneth E. Jansen do iblk = 1,nelblk 1875*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 1876*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 1877*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 1878*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 1879*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 1880*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 1881*59599516SKenneth E. Jansen inum = iel + npro - 1 1882*59599516SKenneth E. Jansen 1883*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 1884*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 1885*59599516SKenneth E. Jansen 1886*59599516SKenneth E. Jansen allocate ( fakexmu(npro,ngauss) ) 1887*59599516SKenneth E. Jansen fakexmu = zero 1888*59599516SKenneth E. Jansen 1889*59599516SKenneth E. Jansen call SUPGstress (y, ac, x, qres, mien(iblk)%p, fakexmu, 1890*59599516SKenneth E. Jansen & cdelsq, shglf(lcsyst,:,1:nshl,:), 1891*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf), 1892*59599516SKenneth E. Jansen & shgl(lcsyst,:,1:nshl,:), shp(lcsyst,1:nshl,:), 1893*59599516SKenneth E. Jansen & stress, diss, vol) 1894*59599516SKenneth E. Jansen 1895*59599516SKenneth E. Jansen deallocate ( fakexmu ) 1896*59599516SKenneth E. Jansen enddo 1897*59599516SKenneth E. Jansen 1898*59599516SKenneth E. Jansen if(numpe>1) call commu (stress, ilwork, 9, 'in ') 1899*59599516SKenneth E. Jansen if(numpe>1) call commu (diss, ilwork, 3, 'in ') 1900*59599516SKenneth E. Jansen if(numpe>1) call commu (vol, ilwork, 1, 'in ') 1901*59599516SKenneth E. Jansen 1902*59599516SKenneth E. Jansenc 1903*59599516SKenneth E. Jansenc account for periodicity 1904*59599516SKenneth E. Jansenc 1905*59599516SKenneth E. Jansen do j = 1,nshg 1906*59599516SKenneth E. Jansen i = iper(j) 1907*59599516SKenneth E. Jansen if (i .ne. j) then 1908*59599516SKenneth E. Jansen stress(i,:) = stress(i,:) + stress(j,:) 1909*59599516SKenneth E. Jansen diss(i,:) = diss(i,:) + diss(j,:) 1910*59599516SKenneth E. Jansen vol(i) = vol(i) + vol(j) 1911*59599516SKenneth E. Jansen endif 1912*59599516SKenneth E. Jansen enddo 1913*59599516SKenneth E. Jansen 1914*59599516SKenneth E. Jansen do j = 1,nshg 1915*59599516SKenneth E. Jansen i = iper(j) 1916*59599516SKenneth E. Jansen if (i .ne. j) then 1917*59599516SKenneth E. Jansen stress(j,:) = stress(i,:) 1918*59599516SKenneth E. Jansen diss(j,:) = diss(i,:) 1919*59599516SKenneth E. Jansen vol(j) = vol(i) 1920*59599516SKenneth E. Jansen endif 1921*59599516SKenneth E. Jansen enddo 1922*59599516SKenneth E. Jansen 1923*59599516SKenneth E. Jansen if(numpe>1) call commu (stress, ilwork, 9, 'out ') 1924*59599516SKenneth E. Jansen if(numpe>1) call commu (diss, ilwork, 3, 'out ') 1925*59599516SKenneth E. Jansen if(numpe>1) call commu (vol, ilwork, 1, 'out ') 1926*59599516SKenneth E. Jansen 1927*59599516SKenneth E. Jansen vol = one / vol 1928*59599516SKenneth E. Jansen do i = 1, 9 1929*59599516SKenneth E. Jansen stress(:,i) = stress(:,i)*vol(:) 1930*59599516SKenneth E. Jansen enddo 1931*59599516SKenneth E. Jansen do i = 1, 3 1932*59599516SKenneth E. Jansen diss(:,i) = diss(:,i)*vol(:) 1933*59599516SKenneth E. Jansen enddo 1934*59599516SKenneth E. Jansen 1935*59599516SKenneth E. Jansenc---------- > Begin averaging dissipations and SUPG stress <-------------- 1936*59599516SKenneth E. Jansen 1937*59599516SKenneth E. Jansen do i = 1, 9 1938*59599516SKenneth E. Jansen xave(:,i) = stress(:,i) 1939*59599516SKenneth E. Jansen enddo 1940*59599516SKenneth E. Jansen xave(:,10) = diss(:,1) 1941*59599516SKenneth E. Jansen xave(:,11) = diss(:,2) 1942*59599516SKenneth E. Jansen xave(:,12) = pfres(:,16) 1943*59599516SKenneth E. Jansen 1944*59599516SKenneth E. Jansenc zero on processor periodic nodes so that they will not be added twice 1945*59599516SKenneth E. Jansen do j = 1,numnp 1946*59599516SKenneth E. Jansen i = iper(j) 1947*59599516SKenneth E. Jansen if (i .ne. j) then 1948*59599516SKenneth E. Jansen xave(j,:) = zero 1949*59599516SKenneth E. Jansen endif 1950*59599516SKenneth E. Jansen enddo 1951*59599516SKenneth E. Jansen 1952*59599516SKenneth E. Jansen if (numpe.gt.1) then 1953*59599516SKenneth E. Jansen 1954*59599516SKenneth E. Jansen numtask = ilwork(1) 1955*59599516SKenneth E. Jansen itkbeg = 1 1956*59599516SKenneth E. Jansen 1957*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 1958*59599516SKenneth E. Jansen do itask = 1, numtask 1959*59599516SKenneth E. Jansen 1960*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 1961*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 1962*59599516SKenneth E. Jansen 1963*59599516SKenneth E. Jansen if (iacc .eq. 0) then 1964*59599516SKenneth E. Jansen do is = 1,numseg 1965*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 1966*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 1967*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 1968*59599516SKenneth E. Jansen xave(isgbeg:isgend,:) = zero 1969*59599516SKenneth E. Jansen enddo 1970*59599516SKenneth E. Jansen endif 1971*59599516SKenneth E. Jansen 1972*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 1973*59599516SKenneth E. Jansen 1974*59599516SKenneth E. Jansen enddo 1975*59599516SKenneth E. Jansen 1976*59599516SKenneth E. Jansen endif 1977*59599516SKenneth E. Jansenc 1978*59599516SKenneth E. Jansen 1979*59599516SKenneth E. Jansen xaveg = zero 1980*59599516SKenneth E. Jansen do i = 1,nshg 1981*59599516SKenneth E. Jansen xaveg(ifath(i),:) = xaveg(ifath(i),:) + xave(i,:) 1982*59599516SKenneth E. Jansen enddo 1983*59599516SKenneth E. Jansen 1984*59599516SKenneth E. Jansen if(numpe .gt. 1)then 1985*59599516SKenneth E. Jansen call drvAllreduce(xaveg, xavegr,12*nfath) 1986*59599516SKenneth E. Jansen 1987*59599516SKenneth E. Jansen do m = 1, 12 1988*59599516SKenneth E. Jansen xavegr(:,m) = xavegr(:,m)/nsons(:) 1989*59599516SKenneth E. Jansen enddo 1990*59599516SKenneth E. Jansen 1991*59599516SKenneth E. Jansenc if (myrank .eq. master) then 1992*59599516SKenneth E. Jansenc write(*,*)'diss=', xavegt(14,11), xavegr(14,11) 1993*59599516SKenneth E. Jansenc endif 1994*59599516SKenneth E. Jansen 1995*59599516SKenneth E. Jansen do m = 1, 12 1996*59599516SKenneth E. Jansen xavegt(:,m) = xavegt(:,m) + xavegr(:,m) 1997*59599516SKenneth E. Jansen enddo 1998*59599516SKenneth E. Jansen 1999*59599516SKenneth E. Jansen else 2000*59599516SKenneth E. Jansen 2001*59599516SKenneth E. Jansen do m = 1, 12 2002*59599516SKenneth E. Jansen xaveg(:,m) = xaveg(:,m)/nsons(:) 2003*59599516SKenneth E. Jansen enddo 2004*59599516SKenneth E. Jansen 2005*59599516SKenneth E. Jansen do m = 1, 12 2006*59599516SKenneth E. Jansen xavegt(:,m) = xavegt(:,m) + xaveg(:,m) 2007*59599516SKenneth E. Jansen enddo 2008*59599516SKenneth E. Jansen 2009*59599516SKenneth E. Jansen endif 2010*59599516SKenneth E. Jansen 2011*59599516SKenneth E. Jansen if (myrank .eq. master) then 2012*59599516SKenneth E. Jansen write(*,*)'diss0=', xavegt(14,11), xavegr(14,11) 2013*59599516SKenneth E. Jansen endif 2014*59599516SKenneth E. Jansen 2015*59599516SKenneth E. Jansen if ( istep .eq. (nstep(1)-1) ) then 2016*59599516SKenneth E. Jansen if ( myrank .eq. master) then 2017*59599516SKenneth E. Jansen 2018*59599516SKenneth E. Jansen do i = 1, nfath 2019*59599516SKenneth E. Jansenc write(376,*)xavegt(i,1),xavegt(i,2),xavegt(i,3) 2020*59599516SKenneth E. Jansenc write(377,*)xavegt(i,4),xavegt(i,5),xavegt(i,6) 2021*59599516SKenneth E. Jansenc write(378,*)xavegt(i,7),xavegt(i,8),xavegt(i,9) 2022*59599516SKenneth E. Jansen write(381,*)xavegt(i,10),xavegt(i,11),xavegt(i,12) 2023*59599516SKenneth E. Jansen enddo 2024*59599516SKenneth E. Jansen 2025*59599516SKenneth E. Jansenc call flush(376) 2026*59599516SKenneth E. Jansenc call flush(377) 2027*59599516SKenneth E. Jansenc call flush(378) 2028*59599516SKenneth E. Jansenc call flush(379) 2029*59599516SKenneth E. Jansen call flush(381) 2030*59599516SKenneth E. Jansen endif 2031*59599516SKenneth E. Jansen endif 2032*59599516SKenneth E. Jansen 2033*59599516SKenneth E. Jansen rnum(ifath(:)) = numNden(:,1) 2034*59599516SKenneth E. Jansen rden(ifath(:)) = numNden(:,2) 2035*59599516SKenneth E. Jansen 2036*59599516SKenneth E. Jansen if (numpe .gt. 1) then 2037*59599516SKenneth E. Jansen do i = 1, nfath 2038*59599516SKenneth E. Jansen if (stabdis(i) .gt. zero) then 2039*59599516SKenneth E. Jansen cdel(i) = (two*xavegr(i,11)-stabdis(i))/xavegr(i,12) 2040*59599516SKenneth E. Jansen xnume(i) = two*xavegr(i,11)-stabdis(i) 2041*59599516SKenneth E. Jansen xdeno(i) = xavegr(i,12) 2042*59599516SKenneth E. Jansen else 2043*59599516SKenneth E. Jansen xnume(i) = rnum(i) 2044*59599516SKenneth E. Jansen xdeno(i) = rden(i) 2045*59599516SKenneth E. Jansen endif 2046*59599516SKenneth E. Jansen enddo 2047*59599516SKenneth E. Jansen else 2048*59599516SKenneth E. Jansen do i = 1, nfath 2049*59599516SKenneth E. Jansen if (stabdis(i) .gt. zero) then 2050*59599516SKenneth E. Jansen cdel(i) = (two*xaveg(i,11)-stabdis(i))/xaveg(i,12) 2051*59599516SKenneth E. Jansen xnume(i) = two*xaveg(i,11)-stabdis(i) 2052*59599516SKenneth E. Jansen xdeno(i) = xaveg(i,12) 2053*59599516SKenneth E. Jansen else 2054*59599516SKenneth E. Jansen xnume(i) = rnum(i) 2055*59599516SKenneth E. Jansen xdeno(i) = rden(i) 2056*59599516SKenneth E. Jansen endif 2057*59599516SKenneth E. Jansen enddo 2058*59599516SKenneth E. Jansen endif 2059*59599516SKenneth E. Jansen 2060*59599516SKenneth E. Jansen do i = 1, nfath 2061*59599516SKenneth E. Jansen if (xnume(i) .lt. zero) then 2062*59599516SKenneth E. Jansen xnume(i) = rnum(i) 2063*59599516SKenneth E. Jansen xdeno(i) = rden(i) 2064*59599516SKenneth E. Jansen endif 2065*59599516SKenneth E. Jansen enddo 2066*59599516SKenneth E. Jansen 2067*59599516SKenneth E. Jansen do i = 1, nshg 2068*59599516SKenneth E. Jansen numNden(i,1) = xnume(ifath(i)) 2069*59599516SKenneth E. Jansen numNden(i,2) = xdeno(ifath(i)) 2070*59599516SKenneth E. Jansen enddo 2071*59599516SKenneth E. Jansen 2072*59599516SKenneth E. Jansen cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09) 2073*59599516SKenneth E. Jansen 2074*59599516SKenneth E. Jansen do iblk = 1,nelblk 2075*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 2076*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 2077*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 2078*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 2079*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 2080*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 2081*59599516SKenneth E. Jansen inum = iel + npro - 1 2082*59599516SKenneth E. Jansen 2083*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 2084*59599516SKenneth E. Jansen 2085*59599516SKenneth E. Jansen call getstrl (yold, x, mien(iblk)%p, 2086*59599516SKenneth E. Jansen & strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:), 2087*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:)) 2088*59599516SKenneth E. Jansen 2089*59599516SKenneth E. Jansen enddo 2090*59599516SKenneth E. Jansen 2091*59599516SKenneth E. Jansen 2092*59599516SKenneth E. Jansen do iblk = 1,nelblk 2093*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 2094*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 2095*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 2096*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 2097*59599516SKenneth E. Jansen inum = iel + npro - 1 2098*59599516SKenneth E. Jansen 2099*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 2100*59599516SKenneth E. Jansen 2101*59599516SKenneth E. Jansen call scatnu (mien(iblk)%p, strl(iel:inum,:), 2102*59599516SKenneth E. Jansen & mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:)) 2103*59599516SKenneth E. Jansen enddo 2104*59599516SKenneth E. Jansen 2105*59599516SKenneth E. Jansen return 2106*59599516SKenneth E. Jansen 2107*59599516SKenneth E. Jansen end 2108*59599516SKenneth E. Jansen subroutine FiltRat (y, shgl, shp, 2109*59599516SKenneth E. Jansen & iper, ilwork, 2110*59599516SKenneth E. Jansen & nsons, ifath, x, cdelsq1, fwr4, 2111*59599516SKenneth E. Jansen & fwr3) 2112*59599516SKenneth E. Jansen 2113*59599516SKenneth E. Jansen use pointer_data 2114*59599516SKenneth E. Jansen 2115*59599516SKenneth E. Jansen use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf), 2116*59599516SKenneth E. Jansenc shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf). 2117*59599516SKenneth E. Jansenc Shpf and shglf are the shape funciotns and their 2118*59599516SKenneth E. Jansenc gradient evaluated using the quadrature rule desired 2119*59599516SKenneth E. Jansenc for computing the dmod. Qwt contains the weights of the 2120*59599516SKenneth E. Jansenc quad. points. 2121*59599516SKenneth E. Jansen 2122*59599516SKenneth E. Jansen include "common.h" 2123*59599516SKenneth E. Jansen include "mpif.h" 2124*59599516SKenneth E. Jansen include "auxmpi.h" 2125*59599516SKenneth E. Jansen 2126*59599516SKenneth E. Jansenc 2127*59599516SKenneth E. Jansen dimension fres(nshg,24), fwr(nshg), 2128*59599516SKenneth E. Jansen & strnrm(nshg), cdelsq1(nfath), 2129*59599516SKenneth E. Jansen & xnum(nshg), xden(nshg), 2130*59599516SKenneth E. Jansen & xmij(nshg,6), xlij(nshg,6), 2131*59599516SKenneth E. Jansen & xnude(nfath,5), xnuder(nfath,5), 2132*59599516SKenneth E. Jansen & nsons(nshg), xfac(nshg,5), 2133*59599516SKenneth E. Jansen & strl(numel,ngauss), xa(nfath,3), 2134*59599516SKenneth E. Jansen & y(nshg,5), yold(nshg,5), 2135*59599516SKenneth E. Jansen & ifath(nshg), iper(nshg), 2136*59599516SKenneth E. Jansen & ilwork(nlwork),! xmudmi(numel,ngauss), 2137*59599516SKenneth E. Jansen & x(numnp,3), 2138*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT), 2139*59599516SKenneth E. Jansen & xnutf(nfath), xkap(nfath), 2140*59599516SKenneth E. Jansen & fwr2(nshg), fwr3(nshg), 2141*59599516SKenneth E. Jansen & xlamb1(nfath), xlamb2(nfath), 2142*59599516SKenneth E. Jansen & fwr4(nshg) 2143*59599516SKenneth E. Jansenc 2144*59599516SKenneth E. Jansen 2145*59599516SKenneth E. Jansen fres = zero 2146*59599516SKenneth E. Jansen yold(:,1)=y(:,4) 2147*59599516SKenneth E. Jansen yold(:,2:4)=y(:,1:3) 2148*59599516SKenneth E. Jansenc 2149*59599516SKenneth E. Jansenc 2150*59599516SKenneth E. Jansenc hack in an interesting velocity field (uncomment to test dmod) 2151*59599516SKenneth E. Jansenc 2152*59599516SKenneth E. Jansenc yold(:,5) = 1.0 ! Debugging 2153*59599516SKenneth E. Jansenc yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2) 2154*59599516SKenneth E. Jansenc yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2) 2155*59599516SKenneth E. Jansenc yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3) 2156*59599516SKenneth E. Jansenc yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable 2157*59599516SKenneth E. Jansenc suitable for the 2158*59599516SKenneth E. Jansen 2159*59599516SKenneth E. Jansen 2160*59599516SKenneth E. Jansen intrul=intg(1,itseq) 2161*59599516SKenneth E. Jansen intind=intpt(intrul) 2162*59599516SKenneth E. Jansen 2163*59599516SKenneth E. Jansen do iblk = 1,nelblk 2164*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 2165*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 2166*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 2167*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 2168*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 2169*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 2170*59599516SKenneth E. Jansen inum = iel + npro - 1 2171*59599516SKenneth E. Jansen 2172*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 2173*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 2174*59599516SKenneth E. Jansen 2175*59599516SKenneth E. Jansen call asithf (yold, x, strl(iel:inum,:), mien(iblk)%p, fres, 2176*59599516SKenneth E. Jansen & shglf(lcsyst,:,1:nshl,:), 2177*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 2178*59599516SKenneth E. Jansen 2179*59599516SKenneth E. Jansen enddo 2180*59599516SKenneth E. Jansenc 2181*59599516SKenneth E. Jansen 2182*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 24, 'in ') 2183*59599516SKenneth E. Jansenc 2184*59599516SKenneth E. Jansenc account for periodicity in filtered variables 2185*59599516SKenneth E. Jansenc 2186*59599516SKenneth E. Jansen do j = 1,nshg 2187*59599516SKenneth E. Jansen i = iper(j) 2188*59599516SKenneth E. Jansen if (i .ne. j) then 2189*59599516SKenneth E. Jansen fres(i,:) = fres(i,:) + fres(j,:) 2190*59599516SKenneth E. Jansen endif 2191*59599516SKenneth E. Jansen enddo 2192*59599516SKenneth E. Jansen do j = 1,nshg 2193*59599516SKenneth E. Jansen i = iper(j) 2194*59599516SKenneth E. Jansen if (i .ne. j) then 2195*59599516SKenneth E. Jansen fres(j,:) = fres(i,:) 2196*59599516SKenneth E. Jansen endif 2197*59599516SKenneth E. Jansen enddo 2198*59599516SKenneth E. Jansen 2199*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 24, 'out') 2200*59599516SKenneth E. Jansen 2201*59599516SKenneth E. Jansen fres(:,23) = one / fres(:,23) 2202*59599516SKenneth E. Jansen do j = 1,22 2203*59599516SKenneth E. Jansen fres(:,j) = fres(:,j) * fres(:,23) 2204*59599516SKenneth E. Jansen enddo 2205*59599516SKenneth E. Jansenc 2206*59599516SKenneth E. Jansenc.....at this point fres is really all of our filtered quantities 2207*59599516SKenneth E. Jansenc at the nodes 2208*59599516SKenneth E. Jansenc 2209*59599516SKenneth E. Jansen 2210*59599516SKenneth E. Jansen xlij(:,1) = fres(:,4) - fres(:,1)*fres(:,1) 2211*59599516SKenneth E. Jansen xlij(:,2) = fres(:,5) - fres(:,2)*fres(:,2) 2212*59599516SKenneth E. Jansen xlij(:,3) = fres(:,6) - fres(:,3)*fres(:,3) 2213*59599516SKenneth E. Jansen xlij(:,4) = fres(:,7) - fres(:,1)*fres(:,2) 2214*59599516SKenneth E. Jansen xlij(:,5) = fres(:,8) - fres(:,1)*fres(:,3) 2215*59599516SKenneth E. Jansen xlij(:,6) = fres(:,9) - fres(:,2)*fres(:,3) 2216*59599516SKenneth E. Jansen 2217*59599516SKenneth E. Jansen strnrm = sqrt( 2218*59599516SKenneth E. Jansen & two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2) 2219*59599516SKenneth E. Jansen & + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) ) 2220*59599516SKenneth E. Jansen 2221*59599516SKenneth E. Jansen xfac(:,1) = strnrm*strnrm*( fres(:,10)**2 + fres(:,11)**2 + 2222*59599516SKenneth E. Jansen & fres(:,12)**2 2223*59599516SKenneth E. Jansen & + two*( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) ) 2224*59599516SKenneth E. Jansen 2225*59599516SKenneth E. Jansen xfac(:,2) = strnrm*( xlij(:,1)*fres(:,10) + xlij(:,2)*fres(:,11) 2226*59599516SKenneth E. Jansen & + xlij(:,3)*fres(:,12) + 2227*59599516SKenneth E. Jansen & two*(xlij(:,4)*fres(:,13) + xlij(:,5)*fres(:,14) + 2228*59599516SKenneth E. Jansen & xlij(:,6)*fres(:,15)) ) 2229*59599516SKenneth E. Jansen 2230*59599516SKenneth E. Jansen xfac(:,3) = strnrm*( fres(:,10)*fres(:,16) + fres(:,11)*fres(:,17) 2231*59599516SKenneth E. Jansen & + fres(:,12)*fres(:,18) + 2232*59599516SKenneth E. Jansen & two*(fres(:,13)*fres(:,19) + fres(:,14)*fres(:,20) + 2233*59599516SKenneth E. Jansen & fres(:,15)*fres(:,21)) ) 2234*59599516SKenneth E. Jansen 2235*59599516SKenneth E. Jansen xfac(:,4) = xlij(:,1)*fres(:,16) + xlij(:,2)*fres(:,17) 2236*59599516SKenneth E. Jansen & + xlij(:,3)*fres(:,18) + 2237*59599516SKenneth E. Jansen & two*(xlij(:,4)*fres(:,19) + xlij(:,5)*fres(:,20) + 2238*59599516SKenneth E. Jansen & xlij(:,6)*fres(:,21)) 2239*59599516SKenneth E. Jansen 2240*59599516SKenneth E. Jansen xfac(:,5) = fres(:,16)*fres(:,16) + fres(:,17)*fres(:,17) 2241*59599516SKenneth E. Jansen & + fres(:,18)*fres(:,18) + 2242*59599516SKenneth E. Jansen & two*(fres(:,19)*fres(:,19) + fres(:,20)*fres(:,20) + 2243*59599516SKenneth E. Jansen & fres(:,21)*fres(:,21)) 2244*59599516SKenneth E. Jansen 2245*59599516SKenneth E. Jansen 2246*59599516SKenneth E. Jansenc xfac(:,1) = one ! Debugging 2247*59599516SKenneth E. Jansenc xfac(:,2) = one 2248*59599516SKenneth E. Jansenc xfac(:,3) = two 2249*59599516SKenneth E. Jansenc xfac(:,4) = one 2250*59599516SKenneth E. Jansenc xfac(:,5) = one 2251*59599516SKenneth E. Jansen 2252*59599516SKenneth E. Jansenc zero on processor periodic nodes so that they will not be added twice 2253*59599516SKenneth E. Jansen 2254*59599516SKenneth E. Jansen do j = 1, nshg 2255*59599516SKenneth E. Jansen i = iper(j) 2256*59599516SKenneth E. Jansen if (i .ne. j) then 2257*59599516SKenneth E. Jansen xfac(j,1) = zero 2258*59599516SKenneth E. Jansen xfac(j,2) = zero 2259*59599516SKenneth E. Jansen xfac(j,3) = zero 2260*59599516SKenneth E. Jansen xfac(j,4) = zero 2261*59599516SKenneth E. Jansen xfac(j,5) = zero 2262*59599516SKenneth E. Jansen endif 2263*59599516SKenneth E. Jansen enddo 2264*59599516SKenneth E. Jansen 2265*59599516SKenneth E. Jansen if (numpe.gt.1) then 2266*59599516SKenneth E. Jansen 2267*59599516SKenneth E. Jansen numtask = ilwork(1) 2268*59599516SKenneth E. Jansen itkbeg = 1 2269*59599516SKenneth E. Jansen 2270*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 2271*59599516SKenneth E. Jansen do itask = 1, numtask 2272*59599516SKenneth E. Jansen 2273*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 2274*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 2275*59599516SKenneth E. Jansen 2276*59599516SKenneth E. Jansen if (iacc .eq. 0) then 2277*59599516SKenneth E. Jansen do is = 1,numseg 2278*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 2279*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 2280*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 2281*59599516SKenneth E. Jansen xfac(isgbeg:isgend,:) = zero 2282*59599516SKenneth E. Jansen enddo 2283*59599516SKenneth E. Jansen endif 2284*59599516SKenneth E. Jansen 2285*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 2286*59599516SKenneth E. Jansen 2287*59599516SKenneth E. Jansen enddo 2288*59599516SKenneth E. Jansen 2289*59599516SKenneth E. Jansen endif 2290*59599516SKenneth E. Jansen 2291*59599516SKenneth E. Jansenc... Debugging 2292*59599516SKenneth E. Jansen 2293*59599516SKenneth E. Jansen xatm1 = sum(xfac(:,1)) 2294*59599516SKenneth E. Jansen xatm2 = sum(xfac(:,2)) 2295*59599516SKenneth E. Jansen xatm3 = sum(xfac(:,3)) 2296*59599516SKenneth E. Jansen xatm4 = sum(xfac(:,4)) 2297*59599516SKenneth E. Jansen xatm5 = sum(xfac(:,5)) 2298*59599516SKenneth E. Jansen 2299*59599516SKenneth E. Jansen 2300*59599516SKenneth E. Jansenc 2301*59599516SKenneth E. Jansenc Description of arrays. Each processor has an array of length equal 2302*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect 2303*59599516SKenneth E. Jansenc the numerator and one to collect the denominator. There is also an array 2304*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each 2305*59599516SKenneth E. Jansenc on processor node, ifath(nnshg). Finally, there is an arry of length 2306*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons 2307*59599516SKenneth E. Jansenc for each father. 2308*59599516SKenneth E. Jansenc 2309*59599516SKenneth E. Jansenc Now loop over nodes and accumlate the numerator and the denominator 2310*59599516SKenneth E. Jansenc to the father nodes. Only on processor addition at this point. 2311*59599516SKenneth E. Jansenc Note that serrogate fathers are collect some for the case where some 2312*59599516SKenneth E. Jansenc sons are on another processor 2313*59599516SKenneth E. Jansenc 2314*59599516SKenneth E. Jansen xnude = zero 2315*59599516SKenneth E. Jansen do i = 1,nshg 2316*59599516SKenneth E. Jansen xnude(ifath(i),1) = xnude(ifath(i),1) + xfac(i,1) 2317*59599516SKenneth E. Jansen xnude(ifath(i),2) = xnude(ifath(i),2) + xfac(i,2) 2318*59599516SKenneth E. Jansen xnude(ifath(i),3) = xnude(ifath(i),3) + xfac(i,3) 2319*59599516SKenneth E. Jansen xnude(ifath(i),4) = xnude(ifath(i),4) + xfac(i,4) 2320*59599516SKenneth E. Jansen xnude(ifath(i),5) = xnude(ifath(i),5) + xfac(i,5) 2321*59599516SKenneth E. Jansen enddo 2322*59599516SKenneth E. Jansen 2323*59599516SKenneth E. Jansenc 2324*59599516SKenneth E. Jansenc Now the true fathers and serrogates combine results and update 2325*59599516SKenneth E. Jansenc each other. 2326*59599516SKenneth E. Jansenc 2327*59599516SKenneth E. Jansen if(numpe .gt. 1)then 2328*59599516SKenneth E. Jansen call drvAllreduce(xnude, xnuder,5*nfath) 2329*59599516SKenneth E. Jansenc 2330*59599516SKenneth E. Jansenc xnude is the sum of the sons for each father on this processor 2331*59599516SKenneth E. Jansenc 2332*59599516SKenneth E. Jansenc xnuder is the sum of the sons for each father on all processor combined 2333*59599516SKenneth E. Jansenc (the same as if we had not partitioned the mesh for each processor) 2334*59599516SKenneth E. Jansenc 2335*59599516SKenneth E. Jansenc For each father we have precomputed the number of sons (including 2336*59599516SKenneth E. Jansenc the sons off processor). 2337*59599516SKenneth E. Jansenc 2338*59599516SKenneth E. Jansenc Now divide by number of sons to get the average (not really necessary 2339*59599516SKenneth E. Jansenc for dynamic model since ratio will cancel nsons at each father) 2340*59599516SKenneth E. Jansenc 2341*59599516SKenneth E. Jansenc xnuder(:,1) = xnuder(:,1) / nsons(:) 2342*59599516SKenneth E. Jansenc xnuder(:,2) = xnuder(:,2) / nsons(:) 2343*59599516SKenneth E. Jansenc xnuder(:,3) = xnuder(:,3) / nsons(:) 2344*59599516SKenneth E. Jansenc xnuder(:,4) = xnuder(:,4) / nsons(:) 2345*59599516SKenneth E. Jansenc xnuder(:,5) = xnuder(:,5) / nsons(:) 2346*59599516SKenneth E. Jansenc 2347*59599516SKenneth E. Jansenc the next line are the a, b, c coefficients in the quadratic eq. 2348*59599516SKenneth E. Jansenc 2349*59599516SKenneth E. Jansen 2350*59599516SKenneth E. Jansen do i = 1,nfath 2351*59599516SKenneth E. Jansen xa(i,1) = two*cdelsq1(i)*xnuder(i,1) + 2352*59599516SKenneth E. Jansen & xnuder(i,2) 2353*59599516SKenneth E. Jansen xa(i,2) = four*cdelsq1(i)*xnuder(i,3) + 2354*59599516SKenneth E. Jansen & xnuder(i,4) 2355*59599516SKenneth E. Jansen xa(i,3) = two*cdelsq1(i)*xnuder(i,5) 2356*59599516SKenneth E. Jansen 2357*59599516SKenneth E. Jansenc xa(i,1) = xnuder(ifath(i),1) + ! Debugging 2358*59599516SKenneth E. Jansenc & xnuder(ifath(i),2) 2359*59599516SKenneth E. Jansenc xa(i,2) = xnuder(ifath(i),3) + 2360*59599516SKenneth E. Jansenc & xnuder(ifath(i),4) 2361*59599516SKenneth E. Jansenc xa(i,3) = xnuder(ifath(i),5) 2362*59599516SKenneth E. Jansen 2363*59599516SKenneth E. Jansen 2364*59599516SKenneth E. Jansen enddo 2365*59599516SKenneth E. Jansen else 2366*59599516SKenneth E. Jansen 2367*59599516SKenneth E. Jansenc xnude(:,1) = xnude(:,1) / nsons(:) 2368*59599516SKenneth E. Jansenc xnude(:,2) = xnude(:,2) / nsons(:) 2369*59599516SKenneth E. Jansenc xnude(:,3) = xnude(:,3) / nsons(:) 2370*59599516SKenneth E. Jansenc xnude(:,4) = xnude(:,4) / nsons(:) 2371*59599516SKenneth E. Jansenc xnude(:,5) = xnude(:,5) / nsons(:) 2372*59599516SKenneth E. Jansen 2373*59599516SKenneth E. Jansen do i = 1,nfath 2374*59599516SKenneth E. Jansen xa(i,1) = two*cdelsq1(i)*xnude(i,1) + 2375*59599516SKenneth E. Jansen & xnude(i,2) 2376*59599516SKenneth E. Jansen xa(i,2) = four*cdelsq1(i)*xnude(i,3) + 2377*59599516SKenneth E. Jansen & xnude(i,4) 2378*59599516SKenneth E. Jansen xa(i,3) = two*cdelsq1(i)*xnude(i,5) 2379*59599516SKenneth E. Jansen 2380*59599516SKenneth E. Jansenc xa(i,1) = xnude(ifath(i),1) + ! Debugging 2381*59599516SKenneth E. Jansenc & xnude(ifath(i),2) 2382*59599516SKenneth E. Jansenc xa(i,2) = xnude(ifath(i),3) + 2383*59599516SKenneth E. Jansenc & xnude(ifath(i),4) 2384*59599516SKenneth E. Jansenc xa(i,3) = xnude(ifath(i),5) 2385*59599516SKenneth E. Jansen 2386*59599516SKenneth E. Jansen enddo 2387*59599516SKenneth E. Jansen endif 2388*59599516SKenneth E. Jansen 2389*59599516SKenneth E. Jansenc... Solve a*x*x - b*x + c 2390*59599516SKenneth E. Jansen 2391*59599516SKenneth E. Jansen 2392*59599516SKenneth E. Jansen do i = 1, nfath 2393*59599516SKenneth E. Jansen 2394*59599516SKenneth E. Jansen xdisc = xa(i,2)**2 - four*xa(i,1)*xa(i,3) 2395*59599516SKenneth E. Jansen 2396*59599516SKenneth E. Jansen if (xdisc .lt. zero) then 2397*59599516SKenneth E. Jansen write(*,*) '*********Warning on filter width ratio********' 2398*59599516SKenneth E. Jansen xlamb1(i) = fwr1 2399*59599516SKenneth E. Jansen xlamb2(i) = fwr1 2400*59599516SKenneth E. Jansen if (xdisc .lt. -0.5d0) then 2401*59599516SKenneth E. Jansen write(*,*) '*********Warning on filter width ratio********' 2402*59599516SKenneth E. Jansen endif 2403*59599516SKenneth E. Jansen endif 2404*59599516SKenneth E. Jansen 2405*59599516SKenneth E. Jansen if (xdisc .eq. zero) then 2406*59599516SKenneth E. Jansen xlamb1(i) = xa(i,2) / (two*xa(i,1)) 2407*59599516SKenneth E. Jansen xlamb2(i) = xa(i,2) / (two*xa(i,1)) 2408*59599516SKenneth E. Jansen endif 2409*59599516SKenneth E. Jansen 2410*59599516SKenneth E. Jansen if (xdisc .gt. zero) then 2411*59599516SKenneth E. Jansen xlamb1(i)= ( xa(i,2) + sqrt( xa(i,2)**2 - four*xa(i,1)*xa(i,3) ) ) 2412*59599516SKenneth E. Jansen & / (two*xa(i,1)) 2413*59599516SKenneth E. Jansen xlamb2(i)= ( xa(i,2) - sqrt( xa(i,2)**2 - four*xa(i,1)*xa(i,3) ) ) 2414*59599516SKenneth E. Jansen & / (two*xa(i,1)) 2415*59599516SKenneth E. Jansen endif 2416*59599516SKenneth E. Jansen 2417*59599516SKenneth E. Jansen enddo 2418*59599516SKenneth E. Jansen 2419*59599516SKenneth E. Jansen do i = 1, nshg 2420*59599516SKenneth E. Jansen fwr2(i) = xlamb1(ifath(i)) 2421*59599516SKenneth E. Jansen fwr3(i) = xlamb2(ifath(i)) 2422*59599516SKenneth E. Jansen enddo 2423*59599516SKenneth E. Jansen 2424*59599516SKenneth E. Jansen if (myrank .eq. master) then 2425*59599516SKenneth E. Jansen do i = 1, nfath 2426*59599516SKenneth E. Jansen write(23,*)i,xlamb1(i), xlamb2(i) 2427*59599516SKenneth E. Jansen enddo 2428*59599516SKenneth E. Jansen endif 2429*59599516SKenneth E. Jansen call flush(23) 2430*59599516SKenneth E. Jansen 2431*59599516SKenneth E. Jansen 2432*59599516SKenneth E. Jansen 2433*59599516SKenneth E. Jansen do i = 1, nfath 2434*59599516SKenneth E. Jansen xkap(i) = cdelsq1(i) / xlamb2(i) 2435*59599516SKenneth E. Jansen xa(i,1) = two*xkap(i)*xnuder(i,1) 2436*59599516SKenneth E. Jansen xa(i,2) = four*xkap(i)*xnuder(i,3) - xnuder(i,2) 2437*59599516SKenneth E. Jansen xa(i,3) = two*xkap(i)*xnuder(i,5) - xnuder(i,4) 2438*59599516SKenneth E. Jansen 2439*59599516SKenneth E. Jansen xlamb1(i)= ( xa(i,2) + sqrt( xa(i,2)**2 - four*xa(i,1)*xa(i,3) 2440*59599516SKenneth E. Jansen & ) )/ (two*xa(i,1)) 2441*59599516SKenneth E. Jansen xlamb2(i)= ( xa(i,2) - sqrt( xa(i,2)**2 - four*xa(i,1)*xa(i,3) 2442*59599516SKenneth E. Jansen & ) )/ (two*xa(i,1)) 2443*59599516SKenneth E. Jansen 2444*59599516SKenneth E. Jansen enddo 2445*59599516SKenneth E. Jansen 2446*59599516SKenneth E. Jansen 2447*59599516SKenneth E. Jansen if (myrank .eq. master) then 2448*59599516SKenneth E. Jansen do i = 1, nfath 2449*59599516SKenneth E. Jansen write(255,*)i, xlamb1(i), xlamb2(i) 2450*59599516SKenneth E. Jansen enddo 2451*59599516SKenneth E. Jansen endif 2452*59599516SKenneth E. Jansen call flush(255) 2453*59599516SKenneth E. Jansen 2454*59599516SKenneth E. Jansen fwr4(:) = xlamb1(ifath(:)) 2455*59599516SKenneth E. Jansen 2456*59599516SKenneth E. Jansen return 2457*59599516SKenneth E. Jansen end 2458*59599516SKenneth E. Jansen subroutine DFWRsfdmc (y, shgl, shp, 2459*59599516SKenneth E. Jansen & iper, ilwork, 2460*59599516SKenneth E. Jansen & nsons, ifath, x, fwr2, fwr3) 2461*59599516SKenneth E. Jansen 2462*59599516SKenneth E. Jansen use pointer_data 2463*59599516SKenneth E. Jansen 2464*59599516SKenneth E. Jansen use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf), 2465*59599516SKenneth E. Jansenc shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf). 2466*59599516SKenneth E. Jansenc Shpf and shglf are the shape funciotns and their 2467*59599516SKenneth E. Jansenc gradient evaluated using the quadrature rule desired 2468*59599516SKenneth E. Jansenc for computing the dmod. Qwt contains the weights of the 2469*59599516SKenneth E. Jansenc quad. points. 2470*59599516SKenneth E. Jansen 2471*59599516SKenneth E. Jansen 2472*59599516SKenneth E. Jansen 2473*59599516SKenneth E. Jansen include "common.h" 2474*59599516SKenneth E. Jansen include "mpif.h" 2475*59599516SKenneth E. Jansen include "auxmpi.h" 2476*59599516SKenneth E. Jansen 2477*59599516SKenneth E. Jansenc 2478*59599516SKenneth E. Jansen dimension fres(nshg,24), fwr(nshg), 2479*59599516SKenneth E. Jansen & strnrm(nshg), cdelsq(nshg), 2480*59599516SKenneth E. Jansen & cdelsq2(nshg), 2481*59599516SKenneth E. Jansen & xnum(nshg), xden(nshg), 2482*59599516SKenneth E. Jansen & xmij(nshg,6), xlij(nshg,6), 2483*59599516SKenneth E. Jansen & xnude(nfath,2), xnuder(nfath,2), 2484*59599516SKenneth E. Jansen & ynude(nfath,6), ynuder(nfath,6), 2485*59599516SKenneth E. Jansen & ui(nfath,3), snorm(nfath), 2486*59599516SKenneth E. Jansen & uir(nfath,3), snormr(nfath), 2487*59599516SKenneth E. Jansen & xm(nfath,6), xl(nfath,6) 2488*59599516SKenneth E. Jansen dimension xl1(nfath,6), xl2(nfath,6), 2489*59599516SKenneth E. Jansen & xl1r(nfath,6), xl2r(nfath,6), 2490*59599516SKenneth E. Jansen & xmr(nfath,6), xlr(nfath,6), 2491*59599516SKenneth E. Jansen & nsons(nshg), 2492*59599516SKenneth E. Jansen & strl(numel,ngauss), 2493*59599516SKenneth E. Jansen & y(nshg,5), yold(nshg,5), 2494*59599516SKenneth E. Jansen & ifath(nshg), iper(nshg), 2495*59599516SKenneth E. Jansen & ilwork(nlwork),! xmudmi(numel,ngauss), 2496*59599516SKenneth E. Jansen & x(numnp,3) 2497*59599516SKenneth E. Jansen dimension shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT), 2498*59599516SKenneth E. Jansen & xnutf(nfath), xfac(nshg,5), 2499*59599516SKenneth E. Jansen & fwr2(nshg), fwr3(nshg) 2500*59599516SKenneth E. Jansen 2501*59599516SKenneth E. Jansen character*10 cname 2502*59599516SKenneth E. Jansen character*30 fname1, fname2, fname3, fname4, fname5, fname6, 2503*59599516SKenneth E. Jansen & fname0 2504*59599516SKenneth E. Jansenc 2505*59599516SKenneth E. Jansenc 2506*59599516SKenneth E. Jansenc setup the weights for time averaging of cdelsq (now in quadfilt module) 2507*59599516SKenneth E. Jansenc 2508*59599516SKenneth E. Jansen denom=max(1.0d0*(lstep),one) 2509*59599516SKenneth E. Jansen if(dtavei.lt.0) then 2510*59599516SKenneth E. Jansen wcur=one/denom 2511*59599516SKenneth E. Jansen else 2512*59599516SKenneth E. Jansen wcur=dtavei 2513*59599516SKenneth E. Jansen endif 2514*59599516SKenneth E. Jansen whist=1.0-wcur 2515*59599516SKenneth E. Jansen 2516*59599516SKenneth E. Jansen if (istep .eq. 0) then 2517*59599516SKenneth E. Jansen xnd = zero 2518*59599516SKenneth E. Jansen xmodcomp = zero 2519*59599516SKenneth E. Jansen xmcomp = zero 2520*59599516SKenneth E. Jansen xlcomp = zero 2521*59599516SKenneth E. Jansen xl1comp = zero 2522*59599516SKenneth E. Jansen xl2comp = zero 2523*59599516SKenneth E. Jansen ucomp = zero 2524*59599516SKenneth E. Jansen scomp = zero 2525*59599516SKenneth E. Jansen endif 2526*59599516SKenneth E. Jansen 2527*59599516SKenneth E. Jansen 2528*59599516SKenneth E. Jansen fres = zero 2529*59599516SKenneth E. Jansen yold(:,1)=y(:,4) 2530*59599516SKenneth E. Jansen yold(:,2:4)=y(:,1:3) 2531*59599516SKenneth E. Jansenc 2532*59599516SKenneth E. Jansen 2533*59599516SKenneth E. Jansenc 2534*59599516SKenneth E. Jansenc hack in an interesting velocity field (uncomment to test dmod) 2535*59599516SKenneth E. Jansenc 2536*59599516SKenneth E. Jansenc yold(:,5) = 1.0 ! Debugging 2537*59599516SKenneth E. Jansenc yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2) 2538*59599516SKenneth E. Jansenc yold(:,2) = 2.0 2539*59599516SKenneth E. Jansenc yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2) 2540*59599516SKenneth E. Jansenc yold(:,3) = 3.0 2541*59599516SKenneth E. Jansenc yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3) 2542*59599516SKenneth E. Jansenc yold(:,4) = 4.0 2543*59599516SKenneth E. Jansenc yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable 2544*59599516SKenneth E. Jansenc suitable for the 2545*59599516SKenneth E. Jansen 2546*59599516SKenneth E. Jansen 2547*59599516SKenneth E. Jansen 2548*59599516SKenneth E. Jansen intrul=intg(1,itseq) 2549*59599516SKenneth E. Jansen intind=intpt(intrul) 2550*59599516SKenneth E. Jansen 2551*59599516SKenneth E. Jansen do iblk = 1,nelblk 2552*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 2553*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 2554*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 2555*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 2556*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 2557*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 2558*59599516SKenneth E. Jansen inum = iel + npro - 1 2559*59599516SKenneth E. Jansen 2560*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 2561*59599516SKenneth E. Jansen 2562*59599516SKenneth E. Jansen call asithf (yold, x, strl(iel:inum,:), mien(iblk)%p, fres, 2563*59599516SKenneth E. Jansen & shglf(lcsyst,:,1:nshl,:), 2564*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 2565*59599516SKenneth E. Jansen 2566*59599516SKenneth E. Jansen enddo 2567*59599516SKenneth E. Jansenc 2568*59599516SKenneth E. Jansen 2569*59599516SKenneth E. Jansen if (ngaussf .ne. ngauss) then 2570*59599516SKenneth E. Jansen do iblk = 1,nelblk 2571*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 2572*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 2573*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 2574*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 2575*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 2576*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 2577*59599516SKenneth E. Jansen inum = iel + npro - 1 2578*59599516SKenneth E. Jansen 2579*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 2580*59599516SKenneth E. Jansen 2581*59599516SKenneth E. Jansen call getstrl (yold, x, mien(iblk)%p, 2582*59599516SKenneth E. Jansen & strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:), 2583*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:)) 2584*59599516SKenneth E. Jansen 2585*59599516SKenneth E. Jansen enddo 2586*59599516SKenneth E. Jansen endif 2587*59599516SKenneth E. Jansenc 2588*59599516SKenneth E. Jansenc 2589*59599516SKenneth E. JansenC must fix for abc and dynamic model 2590*59599516SKenneth E. Jansenc if(iabc==1) !are there any axisym bc's 2591*59599516SKenneth E. Jansenc & call rotabc(res, iBC, BC,nflow, 'in ') 2592*59599516SKenneth E. Jansenc 2593*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 24, 'in ') 2594*59599516SKenneth E. Jansenc 2595*59599516SKenneth E. Jansenc account for periodicity in filtered variables 2596*59599516SKenneth E. Jansenc 2597*59599516SKenneth E. Jansen do j = 1,nshg 2598*59599516SKenneth E. Jansen i = iper(j) 2599*59599516SKenneth E. Jansen if (i .ne. j) then 2600*59599516SKenneth E. Jansen fres(i,:) = fres(i,:) + fres(j,:) 2601*59599516SKenneth E. Jansen endif 2602*59599516SKenneth E. Jansen enddo 2603*59599516SKenneth E. Jansen do j = 1,nshg 2604*59599516SKenneth E. Jansen i = iper(j) 2605*59599516SKenneth E. Jansen if (i .ne. j) then 2606*59599516SKenneth E. Jansen fres(j,:) = fres(i,:) 2607*59599516SKenneth E. Jansen endif 2608*59599516SKenneth E. Jansen enddo 2609*59599516SKenneth E. Jansen 2610*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 24, 'out') 2611*59599516SKenneth E. Jansen 2612*59599516SKenneth E. Jansen fres(:,23) = one / fres(:,23) 2613*59599516SKenneth E. Jansen do j = 1,22 2614*59599516SKenneth E. Jansen fres(:,j) = fres(:,j) * fres(:,23) 2615*59599516SKenneth E. Jansen enddo 2616*59599516SKenneth E. Jansenc fres(:,24) = fres(:,24) * fres(:,23) 2617*59599516SKenneth E. Jansenc 2618*59599516SKenneth E. Jansenc.....at this point fres is really all of our filtered quantities 2619*59599516SKenneth E. Jansenc at the nodes 2620*59599516SKenneth E. Jansenc 2621*59599516SKenneth E. Jansen 2622*59599516SKenneth E. Jansen strnrm = sqrt( 2623*59599516SKenneth E. Jansen & two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2) 2624*59599516SKenneth E. Jansen & + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) ) 2625*59599516SKenneth E. Jansen 2626*59599516SKenneth E. Jansenc fwr = fwr1 * fres(:,22) * strnrm 2627*59599516SKenneth E. Jansen fwr = fwr3 * fres(:,22) * strnrm 2628*59599516SKenneth E. Jansen 2629*59599516SKenneth E. Jansen xmij(:,1) = -fwr 2630*59599516SKenneth E. Jansen & * fres(:,10) + fres(:,16) 2631*59599516SKenneth E. Jansen xmij(:,2) = -fwr 2632*59599516SKenneth E. Jansen & * fres(:,11) + fres(:,17) 2633*59599516SKenneth E. Jansen xmij(:,3) = -fwr 2634*59599516SKenneth E. Jansen & * fres(:,12) + fres(:,18) 2635*59599516SKenneth E. Jansen 2636*59599516SKenneth E. Jansen xmij(:,4) = -fwr * fres(:,13) + fres(:,19) 2637*59599516SKenneth E. Jansen xmij(:,5) = -fwr * fres(:,14) + fres(:,20) 2638*59599516SKenneth E. Jansen xmij(:,6) = -fwr * fres(:,15) + fres(:,21) 2639*59599516SKenneth E. Jansen 2640*59599516SKenneth E. Jansen fres(:,22) = one / fres(:,22) 2641*59599516SKenneth E. Jansen 2642*59599516SKenneth E. Jansen xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1) * fres(:,22) 2643*59599516SKenneth E. Jansen xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2) * fres(:,22) 2644*59599516SKenneth E. Jansen xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3) * fres(:,22) 2645*59599516SKenneth E. Jansen xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2) * fres(:,22) 2646*59599516SKenneth E. Jansen xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3) * fres(:,22) 2647*59599516SKenneth E. Jansen xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3) * fres(:,22) 2648*59599516SKenneth E. Jansen 2649*59599516SKenneth E. Jansen xnum = xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2) 2650*59599516SKenneth E. Jansen & + xlij(:,3) * xmij(:,3) 2651*59599516SKenneth E. Jansen & + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5) 2652*59599516SKenneth E. Jansen & + xlij(:,6) * xmij(:,6)) 2653*59599516SKenneth E. Jansen xden = xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2) 2654*59599516SKenneth E. Jansen & + xmij(:,3) * xmij(:,3) 2655*59599516SKenneth E. Jansen & + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5) 2656*59599516SKenneth E. Jansen & + xmij(:,6) * xmij(:,6)) 2657*59599516SKenneth E. Jansen xden = two * xden 2658*59599516SKenneth E. Jansen 2659*59599516SKenneth E. Jansenc... For collectection of statistics on dyn. model components 2660*59599516SKenneth E. Jansen 2661*59599516SKenneth E. Jansen xfac(:,1) = strnrm*strnrm*( fres(:,10)**2 + fres(:,11)**2 + 2662*59599516SKenneth E. Jansen & fres(:,12)**2 2663*59599516SKenneth E. Jansen & + two*( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) ) 2664*59599516SKenneth E. Jansen 2665*59599516SKenneth E. Jansen xfac(:,2) = strnrm*( xlij(:,1)*fres(:,10) + xlij(:,2)*fres(:,11) 2666*59599516SKenneth E. Jansen & + xlij(:,3)*fres(:,12) + 2667*59599516SKenneth E. Jansen & two*(xlij(:,4)*fres(:,13) + xlij(:,5)*fres(:,14) + 2668*59599516SKenneth E. Jansen & xlij(:,6)*fres(:,15)) ) 2669*59599516SKenneth E. Jansen 2670*59599516SKenneth E. Jansen xfac(:,3) = strnrm*( fres(:,10)*fres(:,16) + fres(:,11)*fres(:,17) 2671*59599516SKenneth E. Jansen & + fres(:,12)*fres(:,18) + 2672*59599516SKenneth E. Jansen & two*(fres(:,13)*fres(:,19) + fres(:,14)*fres(:,20) + 2673*59599516SKenneth E. Jansen & fres(:,15)*fres(:,21)) ) 2674*59599516SKenneth E. Jansen 2675*59599516SKenneth E. Jansen xfac(:,4) = xlij(:,1)*fres(:,16) + xlij(:,2)*fres(:,17) 2676*59599516SKenneth E. Jansen & + xlij(:,3)*fres(:,18) + 2677*59599516SKenneth E. Jansen & two*(xlij(:,4)*fres(:,19) + xlij(:,5)*fres(:,20) + 2678*59599516SKenneth E. Jansen & xlij(:,6)*fres(:,21)) 2679*59599516SKenneth E. Jansen 2680*59599516SKenneth E. Jansen xfac(:,5) = fres(:,16)*fres(:,16) + fres(:,17)*fres(:,17) 2681*59599516SKenneth E. Jansen & + fres(:,18)*fres(:,18) + 2682*59599516SKenneth E. Jansen & two*(fres(:,19)*fres(:,19) + fres(:,20)*fres(:,20) + 2683*59599516SKenneth E. Jansen & fres(:,21)*fres(:,21)) 2684*59599516SKenneth E. Jansen 2685*59599516SKenneth E. Jansenc zero on processor periodic nodes so that they will not be added twice 2686*59599516SKenneth E. Jansen do j = 1,numnp 2687*59599516SKenneth E. Jansen i = iper(j) 2688*59599516SKenneth E. Jansen if (i .ne. j) then 2689*59599516SKenneth E. Jansen xnum(j) = zero 2690*59599516SKenneth E. Jansen xden(j) = zero 2691*59599516SKenneth E. Jansen xfac(j,:) = zero 2692*59599516SKenneth E. Jansen xmij(j,:) = zero 2693*59599516SKenneth E. Jansen xlij(j,:) = zero 2694*59599516SKenneth E. Jansen fres(j,:) = zero 2695*59599516SKenneth E. Jansen strnrm(j) = zero 2696*59599516SKenneth E. Jansen endif 2697*59599516SKenneth E. Jansen enddo 2698*59599516SKenneth E. Jansen 2699*59599516SKenneth E. Jansen if (numpe.gt.1) then 2700*59599516SKenneth E. Jansen 2701*59599516SKenneth E. Jansen numtask = ilwork(1) 2702*59599516SKenneth E. Jansen itkbeg = 1 2703*59599516SKenneth E. Jansen 2704*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 2705*59599516SKenneth E. Jansen do itask = 1, numtask 2706*59599516SKenneth E. Jansen 2707*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 2708*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 2709*59599516SKenneth E. Jansen 2710*59599516SKenneth E. Jansen if (iacc .eq. 0) then 2711*59599516SKenneth E. Jansen do is = 1,numseg 2712*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 2713*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 2714*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 2715*59599516SKenneth E. Jansen xnum(isgbeg:isgend) = zero 2716*59599516SKenneth E. Jansen xden(isgbeg:isgend) = zero 2717*59599516SKenneth E. Jansen strnrm(isgbeg:isgend) = zero 2718*59599516SKenneth E. Jansen xfac(isgbeg:isgend,:) = zero 2719*59599516SKenneth E. Jansen xmij(isgbeg:isgend,:) = zero 2720*59599516SKenneth E. Jansen xlij(isgbeg:isgend,:) = zero 2721*59599516SKenneth E. Jansen fres(isgbeg:isgend,:) = zero 2722*59599516SKenneth E. Jansen enddo 2723*59599516SKenneth E. Jansen endif 2724*59599516SKenneth E. Jansen 2725*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 2726*59599516SKenneth E. Jansen 2727*59599516SKenneth E. Jansen enddo 2728*59599516SKenneth E. Jansen 2729*59599516SKenneth E. Jansen endif 2730*59599516SKenneth E. Jansenc 2731*59599516SKenneth E. Jansenc Description of arrays. Each processor has an array of length equal 2732*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect 2733*59599516SKenneth E. Jansenc the numerator and one to collect the denominator. There is also an array 2734*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each 2735*59599516SKenneth E. Jansenc on processor node, ifath(nnshg). Finally, there is an arry of length 2736*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons 2737*59599516SKenneth E. Jansenc for each father. 2738*59599516SKenneth E. Jansenc 2739*59599516SKenneth E. Jansenc Now loop over nodes and accumlate the numerator and the denominator 2740*59599516SKenneth E. Jansenc to the father nodes. Only on processor addition at this point. 2741*59599516SKenneth E. Jansenc Note that serrogate fathers are collect some for the case where some 2742*59599516SKenneth E. Jansenc sons are on another processor 2743*59599516SKenneth E. Jansenc 2744*59599516SKenneth E. Jansen xnude = zero 2745*59599516SKenneth E. Jansen ynude = zero 2746*59599516SKenneth E. Jansen xm = zero 2747*59599516SKenneth E. Jansen xl = zero 2748*59599516SKenneth E. Jansen xl1 = zero 2749*59599516SKenneth E. Jansen xl2 = zero 2750*59599516SKenneth E. Jansen ui = zero 2751*59599516SKenneth E. Jansen snorm = zero 2752*59599516SKenneth E. Jansen 2753*59599516SKenneth E. Jansen do i = 1,nshg 2754*59599516SKenneth E. Jansen xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i) 2755*59599516SKenneth E. Jansen xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i) 2756*59599516SKenneth E. Jansen 2757*59599516SKenneth E. Jansen ynude(ifath(i),1) = ynude(ifath(i),1) + xfac(i,1) 2758*59599516SKenneth E. Jansen ynude(ifath(i),2) = ynude(ifath(i),2) + xfac(i,2) 2759*59599516SKenneth E. Jansen ynude(ifath(i),3) = ynude(ifath(i),3) + xfac(i,3) 2760*59599516SKenneth E. Jansen ynude(ifath(i),4) = ynude(ifath(i),4) + xfac(i,4) 2761*59599516SKenneth E. Jansen ynude(ifath(i),5) = ynude(ifath(i),5) + xfac(i,5) 2762*59599516SKenneth E. Jansen 2763*59599516SKenneth E. Jansen xm(ifath(i),1) = xm(ifath(i),1) + xmij(i,1) 2764*59599516SKenneth E. Jansen xm(ifath(i),2) = xm(ifath(i),2) + xmij(i,2) 2765*59599516SKenneth E. Jansen xm(ifath(i),3) = xm(ifath(i),3) + xmij(i,3) 2766*59599516SKenneth E. Jansen xm(ifath(i),4) = xm(ifath(i),4) + xmij(i,4) 2767*59599516SKenneth E. Jansen xm(ifath(i),5) = xm(ifath(i),5) + xmij(i,5) 2768*59599516SKenneth E. Jansen xm(ifath(i),6) = xm(ifath(i),6) + xmij(i,6) 2769*59599516SKenneth E. Jansen 2770*59599516SKenneth E. Jansen xl(ifath(i),1) = xl(ifath(i),1) + xlij(i,1) 2771*59599516SKenneth E. Jansen xl(ifath(i),2) = xl(ifath(i),2) + xlij(i,2) 2772*59599516SKenneth E. Jansen xl(ifath(i),3) = xl(ifath(i),3) + xlij(i,3) 2773*59599516SKenneth E. Jansen xl(ifath(i),4) = xl(ifath(i),4) + xlij(i,4) 2774*59599516SKenneth E. Jansen xl(ifath(i),5) = xl(ifath(i),5) + xlij(i,5) 2775*59599516SKenneth E. Jansen xl(ifath(i),6) = xl(ifath(i),6) + xlij(i,6) 2776*59599516SKenneth E. Jansen 2777*59599516SKenneth E. Jansen xl1(ifath(i),1) = xl1(ifath(i),1) + fres(i,4) 2778*59599516SKenneth E. Jansen xl1(ifath(i),2) = xl1(ifath(i),2) + fres(i,5) 2779*59599516SKenneth E. Jansen xl1(ifath(i),3) = xl1(ifath(i),3) + fres(i,6) 2780*59599516SKenneth E. Jansen xl1(ifath(i),4) = xl1(ifath(i),4) + fres(i,7) 2781*59599516SKenneth E. Jansen xl1(ifath(i),5) = xl1(ifath(i),5) + fres(i,8) 2782*59599516SKenneth E. Jansen xl1(ifath(i),6) = xl1(ifath(i),6) + fres(i,9) 2783*59599516SKenneth E. Jansen 2784*59599516SKenneth E. Jansen xl2(ifath(i),1) = xl2(ifath(i),1) + fres(i,1)*fres(i,1) 2785*59599516SKenneth E. Jansen xl2(ifath(i),2) = xl2(ifath(i),2) + fres(i,2)*fres(i,2) 2786*59599516SKenneth E. Jansen xl2(ifath(i),3) = xl2(ifath(i),3) + fres(i,3)*fres(i,3) 2787*59599516SKenneth E. Jansen xl2(ifath(i),4) = xl2(ifath(i),4) + fres(i,1)*fres(i,2) 2788*59599516SKenneth E. Jansen xl2(ifath(i),5) = xl2(ifath(i),5) + fres(i,1)*fres(i,3) 2789*59599516SKenneth E. Jansen xl2(ifath(i),6) = xl2(ifath(i),6) + fres(i,2)*fres(i,3) 2790*59599516SKenneth E. Jansen 2791*59599516SKenneth E. Jansen ui(ifath(i),1) = ui(ifath(i),1) + fres(i,1) 2792*59599516SKenneth E. Jansen ui(ifath(i),2) = ui(ifath(i),2) + fres(i,2) 2793*59599516SKenneth E. Jansen ui(ifath(i),3) = ui(ifath(i),3) + fres(i,3) 2794*59599516SKenneth E. Jansen 2795*59599516SKenneth E. Jansen snorm(ifath(i)) = snorm(ifath(i)) + strnrm(i) 2796*59599516SKenneth E. Jansen 2797*59599516SKenneth E. Jansen enddo 2798*59599516SKenneth E. Jansen 2799*59599516SKenneth E. Jansenc 2800*59599516SKenneth E. Jansenc Now the true fathers and serrogates combine results and update 2801*59599516SKenneth E. Jansenc each other. 2802*59599516SKenneth E. Jansenc 2803*59599516SKenneth E. Jansen if(numpe .gt. 1)then 2804*59599516SKenneth E. Jansen call drvAllreduce(xnude, xnuder,2*nfath) 2805*59599516SKenneth E. Jansen call drvAllreduce(ynude, ynuder,6*nfath) 2806*59599516SKenneth E. Jansen call drvAllreduce(xm, xmr,6*nfath) 2807*59599516SKenneth E. Jansen call drvAllreduce(xl, xlr,6*nfath) 2808*59599516SKenneth E. Jansen call drvAllreduce(xl1, xl1r,6*nfath) 2809*59599516SKenneth E. Jansen call drvAllreduce(xl2, xl2r,6*nfath) 2810*59599516SKenneth E. Jansen call drvAllreduce(ui, uir,3*nfath) 2811*59599516SKenneth E. Jansen call drvAllreduce(snorm, snormr,nfath) 2812*59599516SKenneth E. Jansen 2813*59599516SKenneth E. Jansen do i = 1, nfath 2814*59599516SKenneth E. Jansen ynuder(i,6) = ( ynuder(i,4) - fwr1*ynuder(i,2) ) / 2815*59599516SKenneth E. Jansen & ( two*ynuder(i,5) - four*fwr1*ynuder(i,3) 2816*59599516SKenneth E. Jansen & + two*fwr1*fwr1*ynuder(i,1) ) 2817*59599516SKenneth E. Jansen enddo 2818*59599516SKenneth E. Jansen 2819*59599516SKenneth E. Jansen cdelsq2(:) = ynuder(ifath(:),6) ! For comparison w/ cdelsq 2820*59599516SKenneth E. Jansenc 2821*59599516SKenneth E. Jansenc xnude is the sum of the sons for each father on this processor 2822*59599516SKenneth E. Jansenc 2823*59599516SKenneth E. Jansenc xnuder is the sum of the sons for each father on all processor combined 2824*59599516SKenneth E. Jansenc (the same as if we had not partitioned the mesh for each processor) 2825*59599516SKenneth E. Jansenc 2826*59599516SKenneth E. Jansenc For each father we have precomputed the number of sons (including 2827*59599516SKenneth E. Jansenc the sons off processor). 2828*59599516SKenneth E. Jansenc 2829*59599516SKenneth E. Jansenc Now divide by number of sons to get the average (not really necessary 2830*59599516SKenneth E. Jansenc for dynamic model since ratio will cancel nsons at each father) 2831*59599516SKenneth E. Jansenc 2832*59599516SKenneth E. Jansen xnuder(:,1) = xnuder(:,1) / nsons(:) 2833*59599516SKenneth E. Jansen xnuder(:,2) = xnuder(:,2) / nsons(:) 2834*59599516SKenneth E. Jansen 2835*59599516SKenneth E. Jansen do m = 1, 5 2836*59599516SKenneth E. Jansen ynuder(:,m) = ynuder(:,m)/nsons(:) 2837*59599516SKenneth E. Jansen enddo 2838*59599516SKenneth E. Jansen do m = 1,6 2839*59599516SKenneth E. Jansen xmr(:,m) = xmr(:,m)/nsons(:) 2840*59599516SKenneth E. Jansen xlr(:,m) = xlr(:,m)/nsons(:) 2841*59599516SKenneth E. Jansen xl1r(:,m) = xl1r(:,m)/nsons(:) 2842*59599516SKenneth E. Jansen xl2r(:,m) = xl2r(:,m)/nsons(:) 2843*59599516SKenneth E. Jansen enddo 2844*59599516SKenneth E. Jansen 2845*59599516SKenneth E. Jansen uir(:,1) = uir(:,1)/nsons(:) 2846*59599516SKenneth E. Jansen uir(:,2) = uir(:,2)/nsons(:) 2847*59599516SKenneth E. Jansen uir(:,3) = uir(:,3)/nsons(:) 2848*59599516SKenneth E. Jansen 2849*59599516SKenneth E. Jansen snormr(:) = snormr(:)/nsons(:) 2850*59599516SKenneth E. Jansenc 2851*59599516SKenneth E. Jansencc the next line is c \Delta^2 2852*59599516SKenneth E. Jansencc 2853*59599516SKenneth E. Jansencc xnuder(:,1) = xnuder(:,1) / (xnuder(:,2) + 1.d-09) 2854*59599516SKenneth E. Jansencc do i = 1,nshg 2855*59599516SKenneth E. Jansencc cdelsq(i) = xnuder(ifath(i),1) 2856*59599516SKenneth E. Jansencc enddo 2857*59599516SKenneth E. Jansen 2858*59599516SKenneth E. Jansen numNden(:,1) = whist*numNden(:,1)+wcur*xnuder(ifath(:),1) 2859*59599516SKenneth E. Jansen numNden(:,2) = whist*numNden(:,2)+wcur*xnuder(ifath(:),2) 2860*59599516SKenneth E. Jansen cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09) 2861*59599516SKenneth E. Jansen 2862*59599516SKenneth E. Jansenc cdelsq(:) = xnuder(ifath(:),1)/(xnuder(ifath(:),2)+1.d-09) 2863*59599516SKenneth E. Jansen 2864*59599516SKenneth E. Jansen xnd(:,1) = xnd(:,1) + xnuder(:,1) 2865*59599516SKenneth E. Jansen xnd(:,2) = xnd(:,2) + xnuder(:,2) 2866*59599516SKenneth E. Jansen 2867*59599516SKenneth E. Jansen xmodcomp(:,1) = xmodcomp(:,1)+ynuder(:,1) 2868*59599516SKenneth E. Jansen xmodcomp(:,2) = xmodcomp(:,2)+ynuder(:,2) 2869*59599516SKenneth E. Jansen xmodcomp(:,3) = xmodcomp(:,3)+ynuder(:,3) 2870*59599516SKenneth E. Jansen xmodcomp(:,4) = xmodcomp(:,4)+ynuder(:,4) 2871*59599516SKenneth E. Jansen xmodcomp(:,5) = xmodcomp(:,5)+ynuder(:,5) 2872*59599516SKenneth E. Jansen 2873*59599516SKenneth E. Jansen xmcomp(:,:) = xmcomp(:,:)+xmr(:,:) 2874*59599516SKenneth E. Jansen xlcomp(:,:) = xlcomp(:,:)+xlr(:,:) 2875*59599516SKenneth E. Jansen 2876*59599516SKenneth E. Jansen xl1comp(:,:) = xl1comp(:,:)+xl1r(:,:) 2877*59599516SKenneth E. Jansen xl2comp(:,:) = xl2comp(:,:)+xl2r(:,:) 2878*59599516SKenneth E. Jansen 2879*59599516SKenneth E. Jansen ucomp(:,:) = ucomp(:,:)+uir(:,:) 2880*59599516SKenneth E. Jansen u1 = uir(32,1) 2881*59599516SKenneth E. Jansen scomp(:) = scomp(:)+snormr(:) 2882*59599516SKenneth E. Jansen 2883*59599516SKenneth E. Jansen else 2884*59599516SKenneth E. Jansen 2885*59599516SKenneth E. Jansen xnude(:,1) = xnude(:,1)/nsons(:) 2886*59599516SKenneth E. Jansen xnude(:,2) = xnude(:,2)/nsons(:) 2887*59599516SKenneth E. Jansen 2888*59599516SKenneth E. Jansen do m = 1, 5 2889*59599516SKenneth E. Jansen ynude(:,m) = ynude(:,m)/nsons(:) 2890*59599516SKenneth E. Jansen enddo 2891*59599516SKenneth E. Jansen do m = 1,6 2892*59599516SKenneth E. Jansen xm(:,m) = xm(:,m)/nsons(:) 2893*59599516SKenneth E. Jansen xl(:,m) = xl(:,m)/nsons(:) 2894*59599516SKenneth E. Jansen xl1(:,m) = xl1(:,m)/nsons(:) 2895*59599516SKenneth E. Jansen xl2(:,m) = xl2(:,m)/nsons(:) 2896*59599516SKenneth E. Jansen enddo 2897*59599516SKenneth E. Jansen 2898*59599516SKenneth E. Jansen ui(:,1) = ui(:,1)/nsons(:) 2899*59599516SKenneth E. Jansen ui(:,2) = ui(:,2)/nsons(:) 2900*59599516SKenneth E. Jansen ui(:,3) = ui(:,3)/nsons(:) 2901*59599516SKenneth E. Jansen 2902*59599516SKenneth E. Jansen snorm(:) = snorm(:)/nsons(:) 2903*59599516SKenneth E. Jansen 2904*59599516SKenneth E. Jansenc 2905*59599516SKenneth E. Jansenc the next line is c \Delta^2, not nu_T but we want to save the 2906*59599516SKenneth E. Jansenc memory 2907*59599516SKenneth E. Jansenc 2908*59599516SKenneth E. Jansen 2909*59599516SKenneth E. Jansencc xnude(:,1) = xnude(:,1) / (xnude(:,2) + 1.d-09) 2910*59599516SKenneth E. Jansencc do i = 1,nshg 2911*59599516SKenneth E. Jansencc cdelsq(i) = xnude(ifath(i),1) 2912*59599516SKenneth E. Jansencc enddo 2913*59599516SKenneth E. Jansencc endif 2914*59599516SKenneth E. Jansen 2915*59599516SKenneth E. Jansen do i = 1, nfath 2916*59599516SKenneth E. Jansen ynude(i,6) = ( ynude(i,4) - fwr1*ynude(i,2) ) / 2917*59599516SKenneth E. Jansen & ( two*ynude(i,5) - four*fwr1*ynude(i,3) 2918*59599516SKenneth E. Jansen & + fwr1*fwr1*ynude(i,1) ) 2919*59599516SKenneth E. Jansen enddo 2920*59599516SKenneth E. Jansen 2921*59599516SKenneth E. Jansen numNden(:,1) = whist*numNden(:,1)+wcur*xnude(ifath(:),1) 2922*59599516SKenneth E. Jansen numNden(:,2) = whist*numNden(:,2)+wcur*xnude(ifath(:),2) 2923*59599516SKenneth E. Jansen 2924*59599516SKenneth E. Jansen xnd(:,1) = xnd(:,1)+xnude(:,1) 2925*59599516SKenneth E. Jansen xnd(:,2) = xnd(:,2)+xnude(:,2) 2926*59599516SKenneth E. Jansen 2927*59599516SKenneth E. Jansen cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09) 2928*59599516SKenneth E. Jansen 2929*59599516SKenneth E. Jansenc cdelsq(:) = xnude(ifath(:),1)/(xnude(ifath(:),2))!+1.d-09) 2930*59599516SKenneth E. Jansen 2931*59599516SKenneth E. Jansen 2932*59599516SKenneth E. Jansen cdelsq2(:) = ynude(ifath(:),6) ! For comparison w/ cdelsq 2933*59599516SKenneth E. Jansen 2934*59599516SKenneth E. Jansen xmodcomp(:,1) = xmodcomp(:,1)+ynude(:,1) 2935*59599516SKenneth E. Jansen xmodcomp(:,2) = xmodcomp(:,2)+ynude(:,2) 2936*59599516SKenneth E. Jansen xmodcomp(:,3) = xmodcomp(:,3)+ynude(:,3) 2937*59599516SKenneth E. Jansen xmodcomp(:,4) = xmodcomp(:,4)+ynude(:,4) 2938*59599516SKenneth E. Jansen xmodcomp(:,5) = xmodcomp(:,5)+ynude(:,5) 2939*59599516SKenneth E. Jansen 2940*59599516SKenneth E. Jansen xmcomp(:,:) = xmcomp(:,:)+xm(:,:) 2941*59599516SKenneth E. Jansen xlcomp(:,:) = xlcomp(:,:)+xl(:,:) 2942*59599516SKenneth E. Jansen 2943*59599516SKenneth E. Jansen xl1comp(:,:) = xl1comp(:,:)+xl1(:,:) 2944*59599516SKenneth E. Jansen xl2comp(:,:) = xl2comp(:,:)+xl2(:,:) 2945*59599516SKenneth E. Jansen 2946*59599516SKenneth E. Jansen ucomp(:,:) = ucomp(:,:)+ui(:,:) 2947*59599516SKenneth E. Jansen scomp(:) = scomp(:)+snorm(:) 2948*59599516SKenneth E. Jansen 2949*59599516SKenneth E. Jansen endif 2950*59599516SKenneth E. Jansen 2951*59599516SKenneth E. Jansenc do i = 1, nfath 2952*59599516SKenneth E. Jansenc xmodcomp(i,:) = xmodcomp(i,:)/nsons(i) 2953*59599516SKenneth E. Jansenc xmcomp(i,:) = xmcomp(i,:)/nsons(i) 2954*59599516SKenneth E. Jansenc xlcomp(i,:) = xlcomp(i,:)/nsons(i) 2955*59599516SKenneth E. Jansenc xl2comp(i,:) = xl2comp(i,:)/nsons(i) 2956*59599516SKenneth E. Jansenc xl1comp(i,:) = xl1comp(i,:)/nsons(i) 2957*59599516SKenneth E. Jansenc xnd(i,:) = xnd(i,:)/nsons(i) 2958*59599516SKenneth E. Jansenc scomp(i) = scomp(i)/nsons(i) 2959*59599516SKenneth E. Jansenc ucomp(i,:) = ucomp(i,:)/nsons(i) 2960*59599516SKenneth E. Jansenc enddo 2961*59599516SKenneth E. Jansen 2962*59599516SKenneth E. Jansen if (myrank .eq. master) then 2963*59599516SKenneth E. Jansen write(*,*)'istep, nstep=', istep, nstep(1) 2964*59599516SKenneth E. Jansen endif 2965*59599516SKenneth E. Jansen 2966*59599516SKenneth E. Jansen if ( istep .eq. (nstep(1)-1) ) then 2967*59599516SKenneth E. Jansen if ( myrank .eq. master) then 2968*59599516SKenneth E. Jansen 2969*59599516SKenneth E. Jansen do i = 1, nfath 2970*59599516SKenneth E. Jansen write(365,*)xmodcomp(i,1),xmodcomp(i,2),xmodcomp(i,3), 2971*59599516SKenneth E. Jansen & xmodcomp(i,4),xmodcomp(i,5) 2972*59599516SKenneth E. Jansen 2973*59599516SKenneth E. Jansen write(366,*)xmcomp(i,1),xmcomp(i,2),xmcomp(i,3) 2974*59599516SKenneth E. Jansen write(367,*)xmcomp(i,4),xmcomp(i,5),xmcomp(i,6) 2975*59599516SKenneth E. Jansen 2976*59599516SKenneth E. Jansen write(368,*)xlcomp(i,1),xlcomp(i,2),xlcomp(i,3) 2977*59599516SKenneth E. Jansen write(369,*)xlcomp(i,4),xlcomp(i,5),xlcomp(i,6) 2978*59599516SKenneth E. Jansen 2979*59599516SKenneth E. Jansen write(370,*)xl1comp(i,1),xl1comp(i,2),xl1comp(i,3) 2980*59599516SKenneth E. Jansen write(371,*)xl1comp(i,4),xl1comp(i,5),xl1comp(i,6) 2981*59599516SKenneth E. Jansen 2982*59599516SKenneth E. Jansen write(372,*)xl2comp(i,1),xl2comp(i,2),xl2comp(i,3) 2983*59599516SKenneth E. Jansen write(373,*)xl2comp(i,4),xl2comp(i,5),xl2comp(i,6) 2984*59599516SKenneth E. Jansen 2985*59599516SKenneth E. Jansen write(374,*)xnd(i,1),xnd(i,2),scomp(i) 2986*59599516SKenneth E. Jansen write(375,*)ucomp(i,1),ucomp(i,2),ucomp(i,3) 2987*59599516SKenneth E. Jansen enddo 2988*59599516SKenneth E. Jansen 2989*59599516SKenneth E. Jansen call flush(365) 2990*59599516SKenneth E. Jansen call flush(366) 2991*59599516SKenneth E. Jansen call flush(367) 2992*59599516SKenneth E. Jansen call flush(368) 2993*59599516SKenneth E. Jansen call flush(369) 2994*59599516SKenneth E. Jansen call flush(370) 2995*59599516SKenneth E. Jansen call flush(371) 2996*59599516SKenneth E. Jansen call flush(372) 2997*59599516SKenneth E. Jansen call flush(373) 2998*59599516SKenneth E. Jansen call flush(374) 2999*59599516SKenneth E. Jansen call flush(375) 3000*59599516SKenneth E. Jansen 3001*59599516SKenneth E. Jansenc close(852) 3002*59599516SKenneth E. Jansenc close(853) 3003*59599516SKenneth E. Jansenc close(854) 3004*59599516SKenneth E. Jansen 3005*59599516SKenneth E. Jansen endif 3006*59599516SKenneth E. Jansen endif 3007*59599516SKenneth E. Jansen 3008*59599516SKenneth E. Jansen if (myrank .eq. master) then 3009*59599516SKenneth E. Jansen write(*,*)'uit uic=', ucomp(32,1),u1 3010*59599516SKenneth E. Jansen endif 3011*59599516SKenneth E. Jansen 3012*59599516SKenneth E. Jansen 555 format(e14.7,4(2x,e14.7)) 3013*59599516SKenneth E. Jansen 556 format(e14.7,5(2x,e14.7)) 3014*59599516SKenneth E. Jansen 3015*59599516SKenneth E. Jansen 3016*59599516SKenneth E. Jansen 3017*59599516SKenneth E. Jansen 3018*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 3019*59599516SKenneth E. Jansen tmp1 = MINVAL(cdelsq) 3020*59599516SKenneth E. Jansen tmp2 = MAXVAL(cdelsq) 3021*59599516SKenneth E. Jansen if(numpe>1) then 3022*59599516SKenneth E. Jansen call MPI_REDUCE (tmp1, tmp3, 1,MPI_DOUBLE_PRECISION, 3023*59599516SKenneth E. Jansen & MPI_MIN, master, MPI_COMM_WORLD, ierr) 3024*59599516SKenneth E. Jansen call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION, 3025*59599516SKenneth E. Jansen & MPI_MAX, master, MPI_COMM_WORLD, ierr) 3026*59599516SKenneth E. Jansen tmp1=tmp3 3027*59599516SKenneth E. Jansen tmp2=tmp4 3028*59599516SKenneth E. Jansen endif 3029*59599516SKenneth E. Jansen if (myrank .EQ. master) then !print CDelta^2 range 3030*59599516SKenneth E. Jansen write(34,*)lstep,tmp1,tmp2 3031*59599516SKenneth E. Jansen call flush(34) 3032*59599516SKenneth E. Jansen endif 3033*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 3034*59599516SKenneth E. Jansen 3035*59599516SKenneth E. Jansen if (myrank .eq. master) then 3036*59599516SKenneth E. Jansen write(*,*) 'cdelsq=', cdelsq(1),cdelsq(2) 3037*59599516SKenneth E. Jansen write(*,*) 'cdelsq=', cdelsq2(1),cdelsq2(2) 3038*59599516SKenneth E. Jansen write(22,*) lstep, cdelsq(1) 3039*59599516SKenneth E. Jansen call flush(22) 3040*59599516SKenneth E. Jansen endif 3041*59599516SKenneth E. Jansen 3042*59599516SKenneth E. Jansen do iblk = 1,nelblk 3043*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 3044*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 3045*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 3046*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 3047*59599516SKenneth E. Jansen inum = iel + npro - 1 3048*59599516SKenneth E. Jansen 3049*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 3050*59599516SKenneth E. Jansen 3051*59599516SKenneth E. Jansen call scatnu (mien(iblk)%p, strl(iel:inum,:), 3052*59599516SKenneth E. Jansen & mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:)) 3053*59599516SKenneth E. Jansen enddo 3054*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 3055*59599516SKenneth E. Jansenc$$$ tmp1 = MINVAL(xmudmi) 3056*59599516SKenneth E. Jansenc$$$ tmp2 = MAXVAL(xmudmi) 3057*59599516SKenneth E. Jansenc$$$ if(numpe>1) then 3058*59599516SKenneth E. Jansenc$$$ call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION, 3059*59599516SKenneth E. Jansenc$$$ & MPI_MIN, master, MPI_COMM_WORLD, ierr) 3060*59599516SKenneth E. Jansenc$$$ call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION, 3061*59599516SKenneth E. Jansenc$$$ & MPI_MAX, master, MPI_COMM_WORLD, ierr) 3062*59599516SKenneth E. Jansenc$$$ tmp1=tmp3 3063*59599516SKenneth E. Jansenc$$$ tmp2=tmp4 3064*59599516SKenneth E. Jansenc$$$ endif 3065*59599516SKenneth E. Jansenc$$$ if (myrank .EQ. master) then 3066*59599516SKenneth E. Jansenc$$$ write(35,*) lstep,tmp1,tmp2 3067*59599516SKenneth E. Jansenc$$$ call flush(35) 3068*59599516SKenneth E. Jansenc$$$ endif 3069*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 3070*59599516SKenneth E. Jansen 3071*59599516SKenneth E. Jansenc 3072*59599516SKenneth E. Jansenc if flag set, write a restart file with info (reuse xmij's memory) 3073*59599516SKenneth E. Jansenc 3074*59599516SKenneth E. Jansen if(irs.eq.11) then 3075*59599516SKenneth E. Jansen lstep=999 3076*59599516SKenneth E. Jansen xmij(:,1)=xnum(:) 3077*59599516SKenneth E. Jansen xmij(:,2)=xden(:) 3078*59599516SKenneth E. Jansen xmij(:,3)=cdelsq(:) 3079*59599516SKenneth E. Jansen xmij(:,5)=xlij(:,4) !leave M_{12} in 4 and put L_{12} here 3080*59599516SKenneth E. Jansen call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac 3081*59599516SKenneth E. Jansen stop 3082*59599516SKenneth E. Jansen endif 3083*59599516SKenneth E. Jansenc 3084*59599516SKenneth E. Jansenc local clipping moved to scatnu with the creation of mxmudmi pointers 3085*59599516SKenneth E. Jansenc 3086*59599516SKenneth E. Jansenc$$$ rmu=datmat(1,2,1) 3087*59599516SKenneth E. Jansenc$$$ xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu 3088*59599516SKenneth E. Jansenc$$$ xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0 3089*59599516SKenneth E. Jansenc stop !uncomment to test dmod 3090*59599516SKenneth E. Jansenc 3091*59599516SKenneth E. Jansen 3092*59599516SKenneth E. Jansen 3093*59599516SKenneth E. Jansenc write out the nodal values of xnut (estimate since we don't calc strain 3094*59599516SKenneth E. Jansenc there and must use the filtered strain). 3095*59599516SKenneth E. Jansenc 3096*59599516SKenneth E. Jansen 3097*59599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 3098*59599516SKenneth E. Jansenc 3099*59599516SKenneth E. Jansenc collect the average strain into xnude(2) 3100*59599516SKenneth E. Jansenc 3101*59599516SKenneth E. Jansen xnude(:,2) = zero 3102*59599516SKenneth E. Jansen do i = 1,numnp 3103*59599516SKenneth E. Jansen xnude(ifath(i),2) = xnude(ifath(i),2) + strnrm(i) 3104*59599516SKenneth E. Jansen enddo 3105*59599516SKenneth E. Jansen 3106*59599516SKenneth E. Jansen if(numpe .gt. 1) then 3107*59599516SKenneth E. Jansen call drvAllreduce(xnude(:,2), xnuder(:,2),nfath) 3108*59599516SKenneth E. Jansen else 3109*59599516SKenneth E. Jansen xnuder=xnude 3110*59599516SKenneth E. Jansen endif 3111*59599516SKenneth E. Jansenc 3112*59599516SKenneth E. Jansenc nut= cdelsq * |S| 3113*59599516SKenneth E. Jansenc 3114*59599516SKenneth E. Jansen xnutf=xnuder(:,1)*xnuder(:,2)/nsons(:) 3115*59599516SKenneth E. Jansenc 3116*59599516SKenneth E. Jansenc collect the x and y coords into xnude 3117*59599516SKenneth E. Jansenc 3118*59599516SKenneth E. Jansen xnude = zero 3119*59599516SKenneth E. Jansen do i = 1,numnp 3120*59599516SKenneth E. Jansen xnude(ifath(i),1) = xnude(ifath(i),1) + x(i,1) 3121*59599516SKenneth E. Jansen xnude(ifath(i),2) = xnude(ifath(i),2) + x(i,2) 3122*59599516SKenneth E. Jansen enddo 3123*59599516SKenneth E. Jansen 3124*59599516SKenneth E. Jansen if(numpe .gt. 1) 3125*59599516SKenneth E. Jansen & call drvAllreduce(xnude, xnuder,2*nfath) 3126*59599516SKenneth E. Jansen xnuder(:,1)=xnuder(:,1)/nsons(:) 3127*59599516SKenneth E. Jansen xnuder(:,2)=xnuder(:,2)/nsons(:) 3128*59599516SKenneth E. Jansenc 3129*59599516SKenneth E. Jansenc xnude is the sum of the sons for each father on this processor 3130*59599516SKenneth E. Jansenc 3131*59599516SKenneth E. Jansen if((myrank.eq.master)) then 3132*59599516SKenneth E. Jansen do i=1,nfath ! cdelsq * |S| 3133*59599516SKenneth E. Jansen write(444,*) xnuder(i,1),xnuder(i,2),xnutf(i) 3134*59599516SKenneth E. Jansen enddo 3135*59599516SKenneth E. Jansen call flush(444) 3136*59599516SKenneth E. Jansen endif 3137*59599516SKenneth E. Jansen endif 3138*59599516SKenneth E. Jansen 3139*59599516SKenneth E. Jansen return 3140*59599516SKenneth E. Jansen end 3141*59599516SKenneth E. Jansen subroutine DFWRwfdmc (y, shgl, shp, 3142*59599516SKenneth E. Jansen & iper, ilwork, 3143*59599516SKenneth E. Jansen & nsons, ifath, x, fwr2, fwr3) 3144*59599516SKenneth E. Jansen 3145*59599516SKenneth E. Jansen use pointer_data 3146*59599516SKenneth E. Jansen 3147*59599516SKenneth E. Jansen use quadfilt ! This module gives us shglf(maxtp,nsd,maxsh,ngaussf), 3148*59599516SKenneth E. Jansenc shpf(maxtp,maxsh,ngaussf), and Qwtf(maxtp,ngaussf). 3149*59599516SKenneth E. Jansenc Shpf and shglf are the shape funciotns and their 3150*59599516SKenneth E. Jansenc gradient evaluated using the quadrature rule desired 3151*59599516SKenneth E. Jansenc for computing the dmod. Qwtf contains the weights of the 3152*59599516SKenneth E. Jansenc quad. points. 3153*59599516SKenneth E. Jansen 3154*59599516SKenneth E. Jansen include "common.h" 3155*59599516SKenneth E. Jansen include "mpif.h" 3156*59599516SKenneth E. Jansen include "auxmpi.h" 3157*59599516SKenneth E. Jansen 3158*59599516SKenneth E. Jansenc 3159*59599516SKenneth E. Jansen dimension fres(nshg,33), fwr(nshg), 3160*59599516SKenneth E. Jansen & strnrm(nshg), cdelsq(nshg), 3161*59599516SKenneth E. Jansen & cdelsq2(nshg), 3162*59599516SKenneth E. Jansen & xnum(nshg), xden(nshg), 3163*59599516SKenneth E. Jansen & xmij(nshg,6), xlij(nshg,6), 3164*59599516SKenneth E. Jansen & xnude(nfath,2), xnuder(nfath,2), 3165*59599516SKenneth E. Jansen & ynude(nfath,6), ynuder(nfath,6), 3166*59599516SKenneth E. Jansen & ui(nfath,3), snorm(nfath), 3167*59599516SKenneth E. Jansen & uir(nfath,3), snormr(nfath) 3168*59599516SKenneth E. Jansen dimension xm(nfath,6), xl(nfath,6), 3169*59599516SKenneth E. Jansen & xl1(nfath,6), xl2(nfath,6), 3170*59599516SKenneth E. Jansen & xl1r(nfath,6), xl2r(nfath,6), 3171*59599516SKenneth E. Jansen & xmr(nfath,6), xlr(nfath,6), 3172*59599516SKenneth E. Jansen & nsons(nshg), 3173*59599516SKenneth E. Jansen & strl(numel,ngauss), 3174*59599516SKenneth E. Jansen & y(nshg,5), yold(nshg,5), 3175*59599516SKenneth E. Jansen & ifath(nshg), iper(nshg), 3176*59599516SKenneth E. Jansen & ilwork(nlwork), 3177*59599516SKenneth E. Jansen & x(numnp,3), 3178*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), shp(MAXTOP,maxsh,MAXQPT), 3179*59599516SKenneth E. Jansen & xnutf(nfath), 3180*59599516SKenneth E. Jansen & hfres(nshg,22), 3181*59599516SKenneth E. Jansen & xfac(nshg,5), fwr2(nshg), 3182*59599516SKenneth E. Jansen & fwr3(nshg) 3183*59599516SKenneth E. Jansen 3184*59599516SKenneth E. Jansen real*8 u1 3185*59599516SKenneth E. Jansen 3186*59599516SKenneth E. Jansen character*10 cname 3187*59599516SKenneth E. Jansen character*30 fname1, fname2, fname3, fname4, fname5, fname6 3188*59599516SKenneth E. Jansenc 3189*59599516SKenneth E. Jansen 3190*59599516SKenneth E. Jansenc 3191*59599516SKenneth E. Jansenc 3192*59599516SKenneth E. Jansenc setup the weights for time averaging of cdelsq (now in quadfilt module) 3193*59599516SKenneth E. Jansenc 3194*59599516SKenneth E. Jansen 3195*59599516SKenneth E. Jansen denom=max(1.0d0*(lstep),one) 3196*59599516SKenneth E. Jansen if(dtavei.lt.0) then 3197*59599516SKenneth E. Jansen wcur=one/denom 3198*59599516SKenneth E. Jansen else 3199*59599516SKenneth E. Jansen wcur=dtavei 3200*59599516SKenneth E. Jansen endif 3201*59599516SKenneth E. Jansen whist=1.0-wcur 3202*59599516SKenneth E. Jansen 3203*59599516SKenneth E. Jansen if (myrank .eq. master) then 3204*59599516SKenneth E. Jansen write(*,*)'istep=', istep 3205*59599516SKenneth E. Jansen endif 3206*59599516SKenneth E. Jansen 3207*59599516SKenneth E. Jansen if (istep .eq. 0) then 3208*59599516SKenneth E. Jansen xnd = zero 3209*59599516SKenneth E. Jansen xmodcomp = zero 3210*59599516SKenneth E. Jansen xmcomp = zero 3211*59599516SKenneth E. Jansen xlcomp = zero 3212*59599516SKenneth E. Jansen xl1comp = zero 3213*59599516SKenneth E. Jansen xl2comp = zero 3214*59599516SKenneth E. Jansen ucomp = zero 3215*59599516SKenneth E. Jansen scomp = zero 3216*59599516SKenneth E. Jansen endif 3217*59599516SKenneth E. Jansen 3218*59599516SKenneth E. Jansen 3219*59599516SKenneth E. Jansen fres = zero 3220*59599516SKenneth E. Jansen hfres = zero 3221*59599516SKenneth E. Jansen 3222*59599516SKenneth E. Jansen yold(:,1)=y(:,4) 3223*59599516SKenneth E. Jansen yold(:,2:4)=y(:,1:3) 3224*59599516SKenneth E. Jansen 3225*59599516SKenneth E. Jansenc 3226*59599516SKenneth E. Jansenc hack in an interesting velocity field (uncomment to test dmod) 3227*59599516SKenneth E. Jansenc 3228*59599516SKenneth E. Jansenc yold(:,5) = 1.0 ! Debugging 3229*59599516SKenneth E. Jansenc yold(:,2) = 2.0*x(:,1) - 3.0*x(:,2) 3230*59599516SKenneth E. Jansenc yold(:,3) = 3.0*x(:,1) + 4.0*x(:,2) 3231*59599516SKenneth E. Jansenc yold(:,4) = 4.0*x(:,1) + x(:,2) + x(:,3) 3232*59599516SKenneth E. Jansenc yold(:,1) = Rgas * yold(:,5) ! Necessary to make model suitable 3233*59599516SKenneth E. Jansenc suitable for the 3234*59599516SKenneth E. Jansen 3235*59599516SKenneth E. Jansen do iblk = 1,nelblk 3236*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 3237*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 3238*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 3239*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 3240*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 3241*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 3242*59599516SKenneth E. Jansen inum = iel + npro - 1 3243*59599516SKenneth E. Jansen 3244*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 3245*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 3246*59599516SKenneth E. Jansen 3247*59599516SKenneth E. Jansenc call hfilterBB (yold, x, mien(iblk)%p, hfres, 3248*59599516SKenneth E. Jansenc & shglf(lcsyst,:,1:nshl,:), 3249*59599516SKenneth E. Jansenc & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 3250*59599516SKenneth E. Jansen 3251*59599516SKenneth E. Jansen call hfilterCC (yold, x, mien(iblk)%p, hfres, 3252*59599516SKenneth E. Jansen & shglf(lcsyst,:,1:nshl,:), 3253*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 3254*59599516SKenneth E. Jansen 3255*59599516SKenneth E. Jansen enddo 3256*59599516SKenneth E. Jansen 3257*59599516SKenneth E. Jansen if(numpe>1) call commu (hfres, ilwork, 22, 'in ') 3258*59599516SKenneth E. Jansenc 3259*59599516SKenneth E. Jansenc... account for periodicity in filtered variables 3260*59599516SKenneth E. Jansenc 3261*59599516SKenneth E. Jansen do j = 1,nshg ! Add on-processor slave contribution to masters 3262*59599516SKenneth E. Jansen i = iper(j) 3263*59599516SKenneth E. Jansen if (i .ne. j) then 3264*59599516SKenneth E. Jansen hfres(i,:) = hfres(i,:) + hfres(j,:) 3265*59599516SKenneth E. Jansen endif 3266*59599516SKenneth E. Jansen enddo 3267*59599516SKenneth E. Jansen do j = 1,nshg ! Set on-processor slaves to be the same as masters 3268*59599516SKenneth E. Jansen i = iper(j) 3269*59599516SKenneth E. Jansen if (i .ne. j) then 3270*59599516SKenneth E. Jansen hfres(j,:) = hfres(i,:) 3271*59599516SKenneth E. Jansen endif 3272*59599516SKenneth E. Jansen enddo 3273*59599516SKenneth E. Jansen 3274*59599516SKenneth E. Jansenc... Set off-processor slaves to be the same as their masters 3275*59599516SKenneth E. Jansen 3276*59599516SKenneth E. Jansen if(numpe>1) call commu (hfres, ilwork, 22, 'out') 3277*59599516SKenneth E. Jansen 3278*59599516SKenneth E. Jansen 3279*59599516SKenneth E. Jansen hfres(:,16) = one / hfres(:,16) ! one/(volume filter kernel) 3280*59599516SKenneth E. Jansen 3281*59599516SKenneth E. Jansen do j = 1, 15 3282*59599516SKenneth E. Jansen hfres(:,j) = hfres(:,j) * hfres(:,16) 3283*59599516SKenneth E. Jansen enddo 3284*59599516SKenneth E. Jansen do j = 17, 22 3285*59599516SKenneth E. Jansen hfres(:,j) = hfres(:,j) * hfres(:,16) 3286*59599516SKenneth E. Jansen enddo 3287*59599516SKenneth E. Jansen 3288*59599516SKenneth E. Jansenc... For debugging 3289*59599516SKenneth E. Jansen 3290*59599516SKenneth E. Jansenc hfres(:,1) = 2.0*x(:,1) - 3.0*x(:,2) 3291*59599516SKenneth E. Jansenc hfres(:,2) = 3.0*x(:,1) + 4.0*x(:,2) 3292*59599516SKenneth E. Jansenc hfres(:,3) = 4.0*x(:,1) + x(:,2) + x(:,3) 3293*59599516SKenneth E. Jansen 3294*59599516SKenneth E. Jansenc... Done w/ h-filtering. Begin 2h-filtering. 3295*59599516SKenneth E. Jansen 3296*59599516SKenneth E. Jansen do iblk = 1,nelblk 3297*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 3298*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 3299*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 3300*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 3301*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 3302*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 3303*59599516SKenneth E. Jansen inum = iel + npro - 1 3304*59599516SKenneth E. Jansen 3305*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 3306*59599516SKenneth E. Jansen ngaussf = nintf(lcsyst) 3307*59599516SKenneth E. Jansen 3308*59599516SKenneth E. Jansen call twohfilterBB (yold, x, strl(iel:inum,:), mien(iblk)%p, 3309*59599516SKenneth E. Jansen & fres, hfres, shglf(lcsyst,:,1:nshl,:), 3310*59599516SKenneth E. Jansen & shpf(lcsyst,1:nshl,:),Qwtf(lcsyst,1:ngaussf)) 3311*59599516SKenneth E. Jansen 3312*59599516SKenneth E. Jansen enddo 3313*59599516SKenneth E. Jansenc 3314*59599516SKenneth E. Jansen 3315*59599516SKenneth E. Jansen 3316*59599516SKenneth E. Jansen if(numpe>1) call commu (fres, ilwork, 33, 'in ') 3317*59599516SKenneth E. Jansenc 3318*59599516SKenneth E. Jansenc account for periodicity in filtered variables 3319*59599516SKenneth E. Jansenc 3320*59599516SKenneth E. Jansen do j = 1,nshg 3321*59599516SKenneth E. Jansen i = iper(j) 3322*59599516SKenneth E. Jansen if (i .ne. j) then 3323*59599516SKenneth E. Jansen fres(i,:) = fres(i,:) + fres(j,:) 3324*59599516SKenneth E. Jansen endif 3325*59599516SKenneth E. Jansen enddo 3326*59599516SKenneth E. Jansen 3327*59599516SKenneth E. Jansen do j = 1,nshg 3328*59599516SKenneth E. Jansen i = iper(j) 3329*59599516SKenneth E. Jansen if (i .ne. j) then 3330*59599516SKenneth E. Jansen fres(j,:) = fres(i,:) 3331*59599516SKenneth E. Jansen endif 3332*59599516SKenneth E. Jansen enddo 3333*59599516SKenneth E. Jansen 3334*59599516SKenneth E. Jansen if(numpe>1)then 3335*59599516SKenneth E. Jansen call commu (fres, ilwork, 33, 'out') 3336*59599516SKenneth E. Jansen endif 3337*59599516SKenneth E. Jansen 3338*59599516SKenneth E. Jansen fres(:,22) = one / fres(:,22) 3339*59599516SKenneth E. Jansen do j = 1,21 3340*59599516SKenneth E. Jansen fres(:,j) = fres(:,j) * fres(:,22) 3341*59599516SKenneth E. Jansen enddo 3342*59599516SKenneth E. Jansen do j = 23,33 3343*59599516SKenneth E. Jansen fres(:,j) = fres(:,j) * fres(:,22) 3344*59599516SKenneth E. Jansen enddo 3345*59599516SKenneth E. Jansen 3346*59599516SKenneth E. Jansen 3347*59599516SKenneth E. Jansen do iblk = 1,nelblk 3348*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 3349*59599516SKenneth E. Jansen iel = lcblk(1,iblk) !Element number where this block begins 3350*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 3351*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 3352*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 3353*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 3354*59599516SKenneth E. Jansen inum = iel + npro - 1 3355*59599516SKenneth E. Jansen 3356*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 3357*59599516SKenneth E. Jansen 3358*59599516SKenneth E. Jansen call getstrl (yold, x, mien(iblk)%p, 3359*59599516SKenneth E. Jansen & strl(iel:inum,:), shgl(lcsyst,:,1:nshl,:), 3360*59599516SKenneth E. Jansen & shp(lcsyst,1:nshl,:)) 3361*59599516SKenneth E. Jansen 3362*59599516SKenneth E. Jansen enddo 3363*59599516SKenneth E. Jansen 3364*59599516SKenneth E. Jansenc 3365*59599516SKenneth E. Jansenc... Obtain the hat-tilde strain rate norm at the nodes 3366*59599516SKenneth E. Jansenc 3367*59599516SKenneth E. Jansen 3368*59599516SKenneth E. Jansen strnrm = sqrt( 3369*59599516SKenneth E. Jansen & two * (fres(:,10)**2 + fres(:,11)**2 + fres(:,12)**2) 3370*59599516SKenneth E. Jansen & + four * ( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) ) 3371*59599516SKenneth E. Jansen 3372*59599516SKenneth E. Jansenc fwr = fwr1 * strnrm 3373*59599516SKenneth E. Jansen 3374*59599516SKenneth E. Jansen fwr = fwr1 * fwr3 * strnrm 3375*59599516SKenneth E. Jansen 3376*59599516SKenneth E. Jansen xmij(:,1) = -fwr 3377*59599516SKenneth E. Jansen & * fres(:,10) + fres(:,16) 3378*59599516SKenneth E. Jansen xmij(:,2) = -fwr 3379*59599516SKenneth E. Jansen & * fres(:,11) + fres(:,17) 3380*59599516SKenneth E. Jansen xmij(:,3) = -fwr 3381*59599516SKenneth E. Jansen & * fres(:,12) + fres(:,18) 3382*59599516SKenneth E. Jansen 3383*59599516SKenneth E. Jansen xmij(:,4) = -fwr * fres(:,13) + fres(:,19) 3384*59599516SKenneth E. Jansen xmij(:,5) = -fwr * fres(:,14) + fres(:,20) 3385*59599516SKenneth E. Jansen xmij(:,6) = -fwr * fres(:,15) + fres(:,21) 3386*59599516SKenneth E. Jansen 3387*59599516SKenneth E. Jansen 3388*59599516SKenneth E. Jansen xlij(:,1) = fres(:,4) - fres(:,1) * fres(:,1) 3389*59599516SKenneth E. Jansen xlij(:,2) = fres(:,5) - fres(:,2) * fres(:,2) 3390*59599516SKenneth E. Jansen xlij(:,3) = fres(:,6) - fres(:,3) * fres(:,3) 3391*59599516SKenneth E. Jansen xlij(:,4) = fres(:,7) - fres(:,1) * fres(:,2) 3392*59599516SKenneth E. Jansen xlij(:,5) = fres(:,8) - fres(:,1) * fres(:,3) 3393*59599516SKenneth E. Jansen xlij(:,6) = fres(:,9) - fres(:,2) * fres(:,3) 3394*59599516SKenneth E. Jansen 3395*59599516SKenneth E. Jansen xnum = xlij(:,1) * xmij(:,1) + xlij(:,2) * xmij(:,2) 3396*59599516SKenneth E. Jansen & + xlij(:,3) * xmij(:,3) 3397*59599516SKenneth E. Jansen & + two * (xlij(:,4) * xmij(:,4) + xlij(:,5) * xmij(:,5) 3398*59599516SKenneth E. Jansen & + xlij(:,6) * xmij(:,6)) 3399*59599516SKenneth E. Jansen xden = xmij(:,1) * xmij(:,1) + xmij(:,2) * xmij(:,2) 3400*59599516SKenneth E. Jansen & + xmij(:,3) * xmij(:,3) 3401*59599516SKenneth E. Jansen & + two * (xmij(:,4) * xmij(:,4) + xmij(:,5) * xmij(:,5) 3402*59599516SKenneth E. Jansen & + xmij(:,6) * xmij(:,6)) 3403*59599516SKenneth E. Jansen xden = two * xden 3404*59599516SKenneth E. Jansen 3405*59599516SKenneth E. Jansenc... For collectection of statistics on dyn. model components 3406*59599516SKenneth E. Jansen 3407*59599516SKenneth E. Jansen xfac(:,1) = strnrm*strnrm*( fres(:,10)**2 + fres(:,11)**2 + 3408*59599516SKenneth E. Jansen & fres(:,12)**2 3409*59599516SKenneth E. Jansen & + two*( fres(:,13)**2 + fres(:,14)**2 + fres(:,15)**2 ) ) 3410*59599516SKenneth E. Jansen 3411*59599516SKenneth E. Jansen xfac(:,2) = strnrm*( xlij(:,1)*fres(:,10) + xlij(:,2)*fres(:,11) 3412*59599516SKenneth E. Jansen & + xlij(:,3)*fres(:,12) + 3413*59599516SKenneth E. Jansen & two*(xlij(:,4)*fres(:,13) + xlij(:,5)*fres(:,14) + 3414*59599516SKenneth E. Jansen & xlij(:,6)*fres(:,15)) ) 3415*59599516SKenneth E. Jansen 3416*59599516SKenneth E. Jansen xfac(:,3) = strnrm*( fres(:,10)*fres(:,16) + fres(:,11)*fres(:,17) 3417*59599516SKenneth E. Jansen & + fres(:,12)*fres(:,18) + 3418*59599516SKenneth E. Jansen & two*(fres(:,13)*fres(:,19) + fres(:,14)*fres(:,20) + 3419*59599516SKenneth E. Jansen & fres(:,15)*fres(:,21)) ) 3420*59599516SKenneth E. Jansen 3421*59599516SKenneth E. Jansen xfac(:,4) = xlij(:,1)*fres(:,16) + xlij(:,2)*fres(:,17) 3422*59599516SKenneth E. Jansen & + xlij(:,3)*fres(:,18) + 3423*59599516SKenneth E. Jansen & two*(xlij(:,4)*fres(:,19) + xlij(:,5)*fres(:,20) + 3424*59599516SKenneth E. Jansen & xlij(:,6)*fres(:,21)) 3425*59599516SKenneth E. Jansen 3426*59599516SKenneth E. Jansen xfac(:,5) = fres(:,16)*fres(:,16) + fres(:,17)*fres(:,17) 3427*59599516SKenneth E. Jansen & + fres(:,18)*fres(:,18) + 3428*59599516SKenneth E. Jansen & two*(fres(:,19)*fres(:,19) + fres(:,20)*fres(:,20) + 3429*59599516SKenneth E. Jansen & fres(:,21)*fres(:,21)) 3430*59599516SKenneth E. Jansen 3431*59599516SKenneth E. Jansenc zero on processor periodic nodes so that they will not be added twice 3432*59599516SKenneth E. Jansen do j = 1,numnp 3433*59599516SKenneth E. Jansen i = iper(j) 3434*59599516SKenneth E. Jansen if (i .ne. j) then 3435*59599516SKenneth E. Jansen xnum(j) = zero 3436*59599516SKenneth E. Jansen xden(j) = zero 3437*59599516SKenneth E. Jansen xfac(j,:) = zero 3438*59599516SKenneth E. Jansen xmij(j,:) = zero 3439*59599516SKenneth E. Jansen xlij(j,:) = zero 3440*59599516SKenneth E. Jansen fres(j,:) = zero 3441*59599516SKenneth E. Jansen strnrm(j) = zero 3442*59599516SKenneth E. Jansen endif 3443*59599516SKenneth E. Jansen enddo 3444*59599516SKenneth E. Jansen 3445*59599516SKenneth E. Jansen if (numpe.gt.1) then 3446*59599516SKenneth E. Jansen 3447*59599516SKenneth E. Jansen numtask = ilwork(1) 3448*59599516SKenneth E. Jansen itkbeg = 1 3449*59599516SKenneth E. Jansen 3450*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 3451*59599516SKenneth E. Jansen do itask = 1, numtask 3452*59599516SKenneth E. Jansen 3453*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 3454*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 3455*59599516SKenneth E. Jansen 3456*59599516SKenneth E. Jansen if (iacc .eq. 0) then 3457*59599516SKenneth E. Jansen do is = 1,numseg 3458*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 3459*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 3460*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 3461*59599516SKenneth E. Jansen xnum(isgbeg:isgend) = zero 3462*59599516SKenneth E. Jansen xden(isgbeg:isgend) = zero 3463*59599516SKenneth E. Jansen strnrm(isgbeg:isgend) = zero 3464*59599516SKenneth E. Jansen xfac(isgbeg:isgend,:) = zero 3465*59599516SKenneth E. Jansen xmij(isgbeg:isgend,:) = zero 3466*59599516SKenneth E. Jansen xlij(isgbeg:isgend,:) = zero 3467*59599516SKenneth E. Jansen fres(isgbeg:isgend,:) = zero 3468*59599516SKenneth E. Jansen enddo 3469*59599516SKenneth E. Jansen endif 3470*59599516SKenneth E. Jansen 3471*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 3472*59599516SKenneth E. Jansen 3473*59599516SKenneth E. Jansen enddo 3474*59599516SKenneth E. Jansen 3475*59599516SKenneth E. Jansen endif 3476*59599516SKenneth E. Jansenc 3477*59599516SKenneth E. Jansenc Description of arrays. Each processor has an array of length equal 3478*59599516SKenneth E. Jansenc to the total number of fathers times 2 xnude(nfathers,2). One to collect 3479*59599516SKenneth E. Jansenc the numerator and one to collect the denominator. There is also an array 3480*59599516SKenneth E. Jansenc of length nshg on each processor which tells the father number of each 3481*59599516SKenneth E. Jansenc on processor node, ifath(nnshg). Finally, there is an arry of length 3482*59599516SKenneth E. Jansenc nfathers to tell the total (on all processors combined) number of sons 3483*59599516SKenneth E. Jansenc for each father. 3484*59599516SKenneth E. Jansenc 3485*59599516SKenneth E. Jansenc Now loop over nodes and accumlate the numerator and the denominator 3486*59599516SKenneth E. Jansenc to the father nodes. Only on processor addition at this point. 3487*59599516SKenneth E. Jansenc Note that serrogate fathers are collect some for the case where some 3488*59599516SKenneth E. Jansenc sons are on another processor 3489*59599516SKenneth E. Jansenc 3490*59599516SKenneth E. Jansen xnude = zero 3491*59599516SKenneth E. Jansen ynude = zero 3492*59599516SKenneth E. Jansen xm = zero 3493*59599516SKenneth E. Jansen xl = zero 3494*59599516SKenneth E. Jansen xl1 = zero 3495*59599516SKenneth E. Jansen xl2 = zero 3496*59599516SKenneth E. Jansen ui = zero 3497*59599516SKenneth E. Jansen snorm = zero 3498*59599516SKenneth E. Jansen 3499*59599516SKenneth E. Jansen do i = 1,nshg 3500*59599516SKenneth E. Jansen xnude(ifath(i),1) = xnude(ifath(i),1) + xnum(i) 3501*59599516SKenneth E. Jansen xnude(ifath(i),2) = xnude(ifath(i),2) + xden(i) 3502*59599516SKenneth E. Jansen 3503*59599516SKenneth E. Jansen ynude(ifath(i),1) = ynude(ifath(i),1) + xfac(i,1) 3504*59599516SKenneth E. Jansen ynude(ifath(i),2) = ynude(ifath(i),2) + xfac(i,2) 3505*59599516SKenneth E. Jansen ynude(ifath(i),3) = ynude(ifath(i),3) + xfac(i,3) 3506*59599516SKenneth E. Jansen ynude(ifath(i),4) = ynude(ifath(i),4) + xfac(i,4) 3507*59599516SKenneth E. Jansen ynude(ifath(i),5) = ynude(ifath(i),5) + xfac(i,5) 3508*59599516SKenneth E. Jansen 3509*59599516SKenneth E. Jansen xm(ifath(i),1) = xm(ifath(i),1) + xmij(i,1) 3510*59599516SKenneth E. Jansen xm(ifath(i),2) = xm(ifath(i),2) + xmij(i,2) 3511*59599516SKenneth E. Jansen xm(ifath(i),3) = xm(ifath(i),3) + xmij(i,3) 3512*59599516SKenneth E. Jansen xm(ifath(i),4) = xm(ifath(i),4) + xmij(i,4) 3513*59599516SKenneth E. Jansen xm(ifath(i),5) = xm(ifath(i),5) + xmij(i,5) 3514*59599516SKenneth E. Jansen xm(ifath(i),6) = xm(ifath(i),6) + xmij(i,6) 3515*59599516SKenneth E. Jansen 3516*59599516SKenneth E. Jansen xl(ifath(i),1) = xl(ifath(i),1) + xlij(i,1) 3517*59599516SKenneth E. Jansen xl(ifath(i),2) = xl(ifath(i),2) + xlij(i,2) 3518*59599516SKenneth E. Jansen xl(ifath(i),3) = xl(ifath(i),3) + xlij(i,3) 3519*59599516SKenneth E. Jansen xl(ifath(i),4) = xl(ifath(i),4) + xlij(i,4) 3520*59599516SKenneth E. Jansen xl(ifath(i),5) = xl(ifath(i),5) + xlij(i,5) 3521*59599516SKenneth E. Jansen xl(ifath(i),6) = xl(ifath(i),6) + xlij(i,6) 3522*59599516SKenneth E. Jansen 3523*59599516SKenneth E. Jansen xl1(ifath(i),1) = xl1(ifath(i),1) + fres(i,4) 3524*59599516SKenneth E. Jansen xl1(ifath(i),2) = xl1(ifath(i),2) + fres(i,5) 3525*59599516SKenneth E. Jansen xl1(ifath(i),3) = xl1(ifath(i),3) + fres(i,6) 3526*59599516SKenneth E. Jansen xl1(ifath(i),4) = xl1(ifath(i),4) + fres(i,7) 3527*59599516SKenneth E. Jansen xl1(ifath(i),5) = xl1(ifath(i),5) + fres(i,8) 3528*59599516SKenneth E. Jansen xl1(ifath(i),6) = xl1(ifath(i),6) + fres(i,9) 3529*59599516SKenneth E. Jansen 3530*59599516SKenneth E. Jansen xl2(ifath(i),1) = xl2(ifath(i),1) + fres(i,1)*fres(i,1) 3531*59599516SKenneth E. Jansen xl2(ifath(i),2) = xl2(ifath(i),2) + fres(i,2)*fres(i,2) 3532*59599516SKenneth E. Jansen xl2(ifath(i),3) = xl2(ifath(i),3) + fres(i,3)*fres(i,3) 3533*59599516SKenneth E. Jansen xl2(ifath(i),4) = xl2(ifath(i),4) + fres(i,1)*fres(i,2) 3534*59599516SKenneth E. Jansen xl2(ifath(i),5) = xl2(ifath(i),5) + fres(i,1)*fres(i,3) 3535*59599516SKenneth E. Jansen xl2(ifath(i),6) = xl2(ifath(i),6) + fres(i,2)*fres(i,3) 3536*59599516SKenneth E. Jansen 3537*59599516SKenneth E. Jansen ui(ifath(i),1) = ui(ifath(i),1) + fres(i,1) 3538*59599516SKenneth E. Jansen ui(ifath(i),2) = ui(ifath(i),2) + fres(i,2) 3539*59599516SKenneth E. Jansen ui(ifath(i),3) = ui(ifath(i),3) + fres(i,3) 3540*59599516SKenneth E. Jansen 3541*59599516SKenneth E. Jansen snorm(ifath(i)) = snorm(ifath(i)) + strnrm(i) 3542*59599516SKenneth E. Jansen 3543*59599516SKenneth E. Jansen enddo 3544*59599516SKenneth E. Jansen 3545*59599516SKenneth E. Jansenc 3546*59599516SKenneth E. Jansenc Now the true fathers and serrogates combine results and update 3547*59599516SKenneth E. Jansenc each other. 3548*59599516SKenneth E. Jansenc 3549*59599516SKenneth E. Jansen if(numpe .gt. 1)then 3550*59599516SKenneth E. Jansen call drvAllreduce(xnude, xnuder,2*nfath) 3551*59599516SKenneth E. Jansen call drvAllreduce(ynude, ynuder,6*nfath) 3552*59599516SKenneth E. Jansen call drvAllreduce(xm, xmr,6*nfath) 3553*59599516SKenneth E. Jansen call drvAllreduce(xl, xlr,6*nfath) 3554*59599516SKenneth E. Jansen call drvAllreduce(xl1, xl1r,6*nfath) 3555*59599516SKenneth E. Jansen call drvAllreduce(xl2, xl2r,6*nfath) 3556*59599516SKenneth E. Jansen call drvAllreduce(ui, uir,3*nfath) 3557*59599516SKenneth E. Jansen call drvAllreduce(snorm, snormr,nfath) 3558*59599516SKenneth E. Jansen 3559*59599516SKenneth E. Jansen do i = 1, nfath 3560*59599516SKenneth E. Jansen ynuder(i,6) = ( ynuder(i,4) - fwr1*ynuder(i,2) ) / 3561*59599516SKenneth E. Jansen & ( two*ynuder(i,5) - four*fwr1*ynuder(i,3) 3562*59599516SKenneth E. Jansen & + two*fwr1*fwr1*ynuder(i,1) ) 3563*59599516SKenneth E. Jansen enddo 3564*59599516SKenneth E. Jansen 3565*59599516SKenneth E. Jansen cdelsq2(:) = ynuder(ifath(:),6) ! For comparison w/ cdelsq 3566*59599516SKenneth E. Jansenc 3567*59599516SKenneth E. Jansenc xnude is the sum of the sons for each father on this processor 3568*59599516SKenneth E. Jansenc 3569*59599516SKenneth E. Jansenc xnuder is the sum of the sons for each father on all processor combined 3570*59599516SKenneth E. Jansenc (the same as if we had not partitioned the mesh for each processor) 3571*59599516SKenneth E. Jansenc 3572*59599516SKenneth E. Jansenc For each father we have precomputed the number of sons (including 3573*59599516SKenneth E. Jansenc the sons off processor). 3574*59599516SKenneth E. Jansenc 3575*59599516SKenneth E. Jansenc Now divide by number of sons to get the average (not really necessary 3576*59599516SKenneth E. Jansenc for dynamic model since ratio will cancel nsons at each father) 3577*59599516SKenneth E. Jansenc 3578*59599516SKenneth E. Jansen xnuder(:,1) = xnuder(:,1) / nsons(:) 3579*59599516SKenneth E. Jansen xnuder(:,2) = xnuder(:,2) / nsons(:) 3580*59599516SKenneth E. Jansen 3581*59599516SKenneth E. Jansen do m = 1, 5 3582*59599516SKenneth E. Jansen ynuder(:,m) = ynuder(:,m)/nsons(:) 3583*59599516SKenneth E. Jansen enddo 3584*59599516SKenneth E. Jansen do m = 1,6 3585*59599516SKenneth E. Jansen xmr(:,m) = xmr(:,m)/nsons(:) 3586*59599516SKenneth E. Jansen xlr(:,m) = xlr(:,m)/nsons(:) 3587*59599516SKenneth E. Jansen xl1r(:,m) = xl1r(:,m)/nsons(:) 3588*59599516SKenneth E. Jansen xl2r(:,m) = xl2r(:,m)/nsons(:) 3589*59599516SKenneth E. Jansen enddo 3590*59599516SKenneth E. Jansen 3591*59599516SKenneth E. Jansen uir(:,1) = uir(:,1)/nsons(:) 3592*59599516SKenneth E. Jansen uir(:,2) = uir(:,2)/nsons(:) 3593*59599516SKenneth E. Jansen uir(:,3) = uir(:,3)/nsons(:) 3594*59599516SKenneth E. Jansen 3595*59599516SKenneth E. Jansen snormr(:) = snormr(:)/nsons(:) 3596*59599516SKenneth E. Jansen 3597*59599516SKenneth E. Jansenc 3598*59599516SKenneth E. Jansencc the next line is c \Delta^2 3599*59599516SKenneth E. Jansencc 3600*59599516SKenneth E. Jansencc xnuder(:,1) = xnuder(:,1) / (xnuder(:,2) + 1.d-09) 3601*59599516SKenneth E. Jansencc do i = 1,nshg 3602*59599516SKenneth E. Jansencc cdelsq(i) = xnuder(ifath(i),1) 3603*59599516SKenneth E. Jansencc enddo 3604*59599516SKenneth E. Jansen 3605*59599516SKenneth E. Jansen numNden(:,1) = whist*numNden(:,1)+wcur*xnuder(ifath(:),1) 3606*59599516SKenneth E. Jansen numNden(:,2) = whist*numNden(:,2)+wcur*xnuder(ifath(:),2) 3607*59599516SKenneth E. Jansen cdelsq(:) = numNden(:,1) / (numNden(:,2) + 1.d-09) 3608*59599516SKenneth E. Jansen 3609*59599516SKenneth E. Jansenc cdelsq(:) = xnuder(ifath(:),1)/(xnuder(ifath(:),2)+1.d-09) 3610*59599516SKenneth E. Jansen 3611*59599516SKenneth E. Jansen xnd(:,1) = xnd(:,1) + xnuder(:,1) 3612*59599516SKenneth E. Jansen xnd(:,2) = xnd(:,2) + xnuder(:,2) 3613*59599516SKenneth E. Jansen 3614*59599516SKenneth E. Jansen xmodcomp(:,1) = xmodcomp(:,1)+ynuder(:,1) 3615*59599516SKenneth E. Jansen xmodcomp(:,2) = xmodcomp(:,2)+ynuder(:,2) 3616*59599516SKenneth E. Jansen xmodcomp(:,3) = xmodcomp(:,3)+ynuder(:,3) 3617*59599516SKenneth E. Jansen xmodcomp(:,4) = xmodcomp(:,4)+ynuder(:,4) 3618*59599516SKenneth E. Jansen xmodcomp(:,5) = xmodcomp(:,5)+ynuder(:,5) 3619*59599516SKenneth E. Jansen 3620*59599516SKenneth E. Jansen xmcomp(:,:) = xmcomp(:,:)+xmr(:,:) 3621*59599516SKenneth E. Jansen xlcomp(:,:) = xlcomp(:,:)+xlr(:,:) 3622*59599516SKenneth E. Jansen 3623*59599516SKenneth E. Jansen xl1comp(:,:) = xl1comp(:,:)+xl1r(:,:) 3624*59599516SKenneth E. Jansen xl2comp(:,:) = xl2comp(:,:)+xl2r(:,:) 3625*59599516SKenneth E. Jansen 3626*59599516SKenneth E. Jansen ucomp(:,:) = ucomp(:,:)+uir(:,:) 3627*59599516SKenneth E. Jansen u1 = uir(32,1) 3628*59599516SKenneth E. Jansen scomp(:) = scomp(:)+snormr(:) 3629*59599516SKenneth E. Jansen 3630*59599516SKenneth E. Jansen else 3631*59599516SKenneth E. Jansen 3632*59599516SKenneth E. Jansen xnude(:,1) = xnude(:,1)/nsons(:) 3633*59599516SKenneth E. Jansen xnude(:,2) = xnude(:,2)/nsons(:) 3634*59599516SKenneth E. Jansen 3635*59599516SKenneth E. Jansen do m = 1, 5 3636*59599516SKenneth E. Jansen ynude(:,m) = ynude(:,m)/nsons(:) 3637*59599516SKenneth E. Jansen enddo 3638*59599516SKenneth E. Jansen do m = 1,6 3639*59599516SKenneth E. Jansen xm(:,m) = xm(:,m)/nsons(:) 3640*59599516SKenneth E. Jansen xl(:,m) = xl(:,m)/nsons(:) 3641*59599516SKenneth E. Jansen xl1(:,m) = xl1(:,m)/nsons(:) 3642*59599516SKenneth E. Jansen xl2(:,m) = xl2(:,m)/nsons(:) 3643*59599516SKenneth E. Jansen enddo 3644*59599516SKenneth E. Jansen 3645*59599516SKenneth E. Jansen ui(:,1) = ui(:,1)/nsons(:) 3646*59599516SKenneth E. Jansen ui(:,2) = ui(:,2)/nsons(:) 3647*59599516SKenneth E. Jansen ui(:,3) = ui(:,3)/nsons(:) 3648*59599516SKenneth E. Jansen 3649*59599516SKenneth E. Jansen snorm(:) = snorm(:)/nsons(:) 3650*59599516SKenneth E. Jansenc 3651*59599516SKenneth E. Jansenc the next line is c \Delta^2, not nu_T but we want to save the 3652*59599516SKenneth E. Jansenc memory 3653*59599516SKenneth E. Jansenc 3654*59599516SKenneth E. Jansen 3655*59599516SKenneth E. Jansencc xnude(:,1) = xnude(:,1) / (xnude(:,2) + 1.d-09) 3656*59599516SKenneth E. Jansencc do i = 1,nshg 3657*59599516SKenneth E. Jansencc cdelsq(i) = xnude(ifath(i),1) 3658*59599516SKenneth E. Jansencc enddo 3659*59599516SKenneth E. Jansencc endif 3660*59599516SKenneth E. Jansen 3661*59599516SKenneth E. Jansen do i = 1, nfath 3662*59599516SKenneth E. Jansen ynude(i,6) = ( ynude(i,4) - fwr1*ynude(i,2) ) / 3663*59599516SKenneth E. Jansen & ( two*ynude(i,5) - four*fwr1*ynude(i,3) 3664*59599516SKenneth E. Jansen & + fwr1*fwr1*ynude(i,1) ) 3665*59599516SKenneth E. Jansen enddo 3666*59599516SKenneth E. Jansen 3667*59599516SKenneth E. Jansen numNden(:,1) = whist*numNden(:,1)+wcur*xnude(ifath(:),1) 3668*59599516SKenneth E. Jansen numNden(:,2) = whist*numNden(:,2)+wcur*xnude(ifath(:),2) 3669*59599516SKenneth E. Jansen 3670*59599516SKenneth E. Jansen xnd(:,1) = xnd(:,1)+xnude(:,1) 3671*59599516SKenneth E. Jansen xnd(:,2) = xnd(:,2)+xnude(:,2) 3672*59599516SKenneth E. Jansen 3673*59599516SKenneth E. Jansen cdelsq(:) = numNden(:,1) / (numNden(:,2)) ! + 1.d-09) 3674*59599516SKenneth E. Jansen 3675*59599516SKenneth E. Jansenc cdelsq(:) = xnude(ifath(:),1)/(xnude(ifath(:),2))!+1.d-09) 3676*59599516SKenneth E. Jansen 3677*59599516SKenneth E. Jansen 3678*59599516SKenneth E. Jansen cdelsq2(:) = ynude(ifath(:),6) ! For comparison w/ cdelsq 3679*59599516SKenneth E. Jansen 3680*59599516SKenneth E. Jansen xmodcomp(:,1) = xmodcomp(:,1)+ynude(:,1) 3681*59599516SKenneth E. Jansen xmodcomp(:,2) = xmodcomp(:,2)+ynude(:,2) 3682*59599516SKenneth E. Jansen xmodcomp(:,3) = xmodcomp(:,3)+ynude(:,3) 3683*59599516SKenneth E. Jansen xmodcomp(:,4) = xmodcomp(:,4)+ynude(:,4) 3684*59599516SKenneth E. Jansen xmodcomp(:,5) = xmodcomp(:,5)+ynude(:,5) 3685*59599516SKenneth E. Jansen 3686*59599516SKenneth E. Jansen xmcomp(:,:) = xmcomp(:,:)+xm(:,:) 3687*59599516SKenneth E. Jansen xlcomp(:,:) = xlcomp(:,:)+xl(:,:) 3688*59599516SKenneth E. Jansen 3689*59599516SKenneth E. Jansen xl1comp(:,:) = xl1comp(:,:)+xl1(:,:) 3690*59599516SKenneth E. Jansen xl2comp(:,:) = xl2comp(:,:)+xl2(:,:) 3691*59599516SKenneth E. Jansen 3692*59599516SKenneth E. Jansen ucomp(:,:) = ucomp(:,:)+ui(:,:) 3693*59599516SKenneth E. Jansen u1 = ui(32,1) 3694*59599516SKenneth E. Jansen scomp(:) = scomp(:)+snorm(:) 3695*59599516SKenneth E. Jansen 3696*59599516SKenneth E. Jansen endif 3697*59599516SKenneth E. Jansen 3698*59599516SKenneth E. Jansen 3699*59599516SKenneth E. Jansenc do i = 1, nfath 3700*59599516SKenneth E. Jansenc xmodcomp(i,:) = xmodcomp(i,:)/nsons(i) 3701*59599516SKenneth E. Jansenc xmcomp(i,:) = xmcomp(i,:)/nsons(i) 3702*59599516SKenneth E. Jansenc xlcomp(i,:) = xlcomp(i,:)/nsons(i) 3703*59599516SKenneth E. Jansenc xl2comp(i,:) = xl2comp(i,:)/nsons(i) 3704*59599516SKenneth E. Jansenc xl1comp(i,:) = xl1comp(i,:)/nsons(i) 3705*59599516SKenneth E. Jansenc xnd(i,:) = xnd(i,:)/nsons(i) 3706*59599516SKenneth E. Jansenc scomp(i) = scomp(i)/nsons(i) 3707*59599516SKenneth E. Jansenc ucomp(i,:) = ucomp(i,:)/nsons(i) 3708*59599516SKenneth E. Jansenc enddo 3709*59599516SKenneth E. Jansen 3710*59599516SKenneth E. Jansen if ( istep .eq. (nstep(1)-1) ) then 3711*59599516SKenneth E. Jansen if ( myrank .eq. master) then 3712*59599516SKenneth E. Jansen 3713*59599516SKenneth E. Jansen do i = 1, nfath 3714*59599516SKenneth E. Jansen write(365,*)xmodcomp(i,1),xmodcomp(i,2),xmodcomp(i,3), 3715*59599516SKenneth E. Jansen & xmodcomp(i,4),xmodcomp(i,5) 3716*59599516SKenneth E. Jansen 3717*59599516SKenneth E. Jansen write(366,*)xmcomp(i,1),xmcomp(i,2),xmcomp(i,3) 3718*59599516SKenneth E. Jansen write(367,*)xmcomp(i,4),xmcomp(i,5),xmcomp(i,6) 3719*59599516SKenneth E. Jansen 3720*59599516SKenneth E. Jansen write(368,*)xlcomp(i,1),xlcomp(i,2),xlcomp(i,3) 3721*59599516SKenneth E. Jansen write(369,*)xlcomp(i,4),xlcomp(i,5),xlcomp(i,6) 3722*59599516SKenneth E. Jansen 3723*59599516SKenneth E. Jansen write(370,*)xl1comp(i,1),xl1comp(i,2),xl1comp(i,3) 3724*59599516SKenneth E. Jansen write(371,*)xl1comp(i,4),xl1comp(i,5),xl1comp(i,6) 3725*59599516SKenneth E. Jansen 3726*59599516SKenneth E. Jansen write(372,*)xl2comp(i,1),xl2comp(i,2),xl2comp(i,3) 3727*59599516SKenneth E. Jansen write(373,*)xl2comp(i,4),xl2comp(i,5),xl2comp(i,6) 3728*59599516SKenneth E. Jansen 3729*59599516SKenneth E. Jansen write(374,*)xnd(i,1),xnd(i,2),scomp(i) 3730*59599516SKenneth E. Jansen write(375,*)ucomp(i,1),ucomp(i,2),ucomp(i,3) 3731*59599516SKenneth E. Jansen 3732*59599516SKenneth E. Jansenc write(*,*)'uit uic=', ucomp(32,1),u1 3733*59599516SKenneth E. Jansen enddo 3734*59599516SKenneth E. Jansen 3735*59599516SKenneth E. Jansen 3736*59599516SKenneth E. Jansen call flush(365) 3737*59599516SKenneth E. Jansen call flush(366) 3738*59599516SKenneth E. Jansen call flush(367) 3739*59599516SKenneth E. Jansen call flush(368) 3740*59599516SKenneth E. Jansen call flush(369) 3741*59599516SKenneth E. Jansen call flush(370) 3742*59599516SKenneth E. Jansen call flush(371) 3743*59599516SKenneth E. Jansen call flush(372) 3744*59599516SKenneth E. Jansen call flush(373) 3745*59599516SKenneth E. Jansen call flush(374) 3746*59599516SKenneth E. Jansen call flush(375) 3747*59599516SKenneth E. Jansen 3748*59599516SKenneth E. Jansenc if (myrank .eq. master) then 3749*59599516SKenneth E. Jansenc write(*,*)'uit uic=', ucomp(32,1),u1 3750*59599516SKenneth E. Jansenc endif 3751*59599516SKenneth E. Jansen 3752*59599516SKenneth E. Jansen 3753*59599516SKenneth E. Jansenc close(852) 3754*59599516SKenneth E. Jansenc close(853) 3755*59599516SKenneth E. Jansenc close(854) 3756*59599516SKenneth E. Jansen 3757*59599516SKenneth E. Jansen endif 3758*59599516SKenneth E. Jansen endif 3759*59599516SKenneth E. Jansen 3760*59599516SKenneth E. Jansen if (myrank .eq. master) then 3761*59599516SKenneth E. Jansen write(*,*)'uit uic=', ucomp(32,1),u1 3762*59599516SKenneth E. Jansen endif 3763*59599516SKenneth E. Jansen 3764*59599516SKenneth E. Jansen 3765*59599516SKenneth E. Jansen 555 format(e14.7,4(2x,e14.7)) 3766*59599516SKenneth E. Jansen 556 format(e14.7,5(2x,e14.7)) 3767*59599516SKenneth E. Jansen 3768*59599516SKenneth E. Jansenc close(849) 3769*59599516SKenneth E. Jansenc close(850) 3770*59599516SKenneth E. Jansenc close(851) 3771*59599516SKenneth E. Jansenc close(852) 3772*59599516SKenneth E. Jansenc close(853) 3773*59599516SKenneth E. Jansenc close(854) 3774*59599516SKenneth E. Jansen 3775*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 3776*59599516SKenneth E. Jansen tmp1 = MINVAL(cdelsq) 3777*59599516SKenneth E. Jansen tmp2 = MAXVAL(cdelsq) 3778*59599516SKenneth E. Jansen if(numpe>1) then 3779*59599516SKenneth E. Jansen call MPI_REDUCE (tmp1, tmp3, 1,MPI_DOUBLE_PRECISION, 3780*59599516SKenneth E. Jansen & MPI_MIN, master, MPI_COMM_WORLD, ierr) 3781*59599516SKenneth E. Jansen call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION, 3782*59599516SKenneth E. Jansen & MPI_MAX, master, MPI_COMM_WORLD, ierr) 3783*59599516SKenneth E. Jansen tmp1=tmp3 3784*59599516SKenneth E. Jansen tmp2=tmp4 3785*59599516SKenneth E. Jansen endif 3786*59599516SKenneth E. Jansen if (myrank .EQ. master) then !print CDelta^2 range 3787*59599516SKenneth E. Jansen write(34,*)lstep,tmp1,tmp2 3788*59599516SKenneth E. Jansen call flush(34) 3789*59599516SKenneth E. Jansen endif 3790*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 3791*59599516SKenneth E. Jansen 3792*59599516SKenneth E. Jansen if (myrank .eq. master) then 3793*59599516SKenneth E. Jansen write(*,*) 'cdelsq=', cdelsq(1),cdelsq(2) 3794*59599516SKenneth E. Jansen write(*,*) 'cdelsq=', cdelsq2(1),cdelsq2(2) 3795*59599516SKenneth E. Jansen write(22,*) lstep, cdelsq(1) 3796*59599516SKenneth E. Jansen call flush(22) 3797*59599516SKenneth E. Jansen endif 3798*59599516SKenneth E. Jansen 3799*59599516SKenneth E. Jansen do iblk = 1,nelblk 3800*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 3801*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 3802*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 3803*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 3804*59599516SKenneth E. Jansen inum = iel + npro - 1 3805*59599516SKenneth E. Jansen 3806*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 3807*59599516SKenneth E. Jansen 3808*59599516SKenneth E. Jansen call scatnu (mien(iblk)%p, strl(iel:inum,:), 3809*59599516SKenneth E. Jansen & mxmudmi(iblk)%p,cdelsq,shp(lcsyst,1:nshl,:)) 3810*59599516SKenneth E. Jansen enddo 3811*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 3812*59599516SKenneth E. Jansenc$$$ tmp1 = MINVAL(xmudmi) 3813*59599516SKenneth E. Jansenc$$$ tmp2 = MAXVAL(xmudmi) 3814*59599516SKenneth E. Jansenc$$$ if(numpe>1) then 3815*59599516SKenneth E. Jansenc$$$ call MPI_REDUCE (tmp1, tmp3, 1, MPI_DOUBLE_PRECISION, 3816*59599516SKenneth E. Jansenc$$$ & MPI_MIN, master, MPI_COMM_WORLD, ierr) 3817*59599516SKenneth E. Jansenc$$$ call MPI_REDUCE (tmp2, tmp4, 1, MPI_DOUBLE_PRECISION, 3818*59599516SKenneth E. Jansenc$$$ & MPI_MAX, master, MPI_COMM_WORLD, ierr) 3819*59599516SKenneth E. Jansenc$$$ tmp1=tmp3 3820*59599516SKenneth E. Jansenc$$$ tmp2=tmp4 3821*59599516SKenneth E. Jansenc$$$ endif 3822*59599516SKenneth E. Jansenc$$$ if (myrank .EQ. master) then 3823*59599516SKenneth E. Jansenc$$$ write(35,*) lstep,tmp1,tmp2 3824*59599516SKenneth E. Jansenc$$$ call flush(35) 3825*59599516SKenneth E. Jansenc$$$ endif 3826*59599516SKenneth E. Jansenc $$$$$$$$$$$$$$$$$$$$$$$$$$$ 3827*59599516SKenneth E. Jansen 3828*59599516SKenneth E. Jansenc 3829*59599516SKenneth E. Jansenc if flag set, write a restart file with info (reuse xmij's memory) 3830*59599516SKenneth E. Jansenc 3831*59599516SKenneth E. Jansen if(irs.eq.11) then 3832*59599516SKenneth E. Jansen lstep=999 3833*59599516SKenneth E. Jansen xmij(:,1)=xnum(:) 3834*59599516SKenneth E. Jansen xmij(:,2)=xden(:) 3835*59599516SKenneth E. Jansen xmij(:,3)=cdelsq(:) 3836*59599516SKenneth E. Jansen xmij(:,5)=xlij(:,4) !leave M_{12} in 4 and put L_{12} here 3837*59599516SKenneth E. Jansen call restar('out ',xmij,xlij) !also dump all of L_{ij} in ac 3838*59599516SKenneth E. Jansen stop 3839*59599516SKenneth E. Jansen endif 3840*59599516SKenneth E. Jansenc 3841*59599516SKenneth E. Jansenc local clipping moved to scatnu with the creation of mxmudmi pointers 3842*59599516SKenneth E. Jansenc 3843*59599516SKenneth E. Jansenc$$$ rmu=datmat(1,2,1) 3844*59599516SKenneth E. Jansenc$$$ xmudmi=min(xmudmi,1000.0*rmu) !don't let it get larger than 1000 mu 3845*59599516SKenneth E. Jansenc$$$ xmudmi=max(xmudmi, -rmu) ! don't let (xmudmi + mu) < 0 3846*59599516SKenneth E. Jansenc stop !uncomment to test dmod 3847*59599516SKenneth E. Jansenc 3848*59599516SKenneth E. Jansen 3849*59599516SKenneth E. Jansen 3850*59599516SKenneth E. Jansenc write out the nodal values of xnut (estimate since we don't calc strain 3851*59599516SKenneth E. Jansenc there and must use the filtered strain). 3852*59599516SKenneth E. Jansenc 3853*59599516SKenneth E. Jansen 3854*59599516SKenneth E. Jansen if ((irs .ge. 1) .and. (mod(lstep, ntout) .eq. 0)) then 3855*59599516SKenneth E. Jansenc 3856*59599516SKenneth E. Jansenc collect the average strain into xnude(2) 3857*59599516SKenneth E. Jansenc 3858*59599516SKenneth E. Jansen xnude(:,2) = zero 3859*59599516SKenneth E. Jansen do i = 1,numnp 3860*59599516SKenneth E. Jansen xnude(ifath(i),2) = xnude(ifath(i),2) + strnrm(i) 3861*59599516SKenneth E. Jansen enddo 3862*59599516SKenneth E. Jansen 3863*59599516SKenneth E. Jansen if(numpe .gt. 1) then 3864*59599516SKenneth E. Jansen call drvAllreduce(xnude(:,2), xnuder(:,2),nfath) 3865*59599516SKenneth E. Jansen else 3866*59599516SKenneth E. Jansen xnuder=xnude 3867*59599516SKenneth E. Jansen endif 3868*59599516SKenneth E. Jansenc 3869*59599516SKenneth E. Jansenc nut= cdelsq * |S| 3870*59599516SKenneth E. Jansenc 3871*59599516SKenneth E. Jansen xnutf=xnuder(:,1)*xnuder(:,2)/nsons(:) 3872*59599516SKenneth E. Jansenc 3873*59599516SKenneth E. Jansenc collect the x and y coords into xnude 3874*59599516SKenneth E. Jansenc 3875*59599516SKenneth E. Jansen xnude = zero 3876*59599516SKenneth E. Jansen do i = 1,numnp 3877*59599516SKenneth E. Jansen xnude(ifath(i),1) = xnude(ifath(i),1) + x(i,1) 3878*59599516SKenneth E. Jansen xnude(ifath(i),2) = xnude(ifath(i),2) + x(i,2) 3879*59599516SKenneth E. Jansen enddo 3880*59599516SKenneth E. Jansen 3881*59599516SKenneth E. Jansen if(numpe .gt. 1) 3882*59599516SKenneth E. Jansen & call drvAllreduce(xnude, xnuder,2*nfath) 3883*59599516SKenneth E. Jansen xnuder(:,1)=xnuder(:,1)/nsons(:) 3884*59599516SKenneth E. Jansen xnuder(:,2)=xnuder(:,2)/nsons(:) 3885*59599516SKenneth E. Jansenc 3886*59599516SKenneth E. Jansenc xnude is the sum of the sons for each father on this processor 3887*59599516SKenneth E. Jansenc 3888*59599516SKenneth E. Jansen if((myrank.eq.master)) then 3889*59599516SKenneth E. Jansen do i=1,nfath ! cdelsq * |S| 3890*59599516SKenneth E. Jansen write(444,*) xnuder(i,1),xnuder(i,2),xnutf(i) 3891*59599516SKenneth E. Jansen enddo 3892*59599516SKenneth E. Jansen call flush(444) 3893*59599516SKenneth E. Jansen endif 3894*59599516SKenneth E. Jansen endif 3895*59599516SKenneth E. Jansen 3896*59599516SKenneth E. Jansen return 3897*59599516SKenneth E. Jansen end 3898