module facade_params_m !! Holds all parameters of BRAGINSKII model and neutral parameters !! This is a facade module to ease handling of parameters use error_handling_grillix_m, only: handle_error use status_codes_grillix_m, only : GRILLIX_ERR_NAMELIST, GRILLIX_ERR_OTHER use screen_io_m, only : get_stdout use technical_constants_m, only : PATHLEN_MAX use params_feature_selection_m use params_tstep_m use params_brag_model_m use params_brag_pardiss_model_m use params_brag_numdiss_m use params_brag_buffer_m use params_brag_floors_m use params_brag_switches_m use params_brag_sources_external_select_m use params_brag_boundaries_perp_m use params_brag_boundaries_parpen_m use params_brag_init_select_m use params_brag_parsolver_te_m use params_brag_parsolver_ti_m use params_brag_parsolver_upar_m use params_neut_model_m use params_neut_floors_m use params_neut_switches_m use params_neut_boundaries_perp_m use params_neut_boundaries_parpen_m use params_neut_data_paths_m use params_neut_init_select_m use params_impy_coronal_m use params_apar_shift_m implicit none integer, public, parameter :: tinfo_size = 37 !! Size of info-debug output (7 in timestep_braginskii !! + 4 in neutrals_module + 2*12 lorentzians for heat_flux_landau !! + 2 for zonal_neumann in timestep_braginskii) ! Paths to Braginskii related parameters character(len=PATHLEN_MAX), protected :: path_feature_selection = 'params_braginskii.in' !! Relative path to parameterfile for feature_selection parameters character(len=PATHLEN_MAX), protected :: path_tstep = 'params_braginskii.in' !! Relative path to parameterfile for tstep parameters character(len=PATHLEN_MAX), protected :: path_brag_model = 'params_braginskii.in' !! Relative path to parameterfile for brag_model parameters character(len=PATHLEN_MAX), protected :: path_brag_pardiss_model = 'params_braginskii.in' !! Relative path to parameterfile for brag_pardiss_model parameters character(len=PATHLEN_MAX), protected :: path_brag_numdiss = 'params_braginskii.in' !! Relative path to parameterfile for brag_numdiss parameters character(len=PATHLEN_MAX), protected :: path_brag_buffer = 'params_braginskii.in' !! Relative path to parameterfile for brag_buffer parameters character(len=PATHLEN_MAX), protected :: path_brag_floors = 'params_braginskii.in' !! Relative path to parameterfile for brag_floors parameters character(len=PATHLEN_MAX), protected :: path_brag_switches = 'params_braginskii.in' !! Relative path to parameterfile for brag_switches parameters character(len=PATHLEN_MAX), protected :: path_brag_sources_external_select = 'params_braginskii.in' !! Relative path to parameterfile for brag_sources_external_select parameters character(len=PATHLEN_MAX), protected :: path_brag_boundaries_perp = 'params_braginskii.in' !! Relative path to parameterfile for brag_boundaries_perp parameters character(len=PATHLEN_MAX), protected :: path_brag_boundaries_parpen = 'params_braginskii.in' !! Relative path to parameterfile for brag_boundaries_parpen parameters character(len=PATHLEN_MAX), protected :: path_brag_init_select = 'params_braginskii.in' !! Relative path to parameterfile for brag_init_select character(len=PATHLEN_MAX), protected :: path_brag_parsolver_te = 'params_braginskii.in' !! Relative path to parameterfile for brag_parsolver_te parameters character(len=PATHLEN_MAX), protected :: path_brag_parsolver_ti = 'params_braginskii.in' !! Relative path to parameterfile for brag_parsolver_ti parameters character(len=PATHLEN_MAX), protected :: path_brag_parsolver_upar = 'params_braginskii.in' !! Relative path to parameterfile for brag_parsolver_upar parameters ! Paths to Neutrals related parameters character(len=PATHLEN_MAX), protected :: path_neut_model = 'params_neutrals.in' !! Relative path to parameterfile for neut_model parameters character(len=PATHLEN_MAX), protected :: path_neut_floors = 'params_neutrals.in' !! Relative path to parameterfile for neut_floors parameters character(len=PATHLEN_MAX), protected :: path_neut_switches = 'params_neutrals.in' !! Relative path to parameterfile for neut_switches parameters character(len=PATHLEN_MAX), protected :: path_neut_boundaries_perp = 'params_neutrals.in' !! Relative path to parameterfile for neut_boundaries_perp parameters character(len=PATHLEN_MAX), protected :: path_neut_boundaries_parpen = 'params_neutrals.in' !! Relative path to parameterfile for neut_boundaries_parpen parameters character(len=PATHLEN_MAX), protected :: path_neut_data_paths = 'params_neutrals.in' !! Relative path to parameterfile for neut_data_paths parameters character(len=PATHLEN_MAX), protected :: path_neut_init_select = 'params_neutrals.in' !! Relative path to parameterfile for neut_init_select parameters character(len=PATHLEN_MAX), protected :: path_neut_solver_dens = 'params_neutrals.in' !! Relative path to parameterfile for neut_solver_dens parameters character(len=PATHLEN_MAX), protected :: path_neut_solver_parmom = 'params_neutrals.in' !! Relative path to parameterfile for neut_solver_parmom parameters character(len=PATHLEN_MAX), protected :: path_impy_coronal = 'params_neutrals.in' !! Relative path to parameterfile for impy_coronal parameters ! Paths to other parameters character(len=PATHLEN_MAX), protected :: path_diag_lineout = 'params_braginskii.in' !! Relative path to parameterfile for diag_lineout parameters character(len=PATHLEN_MAX), protected :: path_evol_apar_shift = 'params_braginskii.in' !! Relative path to parameterfile for apar_shift parameters namelist / paths / & path_feature_selection, & path_tstep, & path_brag_model, & path_brag_pardiss_model, & path_brag_numdiss, & path_brag_buffer, & path_brag_floors, & path_brag_switches, & path_brag_sources_external_select, & path_brag_boundaries_perp, & path_brag_boundaries_parpen, & path_brag_init_select, & path_brag_parsolver_te, & path_brag_parsolver_ti, & path_brag_parsolver_upar, & path_neut_model, & path_neut_floors, & path_neut_switches, & path_neut_boundaries_perp, & path_neut_boundaries_parpen, & path_neut_data_paths, & path_neut_init_select, & path_neut_solver_dens, & path_neut_solver_parmom, & path_impy_coronal, & path_diag_lineout, & path_evol_apar_shift private paths public :: read_paths public :: write_paths public :: read_all_params_braginskii public :: read_all_params_neutrals public :: write_all_params_braginskii contains subroutine read_paths(filename) !! Reads paths to parameter files character(len=*), intent(in) :: filename !! Filename, to read filepaths from integer :: io_unit, io_error character(len=256) :: io_errmsg open(newunit=io_unit, 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(io_unit, nml=paths, iostat=io_error, iomsg=io_errmsg) if (io_error /= 0) then call handle_error(io_errmsg, GRILLIX_ERR_NAMELIST, & __LINE__, __FILE__) endif close(io_unit) end subroutine subroutine write_paths(filename) !! WWrites paths to parameter files character(len=*), intent(in), optional :: filename !! If present, filename where paths are written to, !! if not present, writes to screen integer :: io_unit, io_error character(len=256) :: io_errmsg if (present(filename)) then open(newunit=io_unit, file=filename, status='unknown', & access='append', action='write', & iostat=io_error, iomsg=io_errmsg ) if (io_error /= 0) then call handle_error(io_errmsg, GRILLIX_ERR_NAMELIST, & __LINE__, __FILE__) endif else io_unit = get_stdout() endif write(io_unit, nml=paths, iostat=io_error, iomsg=io_errmsg) if (io_error /= 0) then call handle_error(io_errmsg, GRILLIX_ERR_NAMELIST, & __LINE__, __FILE__) endif if (present(filename)) then close(io_unit) endif end subroutine subroutine read_all_params_braginskii() !! Reads all parameters related with Braginskii model call read_params_feature_selection(path_feature_selection) call read_params_tstep(path_tstep) call read_params_brag_model(path_brag_model) call read_params_brag_pardiss_model(path_brag_pardiss_model) call read_params_brag_numdiss(path_brag_numdiss) call read_params_brag_buffer(path_brag_buffer) call read_params_brag_floors(path_brag_floors) call read_params_brag_switches(path_brag_switches) call read_params_brag_sources_external_select(path_brag_sources_external_select) call read_params_brag_boundaries_perp(path_brag_boundaries_perp) call read_params_brag_boundaries_parpen(path_brag_boundaries_parpen) call read_params_brag_init_select(path_brag_init_select) call read_params_brag_parsolver_te(path_brag_parsolver_te) call read_params_brag_parsolver_ti(path_brag_parsolver_ti) call read_params_brag_parsolver_upar(path_brag_parsolver_upar) if (evol_apar_shift_on) then call read_params_evol_apar_shift(path_evol_apar_shift) endif end subroutine subroutine read_all_params_neutrals() !! Reads all parameters related with Neutrals model call read_params_neut_model(path_neut_model) call read_params_neut_floors(path_neut_floors) call read_params_neut_switches(path_neut_switches) call read_params_neut_boundaries_perp(path_neut_boundaries_perp) call read_params_neut_boundaries_parpen(path_neut_boundaries_parpen) call read_params_neut_data_paths(path_neut_data_paths) call read_params_neut_init_select(path_neut_init_select) call read_params_impy_coronal(path_impy_coronal) if (apply_neumann_mirror) then ! Check that perp-boundary conditions are all dirichlet-zero ! when using neumann mirroring feature if ((bnddescr_neut_dens_core /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_dens_wall /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_dens_dome /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_dens_out /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_parmom_core /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_parmom_wall /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_parmom_dome /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_parmom_out /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_pressure_core /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_pressure_wall /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_pressure_dome /= BND_TYPE_DIRICHLET_ZERO) .or. & (bnddescr_neut_pressure_out /= BND_TYPE_DIRICHLET_ZERO) ) then call handle_error('Invalid perp boundary conditions for neumann mirroring, '// & 'must be all BND_TYPE_DIRICHLET_ZERO, ', & GRILLIX_ERR_OTHER, __LINE__, __FILE__) endif endif end subroutine subroutine write_all_params_braginskii(filename) !! Writes all parameters related with Braginskii model character(len=*), intent(in), optional :: filename !! If present, filename where parameters are written to call write_params_feature_selection(filename) call write_params_tstep(filename) call write_params_brag_model(filename) call write_params_brag_pardiss_model(filename) call write_params_brag_numdiss(filename) call write_params_brag_buffer(filename) call write_params_brag_floors(filename) call write_params_brag_switches(filename) call write_params_brag_sources_external_select(filename) call write_params_brag_boundaries_perp(filename) call write_params_brag_boundaries_parpen(filename) call write_params_brag_init_select(filename) call write_params_brag_parsolver_te(filename) call write_params_brag_parsolver_ti(filename) call write_params_brag_parsolver_upar(filename) if (evol_apar_shift_on) then call write_params_apar_shift(filename) endif end subroutine subroutine write_all_params_neutrals(filename) !! Writes all parameters related with Neutrals model character(len=*), intent(in), optional :: filename !! If present, filename where parameters are written to) !! Reads all parameters related with Neutrals model call write_params_neut_model(filename) call write_params_neut_floors(filename) call write_params_neut_switches(filename) call write_params_neut_boundaries_perp(filename) call write_params_neut_boundaries_parpen(filename) call write_params_neut_data_paths(filename) call write_params_neut_init_select(filename) call write_params_impy_coronal(filename) end subroutine end module