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