SetUpCaseFields Subroutine

subroutine SetUpCaseFields()

Builds and writes initial flow fields.

Arguments

None

Calls

proc~~setupcasefields~2~~CallsGraph proc~setupcasefields~2 SetUpCaseFields none~get parser_obj%Get proc~setupcasefields~2->none~get proc~eulerian_set_add eulerian_set%eulerian_set_Add proc~setupcasefields~2->proc~eulerian_set_add proc~eulerian_set_final eulerian_set%eulerian_set_Final proc~setupcasefields~2->proc~eulerian_set_final proc~eulerian_set_init eulerian_set%eulerian_set_Init proc~setupcasefields~2->proc~eulerian_set_init proc~eulerian_set_setwritefilename eulerian_set%eulerian_set_SetWriteFileName proc~setupcasefields~2->proc~eulerian_set_setwritefilename proc~parallel_obj_rankisroot parallel_obj%parallel_obj_RankIsRoot proc~setupcasefields~2->proc~parallel_obj_rankisroot 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~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 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~2~~CalledByGraph proc~setupcasefields~2 SetUpCaseFields program~main~3 main program~main~3->proc~setupcasefields~2

Source Code

    subroutine SetUpCaseFields()
      !> Builds and writes initial flow fields.
      implicit none
      ! Work variables
      type(Eulerian_set)   :: fields
      type(eulerian_obj_r) :: V(3)
      type(eulerian_obj_r) :: P
      character(str64)     :: filename
      real(wp)             :: L(3)
      real(wp)             :: Reb
      real(wp)             :: h
      real(wp)             :: Vbulk
      real(wp)             :: Vfric
      real(wp)             :: Vlaminar
      real(wp)             :: rand
      real(wp)             :: amp
      real(wp)             :: rho
      real(wp)             :: mu
      real(wp)             :: Cf
      real(wp)             :: tau_w
      real(wp)             :: pgrad
      real(wp)             :: ymin,ymax
      integer              :: i,j,k
      real(wp), parameter  :: twoPi=8.0_wp*atan(1.0_wp)
      real(wp), parameter  :: Re_transition = 650.0_wp

      ! Get info from parser
      call parser%Get("Fields IC file",        filename)
      call parser%Get("Domain size",           L       )
      call parser%Get('Bulk Reynolds',         Reb     )
      call parser%Get('Fluctuation amplitude', amp     )
      call parser%Get("Fluid density",         rho     )
      call parser%Get("Fluid viscosity",       mu      )

      ! 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   )


      ! Channel half height and mean velocity
      h     = 0.5_wp*L(2)
      Vbulk = Reb*(mu/rho)/h

      associate (lo => block%lo, hi=> block%hi,          &
          x =>block%x , y =>block%y,  z => block%z, &
          xm=>block%xm, ym=>block%ym, zm=> block%zm)

        V(1) = 0.0_wp
        V(2) = 0.0_wp
        V(3) = 0.0_wp
        P    = 0.0_wp

        ! Base laminar flow
        ymin = block%pmin(2)
        ymax = block%pmax(2)
        do k=lo(3),hi(3)
          do j=lo(2),hi(2)
            do i=lo(1),hi(1)
              ! Base laminar contribution
              Vlaminar = Vbulk*6.0_wp*(ym(j)-ymin)*(ymax-ym(j))/(ymax-ymin)**2
              ! Add perturbation to make transition faster
              call random_number(rand)
              V(1)%cell(i,j,k) = Vlaminar + Vbulk*amp*(rand-0.5_wp)*cos(8.0_wp*twoPi*zm(k)/L(3))
              call random_number(rand)
              V(3)%cell(i,j,k) = 0.0_wp  +  Vbulk*amp*(rand-0.5_wp)*cos(8.0_wp*twoPi*xm(i)/L(1))
            end do
          end do
        end do
      end associate

      ! Determine friction factor
      if (Reb.le.Re_transition) then
        Cf    = 6.0_wp/Reb
      else
        ! Dean's formula
        Cf    = 0.0614_wp/Reb**0.25_wp
      end if

      ! Determine other flow parameters
      tau_w = 0.5_wp*rho*Vbulk**2*Cf
      pgrad = -tau_w/h
      Vfric = sqrt(tau_w/rho)

      ! Write some info to stdout
      if (parallel%RankIsRoot()) then
        write(*,*) "Bulk Reynolds     = ", Reb
        write(*,*) "Friction Reynolds = ", rho*Vfric*h/mu
        write(*,*) "Bulk velocity     = ", Vbulk
        write(*,*) "Friction velocity = ", Vfric
        write(*,*) "Pressure gradient = ", pgrad
        write(*,*) "min dx(1)/del_v   = ", block%dx(1)*(rho*Vfric)/mu
        write(*,*) "min dx(2)/del_v   = ", block%dx(2)*(rho*Vfric)/mu
        write(*,*) "min dx(3)/del_v   = ", block%dx(3)*(rho*Vfric)/mu
      end if

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

      ! Clear data
      call fields%Finalize()

      return
    end subroutine SetUpCaseFields