!> Set up sets of (kx, ky) values for linear runs. module kt_grids_specified use abstract_config, only: abstract_config_type, CONFIG_MAX_NAME_LEN implicit none private public :: init_kt_grids_specified, finish_kt_grids_specified, get_sizes_and_grids_specified public :: check_kt_grids_specified, wnml_kt_grids_specified public :: kt_grids_specified_config_type, set_kt_grids_specified_config, get_kt_grids_specified_config public :: kt_grids_specified_element_config_type, set_kt_grids_specified_element_config public :: get_kt_grids_specified_element_config integer :: naky, ntheta0, nmodes logical :: initialized = .false. !> Used to represent the input configuration of kt_grids_specified type, extends(abstract_config_type) :: kt_grids_specified_config_type ! namelist : kt_grids_specified_parameters ! indexed : false !> Deprecated, set `nmodes` instead. integer :: naky = -1 !> The number of wavenumber pairs to evolve. One must also set up !> the appropriate number of [[kt_grids_specified_element]]`_<i>` !> namelists. integer :: nmodes = 0 !> Deprecated, set `nmodes` instead. integer :: ntheta0 = -1 contains procedure, public :: read => read_kt_grids_specified_config procedure, public :: write => write_kt_grids_specified_config procedure, public :: reset => reset_kt_grids_specified_config procedure, public :: broadcast => broadcast_kt_grids_specified_config procedure, public, nopass :: get_default_name => get_default_name_kt_grids_specified_config procedure, public, nopass :: get_default_requires_index => get_default_requires_index_kt_grids_specified_config end type kt_grids_specified_config_type type(kt_grids_specified_config_type) :: kt_grids_specified_config !> Used to represent the input configuration of a specific specified !> wavenumber pair type, extends(abstract_config_type) :: kt_grids_specified_element_config_type ! namelist : kt_grids_specified_element ! indexed : true ! size : [[kt_grids_specified_config:nmodes]] !> Sets the \(k_y \rho\) value for this wavenumber element. real :: aky = 0.4 !> Sets the \(k_x \rho\) value for this wavenumber element (but should set `theta0` instead). real :: akx = 0.0 !> Sets the \(\theta_0\) value for this wavenumber element. real :: theta0 = 0.0 contains procedure, public :: read => read_kt_grids_specified_element_config procedure, public :: write => write_kt_grids_specified_element_config procedure, public :: reset => reset_kt_grids_specified_element_config procedure, public :: broadcast => broadcast_kt_grids_specified_element_config procedure, public, nopass :: get_default_name => get_default_name_kt_grids_specified_element_config procedure, public, nopass :: get_default_requires_index => get_default_requires_index_kt_grids_specified_element_config end type kt_grids_specified_element_config_type type(kt_grids_specified_element_config_type), dimension(:), allocatable :: kt_grids_specified_element_config contains !> FIXME : Add documentation subroutine init_kt_grids_specified(kt_grids_specified_config_in) use mp, only: proc0 implicit none type(kt_grids_specified_config_type), intent(in), optional :: kt_grids_specified_config_in if (initialized) return initialized = .true. if (present(kt_grids_specified_config_in)) kt_grids_specified_config = kt_grids_specified_config_in call kt_grids_specified_config%init(name = 'kt_grids_specified_parameters', requires_index = .false.) ! Copy out internal values into module level parameters associate(self => kt_grids_specified_config) #include "kt_grids_specified_copy_out_auto_gen.inc" end associate if (naky /= -1 .and. proc0) write(*, *) "Warning : naky input is deprecated, set nmodes instead" if (ntheta0 /= -1 .and. proc0) write(*, *) "Warning : ntheta0 input is deprecated, set nmodes instead" naky = nmodes ; ntheta0 = nmodes end subroutine init_kt_grids_specified !> FIXME : Add documentation subroutine finish_kt_grids_specified implicit none initialized = .false. call kt_grids_specified_config%reset() if(allocated(kt_grids_specified_element_config)) deallocate(kt_grids_specified_element_config) end subroutine finish_kt_grids_specified !> FIXME : Add documentation subroutine wnml_kt_grids_specified (unit) implicit none integer, intent(in) :: unit integer :: i call kt_grids_specified_config%write(unit) do i = 1, nmodes call kt_grids_specified_element_config(i)%write(unit) end do end subroutine wnml_kt_grids_specified !> FIXME : Add documentation subroutine get_sizes_and_grids_specified (aky_out, theta0_out, akx_out, ikx_out, & naky_x, ntheta0_x, nx_x, ny_x, kt_grids_specified_element_config_in) use mp, only: mp_abort implicit none real, dimension(:), allocatable, intent(out) :: aky_out, akx_out real, dimension(:,:), allocatable, intent(out) :: theta0_out integer, dimension(:), allocatable, intent(out) :: ikx_out integer, intent (out) :: naky_x, ntheta0_x, nx_x, ny_x type(kt_grids_specified_element_config_type), intent(in), dimension(:), optional :: kt_grids_specified_element_config_in integer :: i naky_x = naky ; ntheta0_x = ntheta0 nx_x = nmodes ; ny_x = nmodes !Should these be 0 like in range? allocate(aky_out(naky), akx_out(ntheta0), ikx_out(ntheta0), theta0_out(ntheta0, naky)) if (present(kt_grids_specified_element_config_in)) kt_grids_specified_element_config = kt_grids_specified_element_config_in if(.not.allocated(kt_grids_specified_element_config)) allocate(kt_grids_specified_element_config(nmodes)) if (size(kt_grids_specified_element_config) /= nmodes) & call mp_abort("Inconsistent number of config elements.", .true.) do i = 1, nmodes call read_element (i, aky_out(i), theta0_out(i, :), akx_out(i)) ikx_out(i) = i - 1 end do end subroutine get_sizes_and_grids_specified !> FIXME : Add documentation subroutine read_element (i, aky, theta0, akx) implicit none integer, intent (in) :: i real, intent (out) :: aky, akx real, dimension(:), intent(out) :: theta0 call kt_grids_specified_element_config(i)%init(name = 'kt_grids_specified_element', & requires_index = .true., index = i) associate(self => kt_grids_specified_element_config(i)) #include "kt_grids_specified_element_copy_out_auto_gen.inc" end associate end subroutine read_element subroutine check_kt_grids_specified (report_unit, aky, theta0) implicit none integer, intent(in) :: report_unit real, dimension (:), intent (in) :: aky real, dimension (:), intent (in) :: theta0 integer :: i write (report_unit, *) write (report_unit, fmt="('A set of ',i3,' k_perps will be evolved.')") nmodes write (report_unit, *) do i = 1, nmodes write (report_unit, fmt="('ky rho = ',e11.4,' theta0 = ',e11.4)") aky(i), theta0(i) end do end subroutine check_kt_grids_specified #include "kt_grids_specified_auto_gen.inc" #include "kt_grids_specified_element_auto_gen.inc" end module kt_grids_specified