SetUpCaseFields Subroutine

subroutine SetUpCaseFields()

Builds and writes initial flow field.

Arguments

None

Calls

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

Source Code

    subroutine SetUpCaseFields()
      !> Builds and writes initial flow field.
      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)             :: r
      real(wp)             :: a
      real(wp)             :: Vd
      real(wp)             :: Vr, Vt
      real(wp)             :: costheta
      real(wp)             :: sintheta
      real(wp)             :: rho
      real(wp)             :: mu
      real(wp)             :: Rey
      integer              :: i,j,k
      real(wp),parameter   :: twoPi=8.0_wp*atan(1.0_wp)
      ! Bessel firt root and constant C
      real(wp),parameter   :: a1 = 3.8317059702075123115_wp
      real(wp)             :: C

      ! Get info from parser
      call parser%Get("Fields IC file",  filename)
      call parser%Get("Domain size",     L       )
      call parser%Get("Dipole radius",   a       )
      call parser%Get("Dipole velocity", Vd      )
      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)

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

        ! Compute the constant
        C = 2.0_wp/J0(a1)

        do k=lo(3),hi(3)
          do j=lo(2),hi(2)
            do i=lo(1),hi(1)
              ! U - velocity
              r = sqrt((x(i))**2+(ym(j))**2)
              costheta= x (i)/(r+epsilon(1.0_wp))
              sintheta= ym(j)/(r+epsilon(1.0_wp))


              if ((r/a).le.1.0_wp) then
                r = a1*r/a
                Vr = Vd * ( C*J1(r)/(r+epsilon(1.0_wp)) - 1.0_WP ) * costheta
                Vt = Vd * ( 1.0_WP - C*(J0(r)-J1(r)/(r+epsilon(1.0_wp))) ) * sintheta
              else
                Vr = - Vd/(r/a)**2 * costheta
                Vt = - Vd/(r/a)**2 * sintheta
              end if
              V(1)%cell(i,j,k) = Vr*costheta-Vt*sintheta

              ! V - velocity
              r = sqrt((xm(i))**2+(y(j))**2)
              costheta= xm(i)/(r+epsilon(1.0_wp))
              sintheta= y (j)/(r+epsilon(1.0_wp))

              if ((r/a).le.1.0_wp) then
                r = a1*r/a
                Vr = Vd * ( C*J1(r)/(r+epsilon(1.0_wp)) - 1.0_WP ) * costheta
                Vt = Vd * ( 1.0_WP - C*(J0(r)-J1(r)/(r+epsilon(1.0_wp))) ) * sintheta
              else
                Vr = - Vd/(r/a)**2 * costheta
                Vt = - Vd/(r/a)**2 * sintheta
              end if
              V(2)%cell(i,j,k) = Vr*sintheta+Vt*costheta
            end do
          end do
        end do
      end associate

      ! Write some info to stdout
      if (parallel%RankIsRoot()) then
        ! Reynolds number
        Rey = rho*Vd*a/(mu+epsilon(1.0_wp))
        write(*,*) "Reynolds number = ", Rey
      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