FitSplineHalf Subroutine

private subroutine FitSplineHalf(modes, nFlux, mabs, Xmn_half, Xmn_Spl)

Uses

  • proc~~fitsplinehalf~~UsesGraph proc~fitsplinehalf FitSplineHalf module~modgvec_vmec_vars MODgvec_VMEC_Vars proc~fitsplinehalf->module~modgvec_vmec_vars module~modgvec_cubic_spline MODgvec_cubic_spline module~modgvec_vmec_vars->module~modgvec_cubic_spline module~modgvec_globals MODgvec_Globals module~modgvec_vmec_vars->module~modgvec_globals module~modgvec_rprofile_base MODgvec_rProfile_base module~modgvec_vmec_vars->module~modgvec_rprofile_base module~modgvec_cubic_spline->module~modgvec_globals module~sll_m_bsplines sll_m_bsplines module~modgvec_cubic_spline->module~sll_m_bsplines iso_fortran_env iso_fortran_env module~modgvec_globals->iso_fortran_env module~modgvec_rprofile_base->module~modgvec_globals module~sll_m_bsplines_base sll_m_bsplines_base module~sll_m_bsplines->module~sll_m_bsplines_base module~sll_m_bsplines_non_uniform sll_m_bsplines_non_uniform module~sll_m_bsplines->module~sll_m_bsplines_non_uniform module~sll_m_bsplines_uniform sll_m_bsplines_uniform module~sll_m_bsplines->module~sll_m_bsplines_uniform module~sll_m_working_precision sll_m_working_precision module~sll_m_bsplines->module~sll_m_working_precision module~sll_m_bsplines_base->module~sll_m_working_precision module~sll_m_bsplines_non_uniform->module~sll_m_bsplines_base module~sll_m_bsplines_non_uniform->module~sll_m_working_precision module~sll_m_bsplines_uniform->module~sll_m_bsplines_base module~sll_m_bsplines_uniform->module~sll_m_working_precision

Fit disrete data along flux surfaces as spline for each fourier mode input is given on the half mesh 2:nFluxVMEC

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: modes

number of modes

integer, intent(in) :: nFlux

number of flux surfaces

integer, intent(in) :: mabs(modes)

filtered m-mode value

real(kind=wp), intent(in) :: Xmn_half(modes,nFlux)

fourier coefficients at all flux surfaces

type(t_cubspl), intent(out) :: Xmn_Spl(1:modes)

spline fitted fourier coefficients


Calls

proc~~fitsplinehalf~~CallsGraph proc~fitsplinehalf FitSplineHalf proc~cubspl_eval t_cubspl%cubspl_eval proc~fitsplinehalf->proc~cubspl_eval eval_basis eval_basis proc~cubspl_eval->eval_basis eval_basis_and_n_derivs eval_basis_and_n_derivs proc~cubspl_eval->eval_basis_and_n_derivs

Called by

proc~~fitsplinehalf~~CalledByGraph proc~fitsplinehalf FitSplineHalf proc~initvmec InitVMEC proc~initvmec->proc~fitsplinehalf

Source Code

SUBROUTINE FitSplineHalf(modes,nFlux,mabs,Xmn_half,Xmn_Spl)
! MODULES
USE MODgvec_VMEC_Vars, ONLY: rho,NormFlux_prof
! IMPLICIT VARIABLE HANDLING
IMPLICIT NONE
!-----------------------------------------------------------------------------------------------------------------------------------
! INPUT VARIABLES
INTEGER, INTENT(IN) :: modes                  !! number of modes
INTEGER, INTENT(IN) :: nFlux                  !! number of flux surfaces
INTEGER, INTENT(IN) :: mabs(modes)            !! filtered m-mode value
REAL(wp),INTENT(IN) :: Xmn_half(modes,nFlux)  !! fourier coefficients at all flux surfaces
!-----------------------------------------------------------------------------------------------------------------------------------
! OUTPUT VARIABLES
TYPE(t_cubspl),INTENT(OUT):: Xmn_Spl(1:modes) !!  spline fitted fourier coefficients
!-----------------------------------------------------------------------------------------------------------------------------------
! LOCAL VARIABLES
INTEGER           :: iMode,iFlux
REAL(wp)          :: Xmn_val(nFlux+1)  ! spline fitted fourier coefficients
REAL(wp)          :: rho_half(nFlux+1)
TYPE(t_cubspl),ALLOCATABLE :: spl_half
!===================================================================================================================================
DO iFlux=1,nFlux-1
  rho_half(iFlux+1)=SQRT(0.5_wp*(NormFlux_prof(iFlux+1)+NormFlux_prof(iFlux))) !0.5*(rho(iFlux)+rho(iFlux+1))
END DO
!add end points
rho_half(1)=0.0_wp
rho_half(nFlux+1)=1.0_wp

 DO iMode=1,modes
   !scaling with rho^|m|
   DO iFlux=2,nFlux
     IF(mabs(iMode).EQ.0)THEN
       Xmn_val(iFlux)=Xmn_half(iMode,iFlux)
     ELSE
       Xmn_val(iFlux)=Xmn_half(iMode,iFlux) /(rho_half(iFlux)**mabs(iMode))
     END IF
   END DO !i
   !Parabolic extrapolation to axis with dx'(rho=0)=0.0_wp
   Xmn_val(1)=(Xmn_val(2)*rho_half(3)**2-Xmn_val(3)*rho_half(2)**2) /(rho_half(3)**2-rho_half(2)**2)
   !Extrapolate to Edge
   Xmn_val(nFlux+1)= ( Xmn_val(nFlux  )*(rho_half(nFlux+1)-rho_half(nFlux-1))     &
                      -Xmn_val(nFlux-1)*(rho_half(nFlux+1)-rho_half(nFlux  )) )   &
                    /(  rho_half(nFlux)   -rho_half(nFlux-1) )

   spl_half=t_cubspl(rho_half,Xmn_val, BC=(/1,0/))
   Xmn_val(1:nFlux) = spl_half%eval(rho,0)
   !respline
   Xmn_val(1)  = ( Xmn_val(2)*rho(3)**2-Xmn_val(3)*rho(2)**2) /(rho(3)**2-rho(2)**2)
   Xmn_Spl(iMode)=t_cubspl(rho,Xmn_val(1:nFlux), BC=(/1,0/))
 END DO !iMode
!
END SUBROUTINE FitSplineHalf