main Program

Uses

  • program~~main~7~~UsesGraph program~main~7 main module~leapblock leapBlock program~main~7->module~leapblock module~leapeulerian leapEulerian program~main~7->module~leapeulerian module~leapkinds leapKinds program~main~7->module~leapkinds module~leapparallel leapParallel program~main~7->module~leapparallel module~leapparser leapParser program~main~7->module~leapparser module~leapblock->module~leapkinds module~leapblock->module~leapparallel iso_fortran_env iso_fortran_env module~leapblock->iso_fortran_env module~leapio_hdf5 leapIO_hdf5 module~leapblock->module~leapio_hdf5 mpi_f08 mpi_f08 module~leapblock->mpi_f08 module~leapeulerian->module~leapblock module~leapeulerian->module~leapkinds module~leapeulerian->module~leapparallel module~leapeulerian->iso_fortran_env module~leapio leapIO module~leapeulerian->module~leapio module~leaputils leapUtils module~leapeulerian->module~leaputils module~leapeulerian->mpi_f08 module~leapkinds->iso_fortran_env module~leapparallel->module~leapkinds module~leapparallel->iso_fortran_env module~leapparallel->mpi_f08 module~leapparser->module~leapkinds module~leapparser->iso_fortran_env module~leapcli leapCli module~leapparser->module~leapcli module~leapcli->module~leapkinds module~leapio->module~leapio_hdf5 module~leapio_h5hut leapIO_h5hut module~leapio->module~leapio_h5hut module~leapio_silo leapIO_silo module~leapio->module~leapio_silo module~leapio_xdmf leapIO_xdmf module~leapio->module~leapio_xdmf module~leapio_hdf5->module~leapkinds module~leapio_hdf5->module~leapparallel module~leapio_hdf5->module~leaputils hdf5 hdf5 module~leapio_hdf5->hdf5 module~leaputils->module~leapkinds module~leapio_h5hut->module~leapkinds module~leapio_h5hut->module~leapparallel module~leapio_h5hut->module~leapio_hdf5 module~leapio_silo->module~leapkinds module~leapio_silo->module~leapparallel module~leapio_silo->module~leaputils module~leapio_silo->mpi_f08 module~leapio_xdmf->module~leapkinds module~leapio_xdmf->module~leaputils

Solver: GRANS

Description: Simulates the cooling of an initially homogeneous system (i.e., randomly placed) of particles (either point particles (PP) and/or resolved particles (RP)) due to inelastic collisions.

References: Haff, P. K., 1983, “Grain Flow as a Fluid-Mechanical Phenomenon,” Journal of Fluid Mechanics, 134, pp. 401–430.



Calls

program~~main~7~~CallsGraph program~main~7 main proc~block_obj_final block_obj%block_obj_Final program~main~7->proc~block_obj_final proc~parser_obj_init parser_obj%parser_obj_init program~main~7->proc~parser_obj_init proc~parser_obj_parsefile parser_obj%parser_obj_ParseFile program~main~7->proc~parser_obj_parsefile proc~setupcasebcs~7 SetUpCaseBCS program~main~7->proc~setupcasebcs~7 proc~setupcaseblock~7 SetUpCaseBlock program~main~7->proc~setupcaseblock~7 proc~setupcasepp~2 SetUpCasePP program~main~7->proc~setupcasepp~2 mpi_type_free mpi_type_free proc~block_obj_final->mpi_type_free proc~axis_obj_final axis_obj%axis_obj_Final proc~block_obj_final->proc~axis_obj_final proc~cli_obj_get cli_obj%cli_obj_Get proc~parser_obj_parsefile->proc~cli_obj_get proc~parser_obj_parseline parser_obj%parser_obj_ParseLine proc~parser_obj_parsefile->proc~parser_obj_parseline proc~bc_set_final bc_set%bc_set_Final proc~setupcasebcs~7->proc~bc_set_final proc~bc_set_init bc_set%bc_set_Init proc~setupcasebcs~7->proc~bc_set_init none~get parser_obj%Get proc~setupcaseblock~7->none~get none~initialize~10 block_obj%Initialize proc~setupcaseblock~7->none~initialize~10 proc~block_obj_partition block_obj%block_obj_Partition proc~setupcaseblock~7->proc~block_obj_partition proc~block_obj_setperiodicity block_obj%block_obj_SetPeriodicity proc~setupcaseblock~7->proc~block_obj_setperiodicity proc~block_obj_setupuniformgrid block_obj%block_obj_SetupUniformGrid proc~setupcaseblock~7->proc~block_obj_setupuniformgrid none~finalize~28 particle_set%Finalize proc~setupcasepp~2->none~finalize~28 proc~setupcasepp~2->none~get none~initialize~28 particle_set%Initialize proc~setupcasepp~2->none~initialize~28 p p proc~setupcasepp~2->p particle particle proc~setupcasepp~2->particle proc~lagrangian_set_applyperiodicity lagrangian_set%lagrangian_set_ApplyPeriodicity proc~setupcasepp~2->proc~lagrangian_set_applyperiodicity proc~lagrangian_set_resize lagrangian_set%lagrangian_set_Resize proc~setupcasepp~2->proc~lagrangian_set_resize proc~lagrangian_set_setwritefilename lagrangian_set%lagrangian_set_SetWriteFileName proc~setupcasepp~2->proc~lagrangian_set_setwritefilename proc~parallel_obj_rankisroot parallel_obj%parallel_obj_RankIsRoot proc~setupcasepp~2->proc~parallel_obj_rankisroot proc~particle_set_changeparttype particle_set%particle_set_ChangePartType proc~setupcasepp~2->proc~particle_set_changeparttype proc~respart_set_final ResPart_set%ResPart_set_Final none~finalize~28->proc~respart_set_final 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~block_obj_init block_obj%block_obj_Init none~initialize~10->proc~block_obj_init proc~block_obj_init2 block_obj%block_obj_Init2 none~initialize~10->proc~block_obj_init2 proc~respart_set_init ResPart_set%ResPart_set_Init none~initialize~28->proc~respart_set_init proc~region_obj_final region_obj%region_obj_Final proc~bc_set_final->proc~region_obj_final proc~hashtbl_obj_init hashtbl_obj%hashtbl_obj_Init proc~bc_set_init->proc~hashtbl_obj_init proc~block_obj_partition->proc~axis_obj_final proc~axis_obj_init axis_obj%axis_obj_Init proc~block_obj_partition->proc~axis_obj_init proc~block_obj_setconveniencepointers block_obj%block_obj_SetConveniencePointers proc~block_obj_partition->proc~block_obj_setconveniencepointers proc~block_obj_setupmpitypes block_obj%block_obj_SetupMPITypes proc~block_obj_partition->proc~block_obj_setupmpitypes proc~block_obj_subdivideblock block_obj%block_obj_SubDivideBlock proc~block_obj_partition->proc~block_obj_subdivideblock proc~block_obj_updategridghostcells block_obj%block_obj_UpdateGridGhostCells proc~block_obj_partition->proc~block_obj_updategridghostcells proc~block_obj_updatemidpoints block_obj%block_obj_UpdateMidPoints proc~block_obj_partition->proc~block_obj_updatemidpoints proc~block_obj_updatespacing block_obj%block_obj_UpdateSpacing proc~block_obj_partition->proc~block_obj_updatespacing proc~parallel_obj_topology parallel_obj%parallel_obj_Topology proc~block_obj_partition->proc~parallel_obj_topology proc~block_obj_setupuniformgrid->proc~axis_obj_init proc~block_obj_setupuniformgrid->proc~block_obj_setconveniencepointers proc~block_obj_setupuniformgrid->proc~block_obj_setupmpitypes proc~block_obj_setupuniformgrid->proc~block_obj_updategridghostcells proc~block_obj_setupuniformgrid->proc~block_obj_updatemidpoints proc~block_obj_setupuniformgrid->proc~block_obj_updatespacing proc~parser_obj_addentry parser_obj%parser_obj_AddEntry proc~parser_obj_parseline->proc~parser_obj_addentry proc~parser_obj_fetchlabelid parser_obj%parser_obj_FetchLabelID proc~parser_obj_parseline->proc~parser_obj_fetchlabelid proc~parser_obj_reformatline parser_obj%parser_obj_ReformatLine proc~parser_obj_parseline->proc~parser_obj_reformatline proc~particle_set_changeparttype->proc~lagrangian_set_resize proc~lagrangian_set_creatempitype lagrangian_set%lagrangian_set_CreateMPIType proc~particle_set_changeparttype->proc~lagrangian_set_creatempitype proc~lagrangian_set_freempitype lagrangian_set%lagrangian_set_FreeMPIType proc~particle_set_changeparttype->proc~lagrangian_set_freempitype proc~particle_set_setobjecttype particle_set%particle_set_SetObjectType proc~particle_set_changeparttype->proc~particle_set_setobjecttype proc~block_obj_init2->proc~block_obj_setupuniformgrid proc~block_obj_setupmpitypes->mpi_type_free mpi_type_commit mpi_type_commit proc~block_obj_setupmpitypes->mpi_type_commit mpi_type_vector mpi_type_vector proc~block_obj_setupmpitypes->mpi_type_vector mpi_irecv mpi_irecv proc~block_obj_updategridghostcells->mpi_irecv mpi_isend mpi_isend proc~block_obj_updategridghostcells->mpi_isend mpi_wait mpi_wait proc~block_obj_updategridghostcells->mpi_wait mpi_waitall mpi_waitall proc~block_obj_updategridghostcells->mpi_waitall proc~block_obj_updateextents block_obj%block_obj_UpdateExtents proc~block_obj_updategridghostcells->proc~block_obj_updateextents SetMPIDataTypeParams SetMPIDataTypeParams proc~lagrangian_set_creatempitype->SetMPIDataTypeParams proc~lagrangian_set_creatempitype->mpi_type_commit mpi_type_create_resized mpi_type_create_resized proc~lagrangian_set_creatempitype->mpi_type_create_resized mpi_type_create_struct mpi_type_create_struct proc~lagrangian_set_creatempitype->mpi_type_create_struct mpi_type_get_extent mpi_type_get_extent proc~lagrangian_set_creatempitype->mpi_type_get_extent mpi_type_size mpi_type_size proc~lagrangian_set_creatempitype->mpi_type_size proc~lagrangian_set_freempitype->mpi_type_free mpi_cart_coords mpi_cart_coords proc~parallel_obj_topology->mpi_cart_coords mpi_cart_create mpi_cart_create proc~parallel_obj_topology->mpi_cart_create mpi_cart_rank mpi_cart_rank proc~parallel_obj_topology->mpi_cart_rank mpi_cart_shift mpi_cart_shift proc~parallel_obj_topology->mpi_cart_shift mpi_comm_rank mpi_comm_rank proc~parallel_obj_topology->mpi_comm_rank mpi_dims_create mpi_dims_create proc~parallel_obj_topology->mpi_dims_create proc~parser_obj_read0d->proc~parser_obj_fetchlabelid none~assigndefault parser_obj%AssignDefault proc~parser_obj_read0d->none~assigndefault proc~parser_obj_read1d->proc~parser_obj_fetchlabelid proc~parser_obj_read1d->none~assigndefault proc~hashtbl_obj_final hashtbl_obj%hashtbl_obj_Final proc~region_obj_final->proc~hashtbl_obj_final proc~respart_set_final->proc~lagrangian_set_freempitype none~finalize~27 marker_set%Finalize proc~respart_set_final->none~finalize~27 proc~respart_set_init->proc~lagrangian_set_resize proc~respart_set_init->proc~lagrangian_set_creatempitype none~initialize~27 marker_set%Initialize proc~respart_set_init->none~initialize~27 proc~respart_set_setobjecttype ResPart_set%ResPart_set_SetObjectType proc~respart_set_init->proc~respart_set_setobjecttype 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 none~finalize~27->proc~respart_set_final none~initialize~27->proc~respart_set_init proc~block_obj_updateextents->proc~axis_obj_init

Variables

Type Attributes Name Initial
type(block_obj) :: block

Block object manages the Cartesian grid

type(parallel_obj) :: parallel

Utility that handles parallel (MPI) functions

type(parser_obj) :: parser

Utility that parses input files


Subroutines

subroutine SetUpCaseBCS()

Defines boundary conditions.

Arguments

None

subroutine SetUpCaseBlock()

Builds and writes block file.

Arguments

None

subroutine SetUpCasePP()

Builds and writes point particles.

Arguments

None

Source Code

program main
  !>--------------------------------------------------------------------------
  ! Program: Homogeneous Cooling
  ! Author: Mohamed Houssem Kasbaoui
  !
  ! Solver: GRANS
  !
  ! Description: Simulates the cooling of an initially homogeneous system
  ! (i.e., randomly placed) of particles (either point particles (PP) and/or
  ! resolved particles (RP)) due to inelastic collisions.
  !
  ! References:
  ! Haff, P. K., 1983, “Grain Flow as a Fluid-Mechanical Phenomenon,”
  ! Journal of Fluid Mechanics, 134, pp. 401–430.
  ! --------------------------------------------------------------------------
  use leapKinds
  use leapParser
  use leapParallel
  use leapBlock
  use leapEulerian
  implicit none
  type(parallel_obj) :: parallel                                               !! Utility that handles parallel (MPI) functions
  type(parser_obj)   :: parser                                                 !! Utility that parses input files
  type(block_obj)    :: block                                                  !! Block object manages the Cartesian grid

  ! Initialize parser
  call parser%Initialize()

  ! Parse input file
  call parser%ParseFile()

  ! Initialize parallel environment
  call parallel%Initialize()

  ! Set the block info
  call SetUpCaseBlock()

  ! Set the point particles
  call SetUpCasePP()

  ! Set boundary conditions
  call SetUpCaseBCS()

  ! Free up data
  call block%Finalize()
  call parser%Finalize()
  call parallel%Finalize()
  contains
    subroutine SetUpCaseBlock()
      !> Builds and writes block file.
      implicit none
      ! Work variables
      character(str64) :: filename
      real(wp)         :: L(3)
      integer          :: N(3)
      integer          :: ngc
      integer          :: Nb(3)
      real(wp)         :: xlo(3)
      real(wp)         :: xhi(3)
      integer          :: ilo(3)
      integer          :: ihi(3)

      ! Get info from parser
      call parser%Get("Block file",  filename)
      call parser%Get("Domain size", L       )
      call parser%Get("Grid points", N       )
      call parser%Get("Ghost cells", ngc     )
      call parser%Get("Partition",   Nb      )

      ! Domain extents
      xlo=-0.5_wp*L ; xhi= 0.5_wp*L
      ilo=[1,1,1] ; ihi=N

      ! Initialize the main block
      call block%Initialize(ngc,parallel)

      ! Setup the domain periodicity
      call block%SetPeriodicity([.true.,.true.,.true.])

      ! Create a uniform block
      call block%SetupUniformGrid(xlo,xhi,ilo,ihi)

      ! Partition block for parallel initializations
      call block%Partition(Nb)

      ! Write block to disk
      call block%Write(filename)

      return
    end subroutine SetUpCaseBlock
    subroutine SetUpCasePP()
      use particles_point
      !> Builds and writes point particles.
      implicit none
      ! Work variables
      type(particle_set) :: PP
      character(str64)   :: filename
      character(str64)   :: part_type
      real(wp)           :: L(3)
      integer            :: Np
      real(wp)           :: dp
      real(wp)           :: VFP
      real(wp)           :: Vmag
      real(wp)           :: Vp
      real(wp)           :: Lp
      real(wp)           :: rhop
      real(wp)           :: rand(3)
      integer            :: i,j,k,n
      integer            :: iimax,jjmax,kkmax
      real(wp),parameter :: Pi=4.0_wp*atan(1.0_wp)

      ! Get info from parser
      call parser%Get("PP IC file",  filename)
      call parser%Get("Particle vol. frac.", VFP      )
      call parser%Get("Particle diameter",   dp       )
      call parser%Get("Particle density",    rhop     )
      call parser%Get("Particle velocity",   Vmag     )
      call parser%Get("Particle type",       part_type, default = 'default')

      ! Initialize point particle data data
      call PP%Initialize('PP',block,parallel)
      call PP%ChangePartType(part_type)


      if (parallel%RankIsRoot()) then

        L = block%pmax - block%pmin
        ! Particle volume
        Vp    = Pi/6.0_wp*dp**3
        ! Particle spacing
        LP    = (VP/VFP)**(1.0_wp/3.0_wp)
        ! Particle lattice
        iimax = floor( L(1)/Lp)
        jjmax = floor( L(2)/Lp)
        kkmax = floor( L(3)/Lp)

        Np    = iimax*jjmax*kkmax

        ! Activate Np particles
        call PP%Resize(Np)

        ! Place particles in head-on collisions
        select type (particle => PP%p)
        class is (particle_obj)
          do k=1,kkmax
            do j=1,jjmax
              do i=1,iimax
                n = i + (j-1)*iimax + (k-1)*jjmax*iimax
                ! Particle global ID
                particle(n)%id = int(n, kind=8)
                ! Particle diameter
                particle(n)%d  = dp
                ! Particle position
                particle(n)%p(1) = block%pmin(1) + real(i-0.5_wp,wp)*L(1)/real(iimax,wp)
                particle(n)%p(2) = block%pmin(2) + real(j-0.5_wp,wp)*L(2)/real(jjmax,wp)
                particle(n)%p(3) = block%pmin(3) + real(k-0.5_wp,wp)*L(3)/real(kkmax,wp)
                ! Particle velocity
                call random_number(rand)
                particle(n)%v  = Vmag*(rand-0.5_wp)
                ! Particle density
                particle(n)%rho= rhop
                ! Force and Torque on particle
                particle(n)%Fh = 0.0_wp
                particle(n)%Th = 0.0_wp
                particle(n)%Fc = 0.0_wp
                particle(n)%Tc = 0.0_wp
              end do
            end do
          end do
        end select

      end if

      ! Apply periodicity
      call PP%ApplyPeriodicity()

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

      ! Clear data
      call PP%Finalize()
      return
    end subroutine SetUpCasePP
    subroutine SetUpCaseBCS()
      !> Defines boundary conditions.
      use leapBC
      implicit none
      ! Work variables
      type(bc_set) :: bcs

      ! Initialize utility that handles boundary conditions
      call bcs%Initialize(block,parallel)

      ! Fully-periodic, nothing to do

      ! Write boundary conditions
      call bcs%Write(0,0.0_wp)

      ! Clear data
      call bcs%Finalize()

      return
    end subroutine SetUpCaseBCS
end program main