kt_grids_specified.f90 Source File


Contents


Source Code

!> 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