xref: /phasta/phSolver/incompressible/forces.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
159599516SKenneth E. Jansen      subroutine forces (y ,  ilwork)
259599516SKenneth E. Jansenc
359599516SKenneth E. Jansenc----------------------------------------------------------------------
459599516SKenneth E. Jansenc
559599516SKenneth E. Jansenc This subroutine calculates and updates the aerodynamic forces
659599516SKenneth E. Jansenc
759599516SKenneth E. Jansenc----------------------------------------------------------------------
859599516SKenneth E. Jansenc
959599516SKenneth E. Jansen      include "common.h"
1059599516SKenneth E. Jansen      include "mpif.h"
1159599516SKenneth E. Jansen      include "auxmpi.h"
1259599516SKenneth E. Jansenc
1359599516SKenneth E. Jansen      integer ilwork(nlwork)
1459599516SKenneth E. Jansen
1559599516SKenneth E. Jansen      real*8  y(nshg,ndof)
1659599516SKenneth E. Jansen      real*8  Forin(5), Forout(5),spmasss
1759599516SKenneth E. Jansen      real*8  ftots(3,0:MAXSURF),ftot(3)
1859599516SKenneth E. Jansen
1959599516SKenneth E. Jansen!MR CHANGE
2059599516SKenneth E. Jansen        integer :: iv_rankpernode, iv_totnodes, iv_totcores
2159599516SKenneth E. Jansen        integer :: iv_node, iv_core, iv_thread
2259599516SKenneth E. Jansen!MR CHANGE
2359599516SKenneth E. Jansen
2459599516SKenneth E. Jansenc
2559599516SKenneth E. Jansenc  START OF DISTURBANCE BLOCK
2659599516SKenneth E. Jansenc
2759599516SKenneth E. Jansen      dimension diste(1), distesum(1)
2859599516SKenneth E. Jansen      distcalc=0  ! we would want to activate this for T-S instability studies
2959599516SKenneth E. Jansen      if(distcalc.eq.1) then
3059599516SKenneth E. Jansen        if(iter.eq.nitr) then  ! we have completed the last iteration
3159599516SKenneth E. Jansen          if (numpe > 1) then
3259599516SKenneth E. Jansen          call MPI_REDUCE (dke,dkesum,1,MPI_DOUBLE_PRECISION,
3359599516SKenneth E. Jansen     &                     MPI_SUM, master, MPI_COMM_WORLD,ierr)
3459599516SKenneth E. Jansen          endif
3559599516SKenneth E. Jansen          if (numpe.eq.1)
3659599516SKenneth E. Jansen     &      write (76,1000) lstep+1, dke,dke
3759599516SKenneth E. Jansen
3859599516SKenneth E. Jansen          if ((myrank .eq. master).and.(numpe > 1)) then
3959599516SKenneth E. Jansen             write (76,1000) lstep+1, dkesum,dkesum
4059599516SKenneth E. Jansenc
4159599516SKenneth E. Jansen             call flush(76)
4259599516SKenneth E. Jansenc
4359599516SKenneth E. Jansen          endif
4459599516SKenneth E. Jansen          dke=0.0               ! we must zero it back out for next step
4559599516SKenneth E. Jansen
4659599516SKenneth E. Jansen       endif
4759599516SKenneth E. Jansen       endif
4859599516SKenneth E. Jansen
4959599516SKenneth E. JansenC
5059599516SKenneth E. JansenC END OF DISTURBANCE BLOCK
5159599516SKenneth E. JansenC
5259599516SKenneth E. Jansen
5359599516SKenneth E. Jansenc
5459599516SKenneth E. Jansenc.... -------------------->  Aerodynamic Forces  <----------------------
5559599516SKenneth E. Jansenc
5659599516SKenneth E. Jansenc.... output the forces and the heat flux
5759599516SKenneth E. Jansenc
5859599516SKenneth E. Jansen      if (numpe > 1) then
5959599516SKenneth E. Jansen         Forin = (/ Force(1), Force(2), Force(3), HFlux,
6059599516SKenneth E. Jansen     &              entrop /)
6159599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
6259599516SKenneth E. Jansen         call MPI_ALLREDUCE (Forin(1), Forout(1),5,
6359599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
6459599516SKenneth E. Jansen         Force = Forout(1:3)
6559599516SKenneth E. Jansen         HFlux = Forout(4)
6659599516SKenneth E. Jansen         entrop= Forout(5)
6759599516SKenneth E. Jansen      endif
6859599516SKenneth E. Jansen
6959599516SKenneth E. Jansen      if (numpe > 1) then
7059599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
7159599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(1,isrfIM), Atots,1,
7259599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
7359599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
7459599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(2,isrfIM), spmasss,1,
7559599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
7659599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
7759599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(3,:), Ftots(1,:),MAXSURF+1,
7859599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
7959599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
8059599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(4,:), Ftots(2,:),MAXSURF+1,
8159599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
8259599516SKenneth E. Jansen         call MPI_BARRIER(MPI_COMM_WORLD, ierr)
8359599516SKenneth E. Jansen         call MPI_ALLREDUCE (flxID(5,:), Ftots(3,:),MAXSURF+1,
8459599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
8559599516SKenneth E. Jansen      else
8659599516SKenneth E. Jansen         Ftots=flxID(3:5,:)
8759599516SKenneth E. Jansen         Atots=flxID(1,isrfIM)
8859599516SKenneth E. Jansen         spmasss=flxID(2,isrfIM)
8959599516SKenneth E. Jansen      endif
9059599516SKenneth E. Jansen      call sforce()
9159599516SKenneth E. Jansen
9259599516SKenneth E. Jansen      ftot(1)=sum(Ftots(1,0:MAXSURF))
9359599516SKenneth E. Jansen      ftot(2)=sum(Ftots(2,0:MAXSURF))
9459599516SKenneth E. Jansen      ftot(3)=sum(Ftots(3,0:MAXSURF))
9559599516SKenneth E. Jansen
9659599516SKenneth E. Jansen      if (myrank .eq. master) then
9759599516SKenneth E. Jansen         write (iforce,1000) lstep, (Force(i), i=1,nsd),
9859599516SKenneth E. Jansen     &        HFlux,spmasss,(ftot(i),i=1,nsd)
9959599516SKenneth E. Jansen         call flush(iforce)
10059599516SKenneth E. Jansen      endif
10159599516SKenneth E. Jansen
10259599516SKenneth E. Jansen      if((spmasss.ne.0) .and. (matflg(5,1).ne.0))then ! we are doing
10359599516SKenneth E. Jansen                                                      ! force adjustment
10459599516SKenneth E. Jansen         tmp=Dtgl*0.025         ! .025= 1/2/tmp1 when tmp1=20
10559599516SKenneth E. Jansen
10659599516SKenneth E. Jansen         select case ( matflg(5,1) )
10759599516SKenneth E. Jansen         case ( 1 )             ! standard linear body force
10859599516SKenneth E. Jansen            fwall=Force(1)
10959599516SKenneth E. Jansen            vlngth=xlngth
11059599516SKenneth E. Jansen         case ( 2 )
11159599516SKenneth E. Jansen         case ( 3 )
11259599516SKenneth E. Jansen            fwall=Force(3)
11359599516SKenneth E. Jansen            vlngth=zlngth
11459599516SKenneth E. Jansen         end select
11559599516SKenneth E. Jansen
11659599516SKenneth E. Jansen         write(222,*) spmasss
11759599516SKenneth E. Jansen         fnew=(vel-spmasss/(ro*Atots))*tmp +
11859599516SKenneth E. Jansen     &        fwall/(vlngth*Atots)
11959599516SKenneth E. Jansen         if(myrank.eq.0) then
12059599516SKenneth E. Jansen            write(880,*) datmat(1,5,1),fnew
12159599516SKenneth E. Jansen            call flush(880)
12259599516SKenneth E. Jansen         endif
12359599516SKenneth E. Jansen         datmat(1,5,1)=fnew     !* (one - tmp2) + datmat(1,5,1) * tmp2
12459599516SKenneth E. Jansen      endif
12559599516SKenneth E. Jansen
12659599516SKenneth E. Jansen      if (pzero .eq. 1) then
12759599516SKenneth E. Jansenc
12859599516SKenneth E. Jansen
12959599516SKenneth E. Jansenc  also adjust the pressure here so that the mean stays at zero (prevent drift)
13059599516SKenneth E. Jansenc
13159599516SKenneth E. Jansenc  This is only valid if there are NO Dirichlet Boundary conditions on p!!!
13259599516SKenneth E. Jansenc
13359599516SKenneth E. Jansenc  (method below counts partition boundary nodes twice. When we get ntopsh
13459599516SKenneth E. Jansenc  into the method it will be easy to fix this.  Currently it would require
13559599516SKenneth E. Jansenc  some work and it is probably not worth it
13659599516SKenneth E. Jansenc
13759599516SKenneth E. Jansenc  switched to avg of the on-processor averages to get around hierarchic
13859599516SKenneth E. Jansenc  modes problem
13959599516SKenneth E. Jansenc
14059599516SKenneth E. Jansenc              pave=sum(y(1:numnp,1))
14159599516SKenneth E. Jansenc              call MPI_ALLREDUCE (pave, pavet, 1,
14259599516SKenneth E. Jansenc     &             MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
14359599516SKenneth E. Jansenc     pavet=pavet/nshgt
14459599516SKenneth E. Jansen         pave=sum(y(1:numnp,4))
14559599516SKenneth E. Jansen         if (numpe .gt. 1) then
14659599516SKenneth E. Jansen            xnpts=numnp
14759599516SKenneth E. Jansen           call MPI_BARRIER(MPI_COMM_WORLD, ierr)
14859599516SKenneth E. Jansen            call MPI_ALLREDUCE (pave, pavet, 1,
14959599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
15059599516SKenneth E. Jansen            call MPI_BARRIER(MPI_COMM_WORLD, ierr)
15159599516SKenneth E. Jansen            call MPI_ALLREDUCE (xnpts, xnptst, 1,
15259599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
15359599516SKenneth E. Jansen            pavet=pavet/xnptst
15459599516SKenneth E. Jansen         else
15559599516SKenneth E. Jansen            pavet = pave/numnp
15659599516SKenneth E. Jansen         endif
15759599516SKenneth E. Jansen
15859599516SKenneth E. Jansen         y(1:numnp,4)=y(1:numnp,4)-pavet
15959599516SKenneth E. Jansen         pave=sum(y(1:numnp,4))
16059599516SKenneth E. Jansenc         if(myrank.eq.0) then
16159599516SKenneth E. Jansenc            write(90+myrank,*) pavet,pave
16259599516SKenneth E. Jansenc            call flush(900)
16359599516SKenneth E. Jansenc         endif
16459599516SKenneth E. Jansenc
16559599516SKenneth E. Jansen      endif
16659599516SKenneth E. Jansen
16759599516SKenneth E. Jansen      return
16859599516SKenneth E. Jansenc
16959599516SKenneth E. Jansen! 1000 format(1p,i6,8e13.5)
17059599516SKenneth E. Jansen 1000 format(1p,i6,8e20.12)
17159599516SKenneth E. Jansenc
17259599516SKenneth E. Jansen      end
17359599516SKenneth E. Jansen
17459599516SKenneth E. Jansen      subroutine sforce()
17559599516SKenneth E. Jansen
17659599516SKenneth E. Jansen      include "common.h"
17759599516SKenneth E. Jansen      include "mpif.h"
17859599516SKenneth E. Jansen
17959599516SKenneth E. Jansen      real*8  SFlux(10),SFluxg(10)
18059599516SKenneth E. Jansen      character*20 fname1
18159599516SKenneth E. Jansen      character*5  cname
18259599516SKenneth E. Jansen      character*10  cname2
18359599516SKenneth E. Jansen
18459599516SKenneth E. Jansen      integer icalled
18559599516SKenneth E. Jansen      data icalled /0/
18659599516SKenneth E. Jansen      save icalled
18759599516SKenneth E. Jansen
18859599516SKenneth E. Jansen      if(icalled.eq.0) then
18959599516SKenneth E. Jansen        icalled = 1
19059599516SKenneth E. Jansen
19159599516SKenneth E. Jansen!MR CHANGE
19259599516SKenneth E. Jansen        iv_rankpernode = iv_rankpercore*iv_corepernode
19359599516SKenneth E. Jansen        iv_totnodes = numpe/iv_rankpernode
19459599516SKenneth E. Jansen        iv_totcores = iv_corepernode*iv_totnodes
19559599516SKenneth E. Jansen        irankfilesforce(:) = -1
19659599516SKenneth E. Jansen!MR CHANGE
19759599516SKenneth E. Jansen
19859599516SKenneth E. Jansen        do isrf = 0,MAXSURF
19959599516SKenneth E. Jansen
20059599516SKenneth E. Jansen!MR CHANGE
20159599516SKenneth E. Jansen          ! Compute the adequate rank which will take care of isrf
20259599516SKenneth E. Jansen          iv_node = (iv_totnodes-1)-mod(isrf,iv_totnodes)
20359599516SKenneth E. Jansen          iv_core = (iv_corepernode-1) - mod((isrf -
20459599516SKenneth E. Jansen     &              mod(isrf,iv_totnodes))/iv_totnodes,iv_corepernode)
20559599516SKenneth E. Jansen          iv_thread = (iv_rankpercore-1) - mod((isrf-
20659599516SKenneth E. Jansen     &              (mod(isrf,iv_totcores)))/iv_totcores,iv_rankpercore)
20759599516SKenneth E. Jansen          irankfilesforce(isrf) = iv_node*iv_rankpernode
20859599516SKenneth E. Jansen     &                     + iv_core*iv_rankpercore
20959599516SKenneth E. Jansen     &                     + iv_thread
21059599516SKenneth E. Jansen
211*956f980fSKenneth E. Jansen          if(myrank == 0 .and. isrf.le.iv_rankpernode) then
21259599516SKenneth E. Jansen              write(*,*) '  sforce ', isrf, 'if any handled by rank',
21359599516SKenneth E. Jansen     &                      irankfilesforce(isrf), ' on node', iv_node
21459599516SKenneth E. Jansen          endif
21559599516SKenneth E. Jansen
21659599516SKenneth E. Jansen          ! Verification just in case
21759599516SKenneth E. Jansen          if(irankfilesforce(isrf) .lt.0 .or.
21859599516SKenneth E. Jansen     &                 irankfilesforce(isrf) .ge. numpe) then
21959599516SKenneth E. Jansen            write(*,*) 'WARNING: irankfilesforce(',isrf,') is ',
22059599516SKenneth E. Jansen     &                                  irankfilesforce(isrf),
22159599516SKenneth E. Jansen     &                      ' and reset to numpe-1'
22259599516SKenneth E. Jansen            irankfilesforce(isrf) = numpe-1
22359599516SKenneth E. Jansen          endif
22459599516SKenneth E. Jansen!MR CHANGE
22559599516SKenneth E. Jansen
22659599516SKenneth E. Jansen!          if ( nsrflist(isrf).ne.0 .and. myrank.eq.master) then
22759599516SKenneth E. Jansen          if ( nsrflist(isrf).ne.0 .and.
22859599516SKenneth E. Jansen     &                     myrank.eq.irankfilesforce(isrf)) then
22959599516SKenneth E. Jansen            iunit=60+isrf
23059599516SKenneth E. Jansen            fname1 = 'forces_s'//trim(cname(isrf))// cname2(lskeep+1)
23159599516SKenneth E. Jansen            open(unit=iunit,file=trim(fname1),status='unknown')
23259599516SKenneth E. Jansen          endif
23359599516SKenneth E. Jansen        enddo
23459599516SKenneth E. Jansen      endif
23559599516SKenneth E. Jansen
23659599516SKenneth E. Jansen      do isrf = 0,MAXSURF
23759599516SKenneth E. Jansen        if ( nsrflist(isrf).ne.0 ) then
23859599516SKenneth E. Jansen          SFlux(:) = flxID(:,isrf) ! Area, Mass Flux, Force 1, Force 2, Force 3, Scalars
23959599516SKenneth E. Jansen          if ( numpe > 1 ) then
24059599516SKenneth E. Jansen            call MPI_BARRIER(MPI_COMM_WORLD, ierr)
24159599516SKenneth E. Jansen            call MPI_ALLREDUCE (SFlux, SFluxg,10,
24259599516SKenneth E. Jansen     .        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
24359599516SKenneth E. Jansen            SFlux = SFluxg
24459599516SKenneth E. Jansen          endif
24559599516SKenneth E. Jansen!          if(myrank.eq.master) then
24659599516SKenneth E. Jansen          if(myrank.eq.irankfilesforce(isrf)) then
24759599516SKenneth E. Jansen            iunit=60+isrf
24859599516SKenneth E. Jansen!            write(iunit,"(i7,1p10e14.5)") lstep, SFlux
24959599516SKenneth E. Jansen            write(iunit,"(i7,1p10e20.12)") lstep, SFlux
25059599516SKenneth E. Jansen            call flush(iunit)
25159599516SKenneth E. Jansen! done in itrdrv.f
25259599516SKenneth E. Jansen!            if(istep.eq.nstep(1)) then !end step then close file
25359599516SKenneth E. Jansen!              close(iunit)
25459599516SKenneth E. Jansen!            endif
25559599516SKenneth E. Jansen          endif
25659599516SKenneth E. Jansen        endif
25759599516SKenneth E. Jansen      enddo
25859599516SKenneth E. Jansen
25959599516SKenneth E. Jansen      return
26059599516SKenneth E. Jansen      end
261