FIXME : Add documentation
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(kt_grids_range_config_type), | intent(in), | optional | :: | kt_grids_range_config_in |
subroutine init_kt_grids_range(kt_grids_range_config_in)
!CMR, 14/10/2013:
! New namelist variables nn0, n0_min, n0_max, rhostar_range to set ky grid
! using toroidal mode numbers.
! Toroidal modenumbers are used if n0_min> 0 prescribed in input file.
use theta_grid, only: drhodpsi
use file_utils, only: error_unit
implicit none
type(kt_grids_range_config_type), intent(in), optional :: kt_grids_range_config_in
integer :: ierr
!! Temporary value of n0 as floating point
real :: n0_tmp
!! Temporary variable for swapping n0_{min,max}
integer :: n0_swap
if (initialized) return
initialized = .false.
call read_parameters_range(kt_grids_range_config_in)
ierr = error_unit()
!Override kyspacing_option in certain cases
select case (kyspacingopt_switch)
case (kyspacingopt_exp)
if(aky_min<=0) then
write(ierr,'("Cannot use kyspacing_option=",A," with aky_min<=0.0 --> setting to",A)') &
"'exponential'","'linear'"
kyspacingopt_switch=kyspacingopt_linear
endif
end select
if (n0_min > 0) then
!CMR if n0_min>0 then override aky inputs and use nn0, n0_min, n0_max to determine aky range
!Important to only do the following check and fix if nn0 > 0 as the second argument of `mod`
!must be non-zero. Failing to guard against this can lead to different outcomes with different
!compilers
if(nn0 > 1) then
!If toroidal mode number range would lead to non-integer mode numbers then
!we adjust the range to try to fix this.
if(mod(n0_max-n0_min,nn0-1)/=0) then
!Give a warning message that we're changing things
write(ierr,'("Warning: toroidal mode number range setup would lead to non-integer")')
write(ierr,'(" mode numbers --> Attempting to adjust range slightly.")')
!n0_max should be n0_min + I*(nn0-1) or n0_min + (I+1)*(nn0-1)
!where I is int(n0_max-n0_min/(nn0-1)) and we add 1 if the
!remainder (n0_max-n0_min)/(nn0-1) - I is > 0.5
!Note it's nn0-1 rather than nn0 as this is number of intervals
!First calculate the floating step size
n0_tmp = (n0_max-n0_min*1.0)/(nn0-1)
!Now construct the new upper limit, int(n0_tmp) = I
!nint(n0_tmp-int(n0_tmp)) should be either 0 or 1 depending
!on if the remainder is < or > 0.5
n0_max = n0_min + (int(n0_tmp)+nint(n0_tmp-int(n0_tmp)))*(nn0-1)
!Double check it's all OK now, should always be fine but just
!putting this here in case of logic error or strange cases.
if(mod(n0_max-n0_min,nn0-1)/=0) then
write(ierr,'("Error: Attempt to fix toroidal mode number range failed. Forcing nn0=1")')
nn0=1
n0_max = n0_min
endif
endif
end if
!If n0_min>n0_max swap values
if(n0_min>n0_max) then
write(ierr,'("Warning: Swapping max and min n0 values")')
n0_swap = n0_min
n0_min = n0_max
n0_max = n0_swap
endif
!If n0_min == n0_max ensure nn0=1
if(n0_min==n0_max) then
if(nn0/=1) write(ierr,'("Warning: Forcing nn0=1 as n0_min==n0_max.")')
nn0 = 1
endif
!If there's only one mode then force n0_max=n0_min
if(nn0 == 1) then
n0_max = n0_min
endif
!Set the upper and lower aky limits
aky_max=n0_max*drhodpsi*rhostar_range
aky_min=n0_min*drhodpsi*rhostar_range
!Set the number of aky values
naky=nn0
endif
end subroutine init_kt_grids_range