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