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