Builds X1 and X2 in SFL coordinates
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(t_transform_sfl), | intent(inout) | :: | sf |
self |
||
| class(t_base), | intent(in) | :: | X1_base_in | |||
| class(t_base), | intent(in) | :: | X2_base_in | |||
| class(t_base), | intent(in) | :: | LA_base_in | |||
| real(kind=wp), | intent(in) | :: | X1_in(1:X1_base_in%s%nbase,1:X1_base_in%f%modes) | |||
| real(kind=wp), | intent(in) | :: | X2_in(1:X2_base_in%s%nbase,1:X2_base_in%f%modes) | |||
| real(kind=wp), | intent(in) | :: | LA_in(1:LA_base_in%s%nbase,1:LA_base_in%f%modes) |
SUBROUTINE BuildTransform_SFL(sf,X1_base_in,X2_base_in,LA_base_in,X1_in,X2_in,LA_in) ! MODULES USE MODgvec_base ,ONLY: t_base,base_new USE MODgvec_SFL_Boozer,ONLY: find_boozer_Angles IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES CLASS(t_base),INTENT(IN) :: X1_base_in,X2_base_in,LA_base_in !< base classes belong to solution U_in REAL(wp),INTENT(IN) :: X1_in(1:X1_base_in%s%nbase,1:X1_base_in%f%modes) REAL(wp),INTENT(IN) :: X2_in(1:X2_base_in%s%nbase,1:X2_base_in%f%modes) REAL(wp),INTENT(IN) :: LA_in(1:LA_base_in%s%nbase,1:LA_base_in%f%modes) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES CLASS(t_transform_sfl), INTENT(INOUT) :: sf !! self !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: irho,nrho,mnIP REAL(wp),ALLOCATABLE :: Gt_rho(:,:),thetzeta_trafo(:,:,:) REAL(wp):: spos !=================================================================================================================================== __PERFON('BuildTransform_SFL') nrho = sf%X1sfl_base%s%nBase mnIP = sf%X1sfl_base%f%mn_IP ALLOCATE(thetzeta_trafo(2,mnIP,nrho)) SELECT CASE(sf%whichSFLcoord) CASE(1) !PEST !interpolate lambda at rho positions (for find_pest_angles) SELECT CASE(sf%to_angle_method) CASE(1) ALLOCATE(Gt_rho(LA_base_in%f%modes,nrho)) DO irho=1,nrho spos=MIN(MAX(1.0e-4_wp,sf%X1sfl_base%s%s_IP(irho)),1.0_wp-1.0e-12_wp) Gt_rho(:,irho)=LA_base_in%s%evalDOF2D_s(spos,LA_base_in%f%modes,0,LA_in(:,:)) END DO CALL find_pest_angles(nrho,LA_base_in%f,Gt_rho,sf%X1sfl_base%f%mn_IP,sf%X1sfl_base%f%x_IP,thetzeta_trafo) DEALLOCATE(Gt_rho) CALL transform_Angles_3d(X1_base_in,X1_in,"X1sfl",sf%X1sfl_base,sf%X1sfl,thetzeta_trafo) CALL transform_Angles_3d(X2_base_in,X2_in,"X2sfl",sf%X2sfl_base,sf%X2sfl,thetzeta_trafo) CASE(2) CALL Transform_Angles_sinterp(LA_base_in,LA_in,X1_base_in,X1_in,"X1",sf%X1sfl_base,sf%X1sfl) CALL Transform_Angles_sinterp(LA_base_in,LA_in,X2_base_in,X2_in,"X2",sf%X2sfl_base,sf%X2sfl) END SELECT CASE(2) !BOOZER CALL sf%booz%Get_Boozer(X1_base_in,X2_base_in,LA_base_in,X1_in,X2_in,LA_in) ! fill sf%booz%lambda,sf%booz%nu for find_angles ALLOCATE(Gt_rho(sf%GZ_base%f%modes,nrho)) DO irho=1,nrho Gt_rho(:,irho)=sf%booz%lambda(:,irho)+sf%booz%iota(irho)*sf%booz%nu(:,irho) END DO CALL to_spline_with_BC(sf%GZ_base,Gt_rho,sf%Gthet) CALL to_spline_with_BC(sf%GZ_base,sf%booz%nu,sf%GZ) DEALLOCATE(Gt_rho) SELECT CASE(sf%to_angle_method) CASE(1) CALL sf%booz%find_angles(sf%X1sfl_base%f%mn_IP,sf%X1sfl_base%f%x_IP, thetzeta_trafo) CALL transform_Angles_3d(X1_base_in,X1_in ,"X1sfl",sf%X1sfl_base,sf%X1sfl,thetzeta_trafo) CALL transform_Angles_3d(X2_base_in,X2_in ,"X2sfl",sf%X2sfl_base,sf%X2sfl,thetzeta_trafo) CALL Transform_Angles_3d(sf%GZ_base,sf%Gthet,"Gtsfl",sf%GZsfl_base,sf%Gtsfl,thetzeta_trafo) CALL Transform_Angles_3d(sf%GZ_base,sf%GZ ,"GZsfl",sf%GZsfl_base,sf%GZsfl,thetzeta_trafo) CASE(2) CALL Transform_Angles_sinterp(sf%GZ_base,sf%Gthet,sf%GZ_base,sf%GZ,"GZ",sf%GZsfl_base,sf%GZsfl,B_in=sf%GZ) CALL Transform_Angles_sinterp(sf%GZ_base,sf%Gthet,sf%GZ_base,sf%Gthet,"Gt",sf%Gzsfl_base,sf%Gtsfl,B_in=sf%GZ) CALL Transform_Angles_sinterp(sf%GZ_base,sf%Gthet,X1_base_in,X1_in,"X1",sf%X1sfl_base,sf%X1sfl,B_in=sf%GZ) CALL Transform_Angles_sinterp(sf%GZ_base,sf%Gthet,X2_base_in,X2_in,"X2",sf%X2sfl_base,sf%X2sfl,B_in=sf%GZ) END SELECT END SELECT DEALLOCATE(thetzeta_trafo) __PERFOFF('BuildTransform_SFL') END SUBROUTINE BuildTransform_SFL