xref: /phasta/phSolver/common/getvel.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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