fstar is f(R,Z) interpolated at the values (r,thetain). The parameter r is the distance to the magnetic axis.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(abstract_eqfile_cart_geo_type), | intent(in) | :: | self | |||
real, | intent(in) | :: | r_in | |||
real, | intent(in) | :: | theta_in | |||
real, | intent(in), | dimension(:, :) | :: | f | ||
character(len=1), | intent(in) | :: | char |
real function eqitem_cart(self, r_in, theta_in, f, char) result(fstar)
use mp, only: mp_abort
implicit none
class(abstract_eqfile_cart_geo_type), intent(in) :: self
real, intent (in) :: r_in, theta_in
real, dimension(:, :), intent(in) :: f
character(1), intent(in) :: char
integer :: istar, jstar
real :: r, thet, r_pos, z_pos
UNUSED_DUMMY(char)
associate(dim_1 => self%eq_R, dim_2 => self%eq_Z)
!Copy input r to avoid any modification
r = r_in ; thet = mod2pi(theta_in)
r_pos = self%Rpos(r, thet) ; z_pos = self%Zpos(r, thet)
! ensure point is on R mesh
if (r_pos >= dim_1(self%nw) .or. r_pos <= dim_1(1)) then
write(*,*) r, theta_in, dim_1(self%nw), r_pos
call mp_abort('No evaluation of eqitem allowed outside or on edge of R domain', .true.)
end if
! ensure point is on Z mesh
if (z_pos >= dim_2(self%nh) .or. z_pos <= dim_2(1)) then
write(*,*) r, theta_in, dim_2(1), dim_2(self%nh), z_pos
call mp_abort('No evaluation of eqitem allowed outside or on edge of Z domain', .true.)
end if
istar = find_lower_bound(r_pos, dim_1, 0)
jstar = find_lower_bound(z_pos, dim_2, 0)
fstar = bilinear_interpolate(f, dim_1, dim_2, istar, jstar, r_pos, z_pos)
end associate
end function eqitem_cart