Fit disrete data along flux surfaces as spline for each fourier mode input is given on the half mesh 2:nFluxVMEC
| Type | Intent | Optional | 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 |
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