subroutine drivergen
use modglobal, only : ib,ie,jb,je,jgb,jge,kb,ke,zf,zh,dzf,dzhi,timee,btime,totavtime,rk3step,&
dt,numol,iplane,lles,idriver,inletav,runavtime,Uinf,lwallfunc,linletRA,&
totinletav,lstoreplane,nstore,driverstore,prandtlmoli,numol,grav,lbuoyancy,&
lfixinlet,lfixutauin,tdriverstart,dtdriver,tdriverdump,ltempeq,lmoist,nsv,lsdriver
use modfields, only : u0,v0,w0,e120,thl0,qt0,wm,uprof
use modsave, only : writerestartfiles
use modmpi, only : slabsum,myid
implicit none
real :: inlrec ! time of last inlet record
real :: elapsrec ! time elapsed in this inlet record
real :: dtint ! dt for linear interpolation
REAL*8, PARAMETER :: eps = 1d-3
integer i,j,k,kk,kdamp,x
if (idriver == 1) then
! if (.not. (rk3step==3)) return
if (.not. (timee>=tdriverstart)) return
if (.not. (timee>=tdriverdump)) return
if (nstepreaddriver>=driverstore) return
if (nstepreaddriver==0) then
! tdriverdump = timee
tdriverdump = tdriverstart
! tdriverstart = timee !Update tdriverstart to the actual recorded value
if ((myid==0) .and. (rk3step==3)) then
write(6,*) '=================================================================='
write(6,*) '*** Starting to write data for driver simulation ***'
write(6,*) 'Driver recording variables:'
write(6,'(A,F9.2,A,I4,A,F12.9)') ' Starting time: ',tdriverdump,' Stored time steps: ',driverstore,' Inlet record intervals: ',dtdriver
write(6,*) '=================================================================='
end if
end if
if(rk3step==3) then
nstepreaddriver = nstepreaddriver + 1
tdriverdump = tdriverdump + dtdriver
! storetinlet(nstepreaddriver) = timee - tdriverstart
call writedriverfile
end if
elseif (idriver == 2) then
! if (.not. rk3step==1) return
if (timee>maxval(storetdriver)) then
if(myid==0) then
write(0,'(A,F9.2,A,F9.2)') 'timee: ',timee,' Final inlet driver time:',maxval(storetdriver)
write(0,'(A,I4,A,I4)') 'Inlet driver step: ',nstepreaddriver,' Total inlet driver steps:',driverstore
end if
stop 'Time in simulation has exceeded the inlet information - no more inlet data available!'
end if
x = minloc(abs(storetdriver-timee),1)
elapsrec = storetdriver(x) - timee
if(myid==0) then
! if(rk3step==1) then
! write(6,*) '============ Inlet interpolating ============='
! write(6,*) 'Inlet interpolation time = ', elapsrec
! write(6,'(A,F9.4)') 'Inlet driver time stamp (x) = ', storetdriver(x)
! write(6,'(A,F9.4)') 'Inlet driver time stamp (x+1) = ', storetdriver(x+1)
! write(6,'(A,F9.4)') 'Inlet driver time stamp (x-1) = ', storetdriver(x-1)
! write(6,'(A,E20.12)') 'Reading driver velocity: storeu0driver(je,ke,x) = ', storeu0driver(je,ke,x)
! write(6,*) 'Inlet step = ',nstepreaddriver
! end if
end if
if (abs(elapsrec) < eps) then
if ((myid==0) .and. (rk3step==1)) then
write(*,'(A,I5,A,F10.3,A)') '======= Inputs loaded from driver tstep ',x,' (at ',storetdriver(x),'s) ======='
end if
u0driver(:,:) = storeu0driver(:,:,x)
v0driver(:,:) = storev0driver(:,:,x)
w0driver(:,:) = storew0driver(:,:,x)
!e120driver(:,:) = storee120driver(:,:,x)
if (ltempeq) then
thl0driver(:,:) = storethl0driver(:,:,x)
end if
if (lmoist) then
qt0driver(:,:) = storeqt0driver(:,:,x)
end if
if (nsv>0 .and. lsdriver) then
sv0driver(:,:,:) = storesv0driver(:,:,:,x)
end if
nstepreaddriver = x
elseif ((elapsrec > 0.) .and. (x == 1)) then
if ((myid==0) .and. (rk3step==1)) then
write(*,'(A,F10.3,A)') '======= Inputs loaded from the proceeding driver tstep 1 (at ',storetdriver(x),'s) ======='
end if
u0driver(:,:) = storeu0driver(:,:,x)
v0driver(:,:) = storev0driver(:,:,x)
w0driver(:,:) = storew0driver(:,:,x)
! e120driver(:,:) = storee120driver(:,:,x)
if (ltempeq) then
thl0driver(:,:) = storethl0driver(:,:,x)
end if
if (lmoist) then
qt0driver(:,:) = storeqt0driver(:,:,x)
end if
if (nsv>0 .and. lsdriver) then
sv0driver(:,:,:) = storesv0driver(:,:,:,x)
end if
nstepreaddriver = x
elseif (elapsrec < 0.) then
if ((myid==0) .and. (rk3step==1)) then
write(*,'(A,I5,A,F10.3,A,I5,A,F10.3,A)') '======= Inputs interpolated from driver tsteps ',x,' (',storetdriver(x),' s) and ',x+1,' (',storetdriver(x+1),' s) ======='
end if
dtint = (timee-storetdriver(x))/(storetdriver(x+1)-storetdriver(x))
! if(myid==0) then
! write(6,'(A,I4)') 'x: ', x
! write(6,'(A,F9.4)') 'dtint: ', dtint
! write(6,'(A,E20.12)') 'storeu0driver(1,32,x): ', storeu0driver(1,32,x)
! write(6,'(A,E20.12)') 'storeu0driver(1,32,x+1): ', storeu0driver(1,32,x+1)
! write(6,'(A,E20.12)') 'u0driver(1,32): ', storeu0driver(1,32,x) + (storeu0driver(1,32,x+1)-storeu0driver(1,32,x))*dtint
! end if
u0driver(:,:) = storeu0driver(:,:,x) + (storeu0driver(:,:,x+1)-storeu0driver(:,:,x))*dtint
v0driver(:,:) = storev0driver(:,:,x) + (storev0driver(:,:,x+1)-storev0driver(:,:,x))*dtint
w0driver(:,:) = storew0driver(:,:,x) + (storew0driver(:,:,x+1)-storew0driver(:,:,x))*dtint
! e120driver(:,:) = storee120driver(:,:,x) + (storee120driver(:,:,x+1)-storee120driver(:,:,x))*dtint
if (ltempeq) then
thl0driver(:,:) = storethl0driver(:,:,x) + (storethl0driver(:,:,x+1)-storethl0driver(:,:,x))*dtint
end if
if (lmoist) then
qt0driver(:,:) = storeqt0driver(:,:,x) + (storeqt0driver(:,:,x+1)-storeqt0driver(:,:,x))*dtint
end if
if (nsv>0 .and. lsdriver) then
sv0driver(:,:,:) = storesv0driver(:,:,:,x) + (storesv0driver(:,:,:,x+1)-storesv0driver(:,:,:,x))*dtint
end if
nstepreaddriver = x
elseif (elapsrec > 0.) then
if ((myid==0) .and. (rk3step==1)) then
write(*,'(A,I5,A,F10.3,A,I5,A,F10.3,A)') '======= Inputs interpolated from driver tsteps ',x,' (', storetdriver(x),' s) and ',x-1,' (',storetdriver(x-1),' s) ======='
end if
dtint = (timee-storetdriver(x-1))/(storetdriver(x)-storetdriver(x-1))
u0driver(:,:) = storeu0driver(:,:,x-1) + (storeu0driver(:,:,x)-storeu0driver(:,:,x-1))*dtint
v0driver(:,:) = storev0driver(:,:,x-1) + (storev0driver(:,:,x)-storev0driver(:,:,x-1))*dtint
w0driver(:,:) = storew0driver(:,:,x-1) + (storew0driver(:,:,x)-storew0driver(:,:,x-1))*dtint
! e120driver(:,:) = storee120driver(:,:,x-1) + (storee120driver(:,:,x)-storee120driver(:,:,x-1))*dtint
if (ltempeq) then
thl0driver(:,:) = storethl0driver(:,:,x-1) + (storethl0driver(:,:,x)-storethl0driver(:,:,x-1))*dtint
end if
if (lmoist) then
qt0driver(:,:) = storeqt0driver(:,:,x-1) + (storeqt0driver(:,:,x)-storeqt0driver(:,:,x-1))*dtint
end if
if (nsv>0 .and. lsdriver) then
sv0driver(:,:,:) = storesv0driver(:,:,:,x-1) + (storesv0driver(:,:,:,x)-storesv0driver(:,:,:,x-1))*dtint
end if
nstepreaddriver = x
end if
! if(myid==0) then
! write(6,'(A,F9.4)') 'Simulation time: ', timee
! write(6,'(A,F9.4)') 'dtint: ', dtint
! write(6,*) 'Velocities interpolated:'
! write(6,'(A,e20.12)') 'storeu0driver(je,ke,x-1): ', storeu0driver(je,ke,x-1)
! write(6,'(A,e20.12)') 'storeu0driver(je,ke,x): ', storeu0driver(je,ke,x)
! write(6,'(A,e20.12)') 'storeu0driver(je,ke,x+1): ', storeu0driver(je,ke,x+1)
! write(6,'(A,e20.12)') 'Interpolated inlet velocity (jb,20): ', u0driver(jb,20)
! write(6,*) 'Temperatures interpolated:'
! write(6,'(A,e20.12)') 'storethl0driver(je,20,x-1): ', storethl0driver(jb,20,x-1)
! write(6,'(A,e20.12)') 'storethl0driver(je,20,x): ', storethl0driver(jb,20,x)
! write(6,'(A,e20.12)') 'storethl0driver(je,20,x+1): ', storethl0driver(jb,20,x+1)
! write(6,'(A,e20.12)') 'Interpolated inlet temperature (jb,20): ', thl0driver(jb,20)
! end if
! umdriver = u0driver ! MAYBE ITS BETTER TO WRITE THE M VARIABLES TO FILE TOO AND JUST READ THEM - THOUGH CURRENTLY THIS IS NOT DONE FOR RESTART FILES?? ae1212
! vmdriver = v0driver ! EDIT READ AND WRITE INLET FILES (AND CHECK MODBOUNDARY & MODSURFACE) TO INCLUDE M VARIABLES
! wmdriver = w0driver
! thlmdriver = thl0driver
! qtmdriver = qt0driver
if (rk3step <= 1) then
umdriver = u0driver
vmdriver = v0driver
wmdriver = w0driver
!e12mdriver = e120driver
if (ltempeq) then
thlmdriver = thl0driver
end if
if (lmoist) then
qtmdriver = qt0driver
end if
if (nsv>0 .and. lsdriver) then
svmdriver = sv0driver
end if
end if
else
return
end if ! idrivergen
end subroutine drivergen