xref: /phasta/phSolver/incompressible/forces.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine forces (y ,  ilwork)
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc----------------------------------------------------------------------
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc This subroutine calculates and updates the aerodynamic forces
6*59599516SKenneth E. Jansenc
7*59599516SKenneth E. Jansenc----------------------------------------------------------------------
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansen      include "common.h"
10*59599516SKenneth E. Jansen      include "mpif.h"
11*59599516SKenneth E. Jansen      include "auxmpi.h"
12*59599516SKenneth E. Jansenc
13*59599516SKenneth E. Jansen      integer ilwork(nlwork)
14*59599516SKenneth E. Jansen
15*59599516SKenneth E. Jansen      real*8  y(nshg,ndof)
16*59599516SKenneth E. Jansen      real*8  Forin(5), Forout(5),spmasss
17*59599516SKenneth E. Jansen      real*8  ftots(3,0:MAXSURF),ftot(3)
18*59599516SKenneth E. Jansen
19*59599516SKenneth E. Jansen!MR CHANGE
20*59599516SKenneth E. Jansen        integer :: iv_rankpernode, iv_totnodes, iv_totcores
21*59599516SKenneth E. Jansen        integer :: iv_node, iv_core, iv_thread
22*59599516SKenneth E. Jansen!MR CHANGE
23*59599516SKenneth E. Jansen
24*59599516SKenneth E. Jansenc
25*59599516SKenneth E. Jansenc  START OF DISTURBANCE BLOCK
26*59599516SKenneth E. Jansenc
27*59599516SKenneth E. Jansen      dimension diste(1), distesum(1)
28*59599516SKenneth E. Jansen      distcalc=0  ! we would want to activate this for T-S instability studies
29*59599516SKenneth E. Jansen      if(distcalc.eq.1) then
30*59599516SKenneth E. Jansen        if(iter.eq.nitr) then  ! we have completed the last iteration
31*59599516SKenneth E. Jansen          if (numpe > 1) then
32*59599516SKenneth E. Jansen          call MPI_REDUCE (dke,dkesum,1,MPI_DOUBLE_PRECISION,
33*59599516SKenneth E. Jansen     &                     MPI_SUM, master, MPI_COMM_WORLD,ierr)
34*59599516SKenneth E. Jansen          endif
35*59599516SKenneth E. Jansen          if (numpe.eq.1)
36*59599516SKenneth E. Jansen     &      write (76,1000) lstep+1, dke,dke
37*59599516SKenneth E. Jansen
38*59599516SKenneth E. Jansen          if ((myrank .eq. master).and.(numpe > 1)) then
39*59599516SKenneth E. Jansen             write (76,1000) lstep+1, dkesum,dkesum
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansen             call flush(76)
42*59599516SKenneth E. Jansenc
43*59599516SKenneth E. Jansen          endif
44*59599516SKenneth E. Jansen          dke=0.0               ! we must zero it back out for next step
45*59599516SKenneth E. Jansen
46*59599516SKenneth E. Jansen       endif
47*59599516SKenneth E. Jansen       endif
48*59599516SKenneth E. Jansen
49*59599516SKenneth E. JansenC
50*59599516SKenneth E. JansenC END OF DISTURBANCE BLOCK
51*59599516SKenneth E. JansenC
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansenc
54*59599516SKenneth E. Jansenc.... -------------------->  Aerodynamic Forces  <----------------------
55*59599516SKenneth E. Jansenc
56*59599516SKenneth E. Jansenc.... output the forces and the heat flux
57*59599516SKenneth E. Jansenc
58*59599516SKenneth E. Jansen      if (numpe > 1) then
59*59599516SKenneth E. Jansen         Forin = (/ Force(1), Force(2), Force(3), HFlux,
60*59599516SKenneth E. Jansen     &              entrop /)
61*59599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
62*59599516SKenneth E. Jansen         call MPI_ALLREDUCE (Forin(1), Forout(1),5,
63*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
64*59599516SKenneth E. Jansen         Force = Forout(1:3)
65*59599516SKenneth E. Jansen         HFlux = Forout(4)
66*59599516SKenneth E. Jansen         entrop= Forout(5)
67*59599516SKenneth E. Jansen      endif
68*59599516SKenneth E. Jansen
69*59599516SKenneth E. Jansen      if (numpe > 1) then
70*59599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
71*59599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(1,isrfIM), Atots,1,
72*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
73*59599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
74*59599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(2,isrfIM), spmasss,1,
75*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
76*59599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
77*59599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(3,:), Ftots(1,:),MAXSURF+1,
78*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
79*59599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
80*59599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(4,:), Ftots(2,:),MAXSURF+1,
81*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
82*59599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
83*59599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(5,:), Ftots(3,:),MAXSURF+1,
84*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
85*59599516SKenneth E. Jansen      else
86*59599516SKenneth E. Jansen         Ftots=flxID(3:5,:)
87*59599516SKenneth E. Jansen         Atots=flxID(1,isrfIM)
88*59599516SKenneth E. Jansen         spmasss=flxID(2,isrfIM)
89*59599516SKenneth E. Jansen      endif
90*59599516SKenneth E. Jansen      call sforce()
91*59599516SKenneth E. Jansen
92*59599516SKenneth E. Jansen      ftot(1)=sum(Ftots(1,0:MAXSURF))
93*59599516SKenneth E. Jansen      ftot(2)=sum(Ftots(2,0:MAXSURF))
94*59599516SKenneth E. Jansen      ftot(3)=sum(Ftots(3,0:MAXSURF))
95*59599516SKenneth E. Jansen
96*59599516SKenneth E. Jansen      if (myrank .eq. master) then
97*59599516SKenneth E. Jansen         write (iforce,1000) lstep, (Force(i), i=1,nsd),
98*59599516SKenneth E. Jansen     &        HFlux,spmasss,(ftot(i),i=1,nsd)
99*59599516SKenneth E. Jansen         call flush(iforce)
100*59599516SKenneth E. Jansen      endif
101*59599516SKenneth E. Jansen
102*59599516SKenneth E. Jansen      if((spmasss.ne.0) .and. (matflg(5,1).ne.0))then ! we are doing
103*59599516SKenneth E. Jansen                                                      ! force adjustment
104*59599516SKenneth E. Jansen         tmp=Dtgl*0.025         ! .025= 1/2/tmp1 when tmp1=20
105*59599516SKenneth E. Jansen
106*59599516SKenneth E. Jansen         select case ( matflg(5,1) )
107*59599516SKenneth E. Jansen         case ( 1 )             ! standard linear body force
108*59599516SKenneth E. Jansen            fwall=Force(1)
109*59599516SKenneth E. Jansen            vlngth=xlngth
110*59599516SKenneth E. Jansen         case ( 2 )
111*59599516SKenneth E. Jansen         case ( 3 )
112*59599516SKenneth E. Jansen            fwall=Force(3)
113*59599516SKenneth E. Jansen            vlngth=zlngth
114*59599516SKenneth E. Jansen         end select
115*59599516SKenneth E. Jansen
116*59599516SKenneth E. Jansen         write(222,*) spmasss
117*59599516SKenneth E. Jansen         fnew=(vel-spmasss/(ro*Atots))*tmp +
118*59599516SKenneth E. Jansen     &        fwall/(vlngth*Atots)
119*59599516SKenneth E. Jansen         if(myrank.eq.0) then
120*59599516SKenneth E. Jansen            write(880,*) datmat(1,5,1),fnew
121*59599516SKenneth E. Jansen            call flush(880)
122*59599516SKenneth E. Jansen         endif
123*59599516SKenneth E. Jansen         datmat(1,5,1)=fnew     !* (one - tmp2) + datmat(1,5,1) * tmp2
124*59599516SKenneth E. Jansen      endif
125*59599516SKenneth E. Jansen
126*59599516SKenneth E. Jansen      if (pzero .eq. 1) then
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansen
129*59599516SKenneth E. Jansenc  also adjust the pressure here so that the mean stays at zero (prevent drift)
130*59599516SKenneth E. Jansenc
131*59599516SKenneth E. Jansenc  This is only valid if there are NO Dirichlet Boundary conditions on p!!!
132*59599516SKenneth E. Jansenc
133*59599516SKenneth E. Jansenc  (method below counts partition boundary nodes twice. When we get ntopsh
134*59599516SKenneth E. Jansenc  into the method it will be easy to fix this.  Currently it would require
135*59599516SKenneth E. Jansenc  some work and it is probably not worth it
136*59599516SKenneth E. Jansenc
137*59599516SKenneth E. Jansenc  switched to avg of the on-processor averages to get around hierarchic
138*59599516SKenneth E. Jansenc  modes problem
139*59599516SKenneth E. Jansenc
140*59599516SKenneth E. Jansenc              pave=sum(y(1:numnp,1))
141*59599516SKenneth E. Jansenc              call MPI_ALLREDUCE (pave, pavet, 1,
142*59599516SKenneth E. Jansenc     &             MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
143*59599516SKenneth E. Jansenc     pavet=pavet/nshgt
144*59599516SKenneth E. Jansen         pave=sum(y(1:numnp,4))
145*59599516SKenneth E. Jansen         if (numpe .gt. 1) then
146*59599516SKenneth E. Jansen            xnpts=numnp
147*59599516SKenneth E. Jansen           call MPI_BARRIER(MPI_COMM_WORLD, ierr)
148*59599516SKenneth E. Jansen            call MPI_ALLREDUCE (pave, pavet, 1,
149*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
150*59599516SKenneth E. Jansen            call MPI_BARRIER(MPI_COMM_WORLD, ierr)
151*59599516SKenneth E. Jansen            call MPI_ALLREDUCE (xnpts, xnptst, 1,
152*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
153*59599516SKenneth E. Jansen            pavet=pavet/xnptst
154*59599516SKenneth E. Jansen         else
155*59599516SKenneth E. Jansen            pavet = pave/numnp
156*59599516SKenneth E. Jansen         endif
157*59599516SKenneth E. Jansen
158*59599516SKenneth E. Jansen         y(1:numnp,4)=y(1:numnp,4)-pavet
159*59599516SKenneth E. Jansen         pave=sum(y(1:numnp,4))
160*59599516SKenneth E. Jansenc         if(myrank.eq.0) then
161*59599516SKenneth E. Jansenc            write(90+myrank,*) pavet,pave
162*59599516SKenneth E. Jansenc            call flush(900)
163*59599516SKenneth E. Jansenc         endif
164*59599516SKenneth E. Jansenc
165*59599516SKenneth E. Jansen      endif
166*59599516SKenneth E. Jansen
167*59599516SKenneth E. Jansen      return
168*59599516SKenneth E. Jansenc
169*59599516SKenneth E. Jansen! 1000 format(1p,i6,8e13.5)
170*59599516SKenneth E. Jansen 1000 format(1p,i6,8e20.12)
171*59599516SKenneth E. Jansenc
172*59599516SKenneth E. Jansen      end
173*59599516SKenneth E. Jansen
174*59599516SKenneth E. Jansen      subroutine sforce()
175*59599516SKenneth E. Jansen
176*59599516SKenneth E. Jansen      include "common.h"
177*59599516SKenneth E. Jansen      include "mpif.h"
178*59599516SKenneth E. Jansen
179*59599516SKenneth E. Jansen      real*8  SFlux(10),SFluxg(10)
180*59599516SKenneth E. Jansen      character*20 fname1
181*59599516SKenneth E. Jansen      character*5  cname
182*59599516SKenneth E. Jansen      character*10  cname2
183*59599516SKenneth E. Jansen
184*59599516SKenneth E. Jansen      integer icalled
185*59599516SKenneth E. Jansen      data icalled /0/
186*59599516SKenneth E. Jansen      save icalled
187*59599516SKenneth E. Jansen
188*59599516SKenneth E. Jansen      if(icalled.eq.0) then
189*59599516SKenneth E. Jansen        icalled = 1
190*59599516SKenneth E. Jansen
191*59599516SKenneth E. Jansen!MR CHANGE
192*59599516SKenneth E. Jansen        iv_rankpernode = iv_rankpercore*iv_corepernode
193*59599516SKenneth E. Jansen        iv_totnodes = numpe/iv_rankpernode
194*59599516SKenneth E. Jansen        iv_totcores = iv_corepernode*iv_totnodes
195*59599516SKenneth E. Jansen        irankfilesforce(:) = -1
196*59599516SKenneth E. Jansen!MR CHANGE
197*59599516SKenneth E. Jansen
198*59599516SKenneth E. Jansen        do isrf = 0,MAXSURF
199*59599516SKenneth E. Jansen
200*59599516SKenneth E. Jansen!MR CHANGE
201*59599516SKenneth E. Jansen          ! Compute the adequate rank which will take care of isrf
202*59599516SKenneth E. Jansen          iv_node = (iv_totnodes-1)-mod(isrf,iv_totnodes)
203*59599516SKenneth E. Jansen          iv_core = (iv_corepernode-1) - mod((isrf -
204*59599516SKenneth E. Jansen     &              mod(isrf,iv_totnodes))/iv_totnodes,iv_corepernode)
205*59599516SKenneth E. Jansen          iv_thread = (iv_rankpercore-1) - mod((isrf-
206*59599516SKenneth E. Jansen     &              (mod(isrf,iv_totcores)))/iv_totcores,iv_rankpercore)
207*59599516SKenneth E. Jansen          irankfilesforce(isrf) = iv_node*iv_rankpernode
208*59599516SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
209*59599516SKenneth E. Jansen     &                     + iv_thread
210*59599516SKenneth E. Jansen
211*59599516SKenneth E. Jansen          if(myrank == 0) then
212*59599516SKenneth E. Jansen              write(*,*) '  sforce ', isrf, 'if any handled by rank',
213*59599516SKenneth E. Jansen     &                      irankfilesforce(isrf), ' on node', iv_node
214*59599516SKenneth E. Jansen          endif
215*59599516SKenneth E. Jansen
216*59599516SKenneth E. Jansen          ! Verification just in case
217*59599516SKenneth E. Jansen          if(irankfilesforce(isrf) .lt.0 .or.
218*59599516SKenneth E. Jansen     &                 irankfilesforce(isrf) .ge. numpe) then
219*59599516SKenneth E. Jansen            write(*,*) 'WARNING: irankfilesforce(',isrf,') is ',
220*59599516SKenneth E. Jansen     &                                  irankfilesforce(isrf),
221*59599516SKenneth E. Jansen     &                      ' and reset to numpe-1'
222*59599516SKenneth E. Jansen            irankfilesforce(isrf) = numpe-1
223*59599516SKenneth E. Jansen          endif
224*59599516SKenneth E. Jansen!MR CHANGE
225*59599516SKenneth E. Jansen
226*59599516SKenneth E. Jansen!          if ( nsrflist(isrf).ne.0 .and. myrank.eq.master) then
227*59599516SKenneth E. Jansen          if ( nsrflist(isrf).ne.0 .and.
228*59599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
229*59599516SKenneth E. Jansen            iunit=60+isrf
230*59599516SKenneth E. Jansen            fname1 = 'forces_s'//trim(cname(isrf))// cname2(lskeep+1)
231*59599516SKenneth E. Jansen            open(unit=iunit,file=trim(fname1),status='unknown')
232*59599516SKenneth E. Jansen          endif
233*59599516SKenneth E. Jansen        enddo
234*59599516SKenneth E. Jansen      endif
235*59599516SKenneth E. Jansen
236*59599516SKenneth E. Jansen      do isrf = 0,MAXSURF
237*59599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 ) then
238*59599516SKenneth E. Jansen          SFlux(:) = flxID(:,isrf) ! Area, Mass Flux, Force 1, Force 2, Force 3, Scalars
239*59599516SKenneth E. Jansen          if ( numpe > 1 ) then
240*59599516SKenneth E. Jansen            call MPI_BARRIER(MPI_COMM_WORLD, ierr)
241*59599516SKenneth E. Jansen            call MPI_ALLREDUCE (SFlux, SFluxg,10,
242*59599516SKenneth E. Jansen     .        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
243*59599516SKenneth E. Jansen            SFlux = SFluxg
244*59599516SKenneth E. Jansen          endif
245*59599516SKenneth E. Jansen!          if(myrank.eq.master) then
246*59599516SKenneth E. Jansen          if(myrank.eq.irankfilesforce(isrf)) then
247*59599516SKenneth E. Jansen            iunit=60+isrf
248*59599516SKenneth E. Jansen!            write(iunit,"(i7,1p10e14.5)") lstep, SFlux
249*59599516SKenneth E. Jansen            write(iunit,"(i7,1p10e20.12)") lstep, SFlux
250*59599516SKenneth E. Jansen            call flush(iunit)
251*59599516SKenneth E. Jansen! done in itrdrv.f
252*59599516SKenneth E. Jansen!            if(istep.eq.nstep(1)) then !end step then close file
253*59599516SKenneth E. Jansen!              close(iunit)
254*59599516SKenneth E. Jansen!            endif
255*59599516SKenneth E. Jansen          endif
256*59599516SKenneth E. Jansen        endif
257*59599516SKenneth E. Jansen      enddo
258*59599516SKenneth E. Jansen
259*59599516SKenneth E. Jansen      return
260*59599516SKenneth E. Jansen      end
261