drivergen Subroutine

public subroutine drivergen()

Uses

  • proc~~drivergen~~UsesGraph proc~drivergen moddriver::drivergen module~modfields modfields proc~drivergen->module~modfields module~modglobal modglobal proc~drivergen->module~modglobal module~modmpi modmpi proc~drivergen->module~modmpi module~modsave modsave proc~drivergen->module~modsave mpi mpi module~modmpi->mpi

Arguments

None

Calls

proc~~drivergen~~CallsGraph proc~drivergen moddriver::drivergen proc~writedriverfile moddriver::writedriverfile proc~drivergen->proc~writedriverfile

Called by

proc~~drivergen~~CalledByGraph proc~drivergen moddriver::drivergen proc~boundary modboundary::boundary proc~boundary->proc~drivergen proc~readinitfiles modstartup::readinitfiles proc~readinitfiles->proc~drivergen proc~readinitfiles->proc~boundary proc~startup modstartup::startup proc~startup->proc~readinitfiles program~dalesurban DALESURBAN program~dalesurban->proc~boundary program~dalesurban->proc~startup

Contents

Source Code


Source Code

  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