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