1*59599516SKenneth E. Jansen subroutine getvel (y,ilwork, iBC, 2*59599516SKenneth E. Jansen & nsons, ifath, velbar) 3*59599516SKenneth E. Jansen 4*59599516SKenneth E. Jansen 5*59599516SKenneth E. Jansen include "common.h" 6*59599516SKenneth E. Jansen include "mpif.h" 7*59599516SKenneth E. Jansen include "auxmpi.h" 8*59599516SKenneth E. Jansen 9*59599516SKenneth E. Jansenc 10*59599516SKenneth E. Jansen dimension nsons(nfath), rinvsons(nfath), 11*59599516SKenneth E. Jansen & velo(numnp,nflow), velf(nfath,nflow), 12*59599516SKenneth E. Jansen & velft(nfath,nflow), 13*59599516SKenneth E. Jansen & velbar(nfath,nflow), 14*59599516SKenneth E. Jansen & y(numnp,ndof), 15*59599516SKenneth E. Jansen & ifath(numnp), 16*59599516SKenneth E. Jansen & ilwork(nlwork), iBC(numnp) 17*59599516SKenneth E. Jansen 18*59599516SKenneth E. Jansenc 19*59599516SKenneth E. Jansenc for now keep the compressible numbering in velbar 20*59599516SKenneth E. Jansenc 21*59599516SKenneth E. Jansen velo(:,1)=y(:,4) 22*59599516SKenneth E. Jansen velo(:,2)=y(:,1) 23*59599516SKenneth E. Jansen velo(:,3)=y(:,2) 24*59599516SKenneth E. Jansen velo(:,4)=y(:,3) 25*59599516SKenneth E. Jansen if(nflow.eq.5) velo(:,5)=y(:,5) 26*59599516SKenneth E. Jansen nsonmax=maxval(nsons) 27*59599516SKenneth E. Jansen if ((nsonmax.eq.1)) then ! we are doing local clipping -no homog dir 28*59599516SKenneth E. Jansen velft=velo 29*59599516SKenneth E. Jansen else 30*59599516SKenneth E. Jansenc 31*59599516SKenneth E. Jansenc zero on processor periodic nodes so that they will not be added twice 32*59599516SKenneth E. Jansenc 33*59599516SKenneth E. Jansen where(btest(iBC,10).or.btest(iBC,12)) 34*59599516SKenneth E. Jansen velo(:,1)=zero 35*59599516SKenneth E. Jansen velo(:,2)=zero 36*59599516SKenneth E. Jansen velo(:,3)=zero 37*59599516SKenneth E. Jansen velo(:,4)=zero 38*59599516SKenneth E. Jansen endwhere 39*59599516SKenneth E. Jansen if(nflow.eq.5) then 40*59599516SKenneth E. Jansen where(btest(iBC,10).or.btest(iBC,12)) 41*59599516SKenneth E. Jansen velo(:,5)=zero 42*59599516SKenneth E. Jansen endwhere 43*59599516SKenneth E. Jansen endif 44*59599516SKenneth E. Jansen if (numpe.gt.1) then 45*59599516SKenneth E. Jansen 46*59599516SKenneth E. Jansen numtask = ilwork(1) 47*59599516SKenneth E. Jansen itkbeg = 1 48*59599516SKenneth E. Jansen 49*59599516SKenneth E. Jansenc zero the nodes that are "solved" on the other processors 50*59599516SKenneth E. Jansen do itask = 1, numtask 51*59599516SKenneth E. Jansen 52*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 53*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 54*59599516SKenneth E. Jansen 55*59599516SKenneth E. Jansen if (iacc .eq. 0) then 56*59599516SKenneth E. Jansen do is = 1,numseg 57*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 58*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 59*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 60*59599516SKenneth E. Jansen velo(isgbeg:isgend,:) = zero 61*59599516SKenneth E. Jansen velo(isgbeg:isgend,:) = zero 62*59599516SKenneth E. Jansen enddo 63*59599516SKenneth E. Jansen endif 64*59599516SKenneth E. Jansen 65*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 66*59599516SKenneth E. Jansen 67*59599516SKenneth E. Jansen enddo !itask 68*59599516SKenneth E. Jansen 69*59599516SKenneth E. Jansen endif ! numpe.gt.1 70*59599516SKenneth E. Jansen 71*59599516SKenneth E. Jansen 72*59599516SKenneth E. Jansen velf = zero 73*59599516SKenneth E. Jansenc 74*59599516SKenneth E. Jansenc accumulate sum of sons to the fathers 75*59599516SKenneth E. Jansenc 76*59599516SKenneth E. Jansen do i = 1,numnp 77*59599516SKenneth E. Jansen ifathi=ifath(i) 78*59599516SKenneth E. Jansen velf(ifathi,1:nflow) = velf(ifathi,1:nflow) 79*59599516SKenneth E. Jansen & + velo(i,1:nflow) 80*59599516SKenneth E. Jansen enddo 81*59599516SKenneth E. Jansen 82*59599516SKenneth E. Jansenc 83*59599516SKenneth E. Jansenc Now the true fathers and serrogates combine results and update 84*59599516SKenneth E. Jansenc each other. 85*59599516SKenneth E. Jansenc 86*59599516SKenneth E. Jansen if(numpe .gt. 1) then 87*59599516SKenneth E. Jansen call drvAllreduce(velf, velft,nfath*nflow) 88*59599516SKenneth E. Jansen else 89*59599516SKenneth E. Jansen velft=velf 90*59599516SKenneth E. Jansen endif 91*59599516SKenneth E. Jansenc 92*59599516SKenneth E. Jansenc xvelf is the sum of the sons for each father on this processor 93*59599516SKenneth E. Jansenc 94*59599516SKenneth E. Jansenc xvelft is the sum of the sons for each father on all processor combined 95*59599516SKenneth E. Jansenc (the same as if we had not partitioned the mesh for each processor) 96*59599516SKenneth E. Jansenc 97*59599516SKenneth E. Jansenc divide by # of sons to get average father for this step 98*59599516SKenneth E. Jansenc 99*59599516SKenneth E. Jansen rinvsons = one/nsons ! division is expensive 100*59599516SKenneth E. Jansen velft(:,1) = velft(:,1) * rinvsons(:) ! / nsons(:) 101*59599516SKenneth E. Jansen velft(:,2) = velft(:,2) * rinvsons(:) ! / nsons(:) 102*59599516SKenneth E. Jansen velft(:,3) = velft(:,3) * rinvsons(:) ! / nsons(:) 103*59599516SKenneth E. Jansen velft(:,4) = velft(:,4) * rinvsons(:) ! / nsons(:) 104*59599516SKenneth E. Jansen if(nflow.eq.5) velft(:,5) = velft(:,5) * rinvsons(:) 105*59599516SKenneth E. Jansen endif ! end of homog direction averaging 106*59599516SKenneth E. Jansen denom=max(one*(lstep),one) 107*59599516SKenneth E. Jansen if(wtavei.lt.0) then 108*59599516SKenneth E. Jansen tavef=one/denom 109*59599516SKenneth E. Jansen else 110*59599516SKenneth E. Jansen tavef=wtavei 111*59599516SKenneth E. Jansen endif 112*59599516SKenneth E. Jansen velbar(:,1)=velft(:,1) 113*59599516SKenneth E. Jansen velbar(:,2)=velft(:,2) 114*59599516SKenneth E. Jansen velbar(:,3)=velft(:,3) 115*59599516SKenneth E. Jansen velbar(:,4)=velft(:,4) 116*59599516SKenneth E. Jansen 117*59599516SKenneth E. Jansen if(istep.eq.0) then 118*59599516SKenneth E. Jansen velbar(:,:)=velft(:,:) 119*59599516SKenneth E. Jansen else 120*59599516SKenneth E. Jansen velbar(:,:)=tavef*velft(:,:)+(one-tavef)*velbar(:,:) 121*59599516SKenneth E. Jansen endif 122*59599516SKenneth E. Jansen 123*59599516SKenneth E. Jansen return 124*59599516SKenneth E. Jansen end 125*59599516SKenneth E. Jansen 126*59599516SKenneth E. Jansen 127*59599516SKenneth E. Jansen 128*59599516SKenneth E. Jansen 129*59599516SKenneth E. Jansen 130*59599516SKenneth E. Jansen 131