facade_params_m.f90 Source File


Contents

Source Code


Source Code

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