SetUpCaseFields Subroutine

subroutine SetUpCaseFields()

Uses

  • proc~~setupcasefields~4~~UsesGraph proc~setupcasefields~4 SetUpCaseFields iso_fortran_env iso_fortran_env proc~setupcasefields~4->iso_fortran_env

Builds and writes initial fields.

Arguments

None

Calls

proc~~setupcasefields~4~~CallsGraph proc~setupcasefields~4 SetUpCaseFields none~get parser_obj%Get proc~setupcasefields~4->none~get proc~buildfouriermodes BuildFourierModes proc~setupcasefields~4->proc~buildfouriermodes proc~eulerian_set_add eulerian_set%eulerian_set_Add proc~setupcasefields~4->proc~eulerian_set_add proc~eulerian_set_final eulerian_set%eulerian_set_Final proc~setupcasefields~4->proc~eulerian_set_final proc~eulerian_set_init eulerian_set%eulerian_set_Init proc~setupcasefields~4->proc~eulerian_set_init proc~eulerian_set_setwritefilename eulerian_set%eulerian_set_SetWriteFileName proc~setupcasefields~4->proc~eulerian_set_setwritefilename proc~invertfouriermodes InvertFourierModes proc~setupcasefields~4->proc~invertfouriermodes proc~parser_obj_read0d parser_obj%parser_obj_read0D none~get->proc~parser_obj_read0d proc~parser_obj_read1d parser_obj%parser_obj_read1D none~get->proc~parser_obj_read1d proc~getenergyspectrum GetEnergySpectrum proc~buildfouriermodes->proc~getenergyspectrum proc~eulerian_obj_init eulerian_obj_base%eulerian_obj_Init proc~eulerian_set_add->proc~eulerian_obj_init proc~hashtbl_obj_hashstring hashtbl_obj%hashtbl_obj_HashString proc~eulerian_set_add->proc~hashtbl_obj_hashstring proc~hashtbl_obj_put hashtbl_obj%hashtbl_obj_Put proc~eulerian_set_add->proc~hashtbl_obj_put proc~eulerian_obj_final eulerian_obj_base%eulerian_obj_Final proc~eulerian_set_final->proc~eulerian_obj_final proc~hashtbl_obj_init hashtbl_obj%hashtbl_obj_Init proc~eulerian_set_init->proc~hashtbl_obj_init dfftw_destroy_plan dfftw_destroy_plan proc~invertfouriermodes->dfftw_destroy_plan proc~sllist_obj_put sllist_obj%sllist_obj_Put proc~hashtbl_obj_put->proc~sllist_obj_put none~assigndefault parser_obj%AssignDefault proc~parser_obj_read0d->none~assigndefault proc~parser_obj_fetchlabelid parser_obj%parser_obj_FetchLabelID proc~parser_obj_read0d->proc~parser_obj_fetchlabelid proc~parser_obj_read1d->none~assigndefault proc~parser_obj_read1d->proc~parser_obj_fetchlabelid proc~parser_obj_assigndefault0d parser_obj%parser_obj_AssignDefault0D none~assigndefault->proc~parser_obj_assigndefault0d proc~parser_obj_assigndefault1d parser_obj%parser_obj_AssignDefault1D none~assigndefault->proc~parser_obj_assigndefault1d proc~sllist_obj_put->proc~sllist_obj_put

Called by

proc~~setupcasefields~4~~CalledByGraph proc~setupcasefields~4 SetUpCaseFields program~main~8 main program~main~8->proc~setupcasefields~4

Source Code

    subroutine SetUpCaseFields()
      !> Builds and writes initial fields.
      use iso_fortran_env, only : stdout => output_unit
      implicit none
      ! Work variables
      type(Eulerian_set)   :: fields
      type(eulerian_obj_r) :: V(3)
      type(eulerian_obj_r) :: P
      character(str64)     :: filename
      real(wp)             :: rho
      real(wp)             :: mu
      real(wp)             :: nu
      real(wp)             :: dissipation_rate
      real(wp)             :: Re_lambda
      integer              :: peak_mode
      real(wp)             :: ell
      real(wp)             :: L(3)
      integer              :: Nk(3)
      complex(wp),          &
               allocatable :: Vk(:,:,:,:)
      real(wp)             :: lambda
      real(wp)             :: Vrms
      real(wp)             :: eta_k
      real(wp)             :: dV
      integer              :: i,j,k
      real(wp), parameter  :: C=0.19_wp

      ! Get info from parser
      call parser%Get("Fields IC file",   filename               )
      call parser%Get("Fluid density",    rho                    )
      call parser%Get("Fluid viscosity",  mu                     )
      call parser%Get("Reynolds number",  Re_lambda              )
      call parser%Get("Peak mode",        peak_mode, default = 4 )

      ! Initialize fields container
      call fields%Initialize(block,parallel)

      ! Add fields to container (this will allocate data)
      call fields%Add('V1', 1, V(1))
      call fields%Add('V2', 2, V(2))
      call fields%Add('V3', 3, V(3))
      call fields%Add('P',  0, P   )

      ! Kinematic viscosity
      nu = mu/rho

      ! Domain size
      L = block%pmax - block%pmin

      ! Integral length scale based on Rosales & Meneveau, Physics of Fluids, 2005
      ell = C*minval(L)

      ! Dissipation rate
      dissipation_rate = (nu/15.0_wp)**3*Re_lambda**6/ell**4

      ! Velocity fluctuation rms
      Vrms = (dissipation_rate*ell)**(1.0_wp/3.0_wp)

      call BuildFourierModes(Vrms,peak_mode,Nk,Vk)
      call InvertFourierModes(Nk,Vk,V)

      deallocate(Vk)

      ! Rescale
      Vrms = 0.0_wp
      do k=block%lo(3),block%hi(3)
        do j=block%lo(2),block%hi(2)
          do i=block%lo(1),block%hi(1)
            dV = (block%xm(i+1)-block%xm(i)) &
               * (block%ym(j+1)-block%ym(j)) &
               * (block%zm(k+1)-block%zm(k))
            Vrms = Vrms +(V(1)%cell(i,j,k)**2 &
                        + V(2)%cell(i,j,k)**2 &
                        + V(3)%cell(i,j,k)**2)*dV
          end do
        end do
      end do
      Vrms = sqrt((1.0_wp/3.0_wp)/(L(1)*L(2)*L(3))*Vrms)

      V(1)%cell = V(1)%cell* sqrt(nu*Re_lambda/ sqrt(15.0_wp*nu/dissipation_rate))/Vrms
      V(2)%cell = V(2)%cell* sqrt(nu*Re_lambda/ sqrt(15.0_wp*nu/dissipation_rate))/Vrms
      V(3)%cell = V(3)%cell* sqrt(nu*Re_lambda/ sqrt(15.0_wp*nu/dissipation_rate))/Vrms

      ! Compute urms
      Vrms = 0.0_wp
      do k=block%lo(3),block%hi(3)
        do j=block%lo(2),block%hi(2)
          do i=block%lo(1),block%hi(1)
            dV = (block%xm(i+1)-block%xm(i)) &
               * (block%ym(j+1)-block%ym(j)) &
               * (block%zm(k+1)-block%zm(k))
            Vrms = Vrms +(V(1)%cell(i,j,k)**2 &
                        + V(2)%cell(i,j,k)**2 &
                        + V(3)%cell(i,j,k)**2)*dV
          end do
        end do
      end do
      Vrms = sqrt((1.0_wp/3.0_wp)/(L(1)*L(2)*L(3))*Vrms)

      lambda    = sqrt(15.0_wp*nu/dissipation_rate)*Vrms
      Re_lambda = lambda*Vrms/nu
      eta_k     = (nu**0.75_wp)/(dissipation_rate**0.25_wp)

      write(stdout,*) "Taylor Microscale Reynolds : ", Re_lambda
      write(stdout,*) "Velocity fluctuation rms   : ", Vrms
      write(stdout,*) "Taylor microscale (lambda) : ", lambda
      write(stdout,*) "Kolomogorov length (eta_k) : ", eta_k
      write(stdout,*) "Dissipation rate           : ", dissipation_rate
      write(stdout,*) "Eddy turounover time       : ", Vrms**2/dissipation_rate
      write(stdout,*) "HIT linear forcing         : ", dissipation_rate/(3.0_wp*Vrms**2)
      write(stdout,*) "Resolution (kmax*eta_k)    : ", 4.0_wp*atan(1.0_wp)*minval(Ng/L)*eta_k


      ! Write data to disk
      call fields%SetWriteFileName(filename)
      call fields%Write(0,0.0_wp)

      ! Clear data
      call fields%Finalize()

      return
    end subroutine SetUpCaseFields