SetUpCaseFields Subroutine

subroutine SetUpCaseFields()

Builds and writes initial flow fields.

Arguments

None

Calls

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

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)             :: radius
      real(wp)             :: circ
      real(wp)             :: rho
      real(wp)             :: mu
      real(wp)             :: Rey
      real(wp)             :: r
      real(wp)             :: sgn
      real(wp)             :: c(2)
      real(wp)             :: coef
      integer              :: i,j,k
      real(wp),parameter   :: twoPi=8.0_wp*atan(1.0_wp)

      ! Get info from parser
      call parser%Get("Fields IC file",  filename)
      call parser%Get("Domain size",     L       )
      call parser%Get("Vortex radius",   radius  )
      call parser%Get("Circulation",     circ    )
      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   )


      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)

        c = [0.5_wp*(block%pmax(1)+block%pmin(1)),0.5_wp*(block%pmax(2)+block%pmin(2))]

        sgn=(-1)
        do k=lo(3),hi(3)
          do j=lo(2),hi(2)
            do i=lo(1),hi(1)
              ! U component
              r = sqrt((x(i)-c(1))**2+(ym(j)-c(2))**2)
              coef = sgn*circ/twoPi/(r+epsilon(1.0_wp))*(1.0_WP-exp(-r**2/radius**2))
              V(1)%cell(i,j,k) = V(1)%cell(i,j,k) - coef*(ym(j)-c(2))/(r+epsilon(1.0_wp))

              ! V component
              r = sqrt((xm(i)-c(1))**2+(y(j)-c(2))**2)
              coef = sgn*circ/twoPi/(r+epsilon(1.0_wp))*(1.0_WP-exp(-r**2/radius**2))
              V(2)%cell(i,j,k) = V(2)%cell(i,j,k) + coef*(xm(i)-c(1))/(r+epsilon(1.0_wp))
            end do
          end do
        end do

        V(3) = 0.0_wp
        P    = 0.0_wp
      end associate

      ! Write some info to stdout
      if (parallel%RankIsRoot()) then
        ! Reynolds number
        Rey = (circ/twoPi/radius)*radius*rho/(mu+epsilon(1.0_wp))
        write(*,*) "Reynolds number = ", Rey
        write(*,*) "Vortex time     = ", twoPi*radius**2/circ
        write(*,*) "radius/dx       = ", radius/(block%dx(1))
        write(*,*) "radius/dy       = ", radius/(block%dx(2))
        write(*,*) "radius/dz       = ", radius/(block%dx(3))
      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