params_brag_numdiss_m.f90 Source File


Contents


Source Code

module params_brag_numdiss_m
    !! Parameters for the BRAGINSKII model related with numerical dissipation
    use precision_grillix_m, only : GP, GP_NAN
    use error_handling_grillix_m, only: handle_error
    use status_codes_grillix_m, only : GRILLIX_ERR_NAMELIST
    use screen_io_m, only : get_stdout
    implicit none
         
    logical, protected :: perpdiss_exclude_buffer
    !! If true, applies an envelope function 
    !! that excludes the buffer region from the dissipation operator       
    integer, protected :: perpdiss_order_ne = 1
    !! Order of (Hyper)diffusion
    !! acting on electron density
    real(GP), protected :: perpdiss_coeff_ne = 0.0_GP
    !! Perpendicular (Hyper)viscosity coefficent
    !! acting on electron density
    integer, protected :: perpdiss_order_vort = 1
    !! Order of (Hyper)diffusion acting on vorticity
    real(GP), protected :: perpdiss_coeff_vort = 0.0_GP
    !! Perpendicular (Hyper)viscosity coefficent
    !! acting on vorticity
    integer, protected :: perpdiss_order_te = 1
    !! Order of (Hyper)diffusion 
    !! acting on electron temperature
    real(GP), protected :: perpdiss_coeff_te = 0.0_GP
    !! Perpendicular (Hyper)viscosity coefficent
    !! acting on electron temperature
    integer, protected :: perpdiss_order_pe = 1
    !! Order of (Hyper)diffusion 
    !! acting on electron pressure
    real(GP), protected :: perpdiss_coeff_pe = 0.0_GP
    !! Perpendicular (Hyper)viscosity coefficent
    !! acting on electron pressure
    integer, protected :: perpdiss_order_ti = 1
    !! Order of (Hyper)diffusion
    !! acting on ion temperature
    real(GP), protected :: perpdiss_coeff_ti = 0.0_GP
    !! Perpendicular (Hyper)viscosity coefficent 
    !! acting on ion temperature
    integer, protected :: perpdiss_order_pi = 1
    !! Order of (Hyper)diffusion
    !! acting on ion pressure
    real(GP), protected :: perpdiss_coeff_pi = 0.0_GP
    !! Perpendicular (Hyper)viscosity coefficent 
    !! acting on ion pressure
    integer, protected :: perpdiss_order_upar = 1
    !! Order of (Hyper)diffusion 
    !! acting on parallel velocity
    real(GP), protected :: perpdiss_coeff_upar = 0.0_GP
    !! Perpendicular (Hyper)viscosity coefficent 
    !! acting on parallel velocity
    integer, protected :: perpdiss_order_ohm = 1
    !! Order of (Hyper)diffusion acting in Ohm's law
    real(GP), protected :: perpdiss_coeff_ohm = 0.0_GP
    !! Perpendicular (Hyper)viscosity coefficent
    !! acting on Ohm's law
    real(GP), protected :: pardiss_coeff_ne = 0.0_GP
    !! Parallel (numerical) diffusion coefficent 
    !! acting on electron density
    real(GP), protected :: pardiss_coeff_vort = 0.0_GP
    !! Parallel (numerical) diffusion coefficent 
    !! acting on vorticity
    real(GP), protected :: pardiss_coeff_ohm = 0.0_GP
    !! Parallel (numerical) diffusion coefficent 
    !! acting in Ohm's law

    public :: read_params_brag_numdiss
    public :: write_params_brag_numdiss

    namelist / brag_numdiss / &
        perpdiss_exclude_buffer, &
        perpdiss_order_ne, &
        perpdiss_order_vort, &
        perpdiss_order_te, &
        perpdiss_order_ti, &
        perpdiss_order_pe, &
        perpdiss_order_pi, &
        perpdiss_order_upar, &
        perpdiss_order_ohm, &
        perpdiss_coeff_ne, &
        perpdiss_coeff_vort, &
        perpdiss_coeff_te, &
        perpdiss_coeff_ti, &
        perpdiss_coeff_pe, &
        perpdiss_coeff_pi, &
        perpdiss_coeff_upar, &
        perpdiss_coeff_ohm, &
        pardiss_coeff_ne, &
        pardiss_coeff_vort, &
        pardiss_coeff_ohm
    private brag_numdiss
    
contains

    subroutine read_params_brag_numdiss(filename)
        !! Reads parameters related with brag_numdiss
        character(len=*), intent(in) :: filename
        !! Filename, to read 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=brag_numdiss, 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_params_brag_numdiss(filename)
        !! Reads parameters related with brag_numdiss
        character(len=*), intent(in), optional :: filename
        !! If present, filename where params 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=brag_numdiss, 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
    
end module