params_multigrid_setup_m.f90 Source File


Contents


Source Code

module params_multigrid_setup_m
    !! Parameter for setup of multigrids
    use screen_io_m, only :  get_stdout
    use parallelisation_setup_m, only : is_rank_info_writer
    use precision_grillix_m, only : GP
    use error_handling_grillix_m, only: handle_error
    use status_codes_grillix_m, only : GRILLIX_ERR_NAMELIST, GRILLIX_ERR_OTHER
    implicit none
    private 

    type, public :: params_multigrid_setup_t
        !! Parameters for multigrid_setup
        real(GP), private :: spacing_f
        !! Mesh spacing on finest level            
        integer, private :: nlvls 
        !! Number of multigrid levels
        integer, private :: size_neighbor
        !! Number of neighbor points stored
        integer, private :: size_ghost_layer
        !! Depth of ghost layer
        integer, private :: reorder_size
        !! Block size for reordering
        logical, private :: extend_beyond_wall
        !! Switch if mesh is extended beyond wall
    contains
        procedure, public :: set => set_parameters_multigrid_setup
        procedure, public :: get_spacing_f   
        procedure, public :: get_nlvls 
        procedure, public :: get_size_neighbor
        procedure, public :: get_size_ghost_layer
        procedure, public :: get_reorder_size
        procedure, public :: get_extend_beyond_wall
        procedure, public :: display => display_parameters_multigrid_setup  
    end type

contains 

    subroutine set_parameters_multigrid_setup(self, filename, spacing_f_in, nlvls_in, &
                       size_neighbor_in,  size_ghost_layer_in, reorder_size_in, extend_beyond_wall_in)
        !! Sets parameters for multigrid_setup, either via namelist from file, or setting explicitly 
        class(params_multigrid_setup_t), intent(inout) :: self
        !! Instance of the type   
        character(*), intent(in), optional :: filename
        !! Filename where parameter are read from
        real(GP), intent(in), optional :: spacing_f_in
        !! Mesh spacing on finest level 
        integer, intent(in), optional :: nlvls_in
        !! Number of multigrid levels
        integer, intent(in), optional :: size_neighbor_in
        !! Number of neighbor points stored
        integer, intent(in), optional :: size_ghost_layer_in
        !! Depth of ghost layer
        integer, intent(in), optional :: reorder_size_in
        !! Block size for reordering
        logical, intent(in), optional :: extend_beyond_wall_in
        !! Switch if mesh is extended beyond wall
        
        real(GP) :: spacing_f
        integer :: nlvls, size_neighbor, size_ghost_layer, reorder_size
        logical :: extend_beyond_wall

        integer :: io_error
        character(len=256) :: io_errmsg

        namelist / params_multigrid_setup / &
            spacing_f, nlvls, size_neighbor, size_ghost_layer, reorder_size, &
            extend_beyond_wall

        if ( (.not.present(filename))       .and. &
           (present(spacing_f_in))          .and. &
           (present(nlvls_in))              .and. &
           (present(size_neighbor_in))      .and. &
           (present(size_ghost_layer_in))   .and. &
           (present(reorder_size_in))       .and. & 
           (present(extend_beyond_wall_in))       ) then  
            ! input via explicit setting    
            self%spacing_f          = spacing_f_in
            self%nlvls              = nlvls_in
            self%size_neighbor      = size_neighbor_in
            self%size_ghost_layer   = size_ghost_layer_in
            self%reorder_size       = reorder_size_in 
            self%extend_beyond_wall = extend_beyond_wall_in
        elseif ( (present(filename))                .and. &
           (.not.present(spacing_f_in))          .and. &
           (.not.present(nlvls_in))              .and. &
           (.not.present(size_neighbor_in))      .and. &
           (.not.present(size_ghost_layer_in))   .and. &
           (.not.present(reorder_size_in))       .and. &
           (.not.present(extend_beyond_wall_in))       ) then    
            ! Input via file 
  
            ! Default setting
            spacing_f           = 2.0E-3_GP
            nlvls               = 4
            size_neighbor       = 2
            size_ghost_layer    = 2
            reorder_size        = 8
            extend_beyond_wall = .false.

            open(unit = 20, file = filename, status = 'old', action = 'read',&
                 iostat = io_error, iomsg = io_errmsg)
            if (io_error /= 0) then
                call handle_error(io_errmsg, GRILLIX_ERR_NAMELIST, __LINE__, __FILE__)
            endif

            read(20, nml = params_multigrid_setup, iostat = io_error, iomsg = io_errmsg)
            if (io_error /= 0) then
                call handle_error(io_errmsg, GRILLIX_ERR_NAMELIST, __LINE__, __FILE__)
            endif

            close(20)

            self%spacing_f          = spacing_f
            self%nlvls              = nlvls
            self%size_neighbor      = size_neighbor
            self%size_ghost_layer   = size_ghost_layer
            self%reorder_size       = reorder_size            
            self%extend_beyond_wall = extend_beyond_wall
        else
            call handle_error('Input to subroutine not consistent', &
                              GRILLIX_ERR_OTHER, __LINE__, __FILE__)
        endif       

    end subroutine

    pure real(GP) function get_spacing_f(self)
        !! Gets mesh spacing on finest level 
        class(params_multigrid_setup_t), intent(in) :: self
        !! Instance of the type   
        get_spacing_f = self%spacing_f    
    end function 

    pure integer function get_nlvls(self)
        !! Gets number of multigrid levels
        class(params_multigrid_setup_t), intent(in) :: self
        !! Instance of the type
        get_nlvls = self%nlvls
    end function 

    pure integer function get_size_neighbor(self)
        !! Gets size_neighbor
        class(params_multigrid_setup_t), intent(in) :: self
        !! Instance of the type
        get_size_neighbor = self%size_neighbor
    end function 

    pure integer function get_size_ghost_layer(self)
        !! Gets size_ghost_layer
        class(params_multigrid_setup_t), intent(in) :: self
        !! Instance of the type
        get_size_ghost_layer = self%size_ghost_layer
    end function 

    pure integer function get_reorder_size(self)
        !! Gets reorder
        class(params_multigrid_setup_t), intent(in) :: self
        !! Instance of the type
        get_reorder_size = self%reorder_size
    end function 
    
    logical function get_extend_beyond_wall(self)
        !! Gets reorder
        class(params_multigrid_setup_t), intent(in) :: self
        !! Instance of the type
        get_extend_beyond_wall = self%extend_beyond_wall
    end function 

    subroutine display_parameters_multigrid_setup (self)
        !! Displays information about parameters
        class(params_multigrid_setup_t), intent(in) :: self
        !! Instance of the type   

         if (is_rank_info_writer) then
            write(get_stdout(),201)self%spacing_f, self%nlvls, self%size_neighbor, &
                             self%size_ghost_layer, self%reorder_size, &
                             self%extend_beyond_wall
 201        FORMAT(/ &
                'Parameters multigrid_setup-----------------' /, &
                1X,'spacing_f          = ',ES14.6E3       /, &
                1X,'nlvls              = ',I5             /, &
                1X,'size_neighbor      = ',I5             /, &
                1X,'size_ghost_layer   = ',I5             /, &
                1X,'reorder_size       = ',I5             /, &
                1X,'extend_beyond_wall = ',L1             /, &
                '-------------------------------------------')
        endif

    end subroutine    

end module