Visualize VMEC flux surface data for each mode, for Rmnc
SUBROUTINE VMEC1D_visu() ! MODULES USE MODgvec_Globals,ONLY:Pi USE MODgvec_Analyze_Vars, ONLY:visu1D USE MODgvec_Output_Vars, ONLY:ProjectName USE MODgvec_write_modes USE MODgvec_VMEC_Readin USE MODgvec_VMEC_Vars USE MODgvec_VMEC, ONLY: VMEC_EvalSplMode USE MODgvec_cubic_spline, ONLY: t_cubspl IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: i,nVal,nValRewind,iMode INTEGER,PARAMETER :: n_Int=200 CHARACTER(LEN=120) :: varnames( 8+2*mn_mode) REAL(wp) :: values( 8+2*mn_mode,nFluxVMEC) REAL(wp) :: values_int(8+2*mn_mode,n_int) REAL(wp) :: rho_int(n_int),rho_half(nFluxVMEC) LOGICAL :: vcase(4) CHARACTER(LEN=4) :: vstr !=================================================================================================================================== IF(.NOT.MPIroot) RETURN !visu1D: all possible combinations: 1,2,3,4,12,13,14,23,24,34,123,124,234,1234 WRITE(vstr,'(I4)')visu1D vcase=.FALSE. IF(INDEX(vstr,'1').NE.0) vcase(1)=.TRUE. IF(INDEX(vstr,'2').NE.0) vcase(2)=.TRUE. IF(INDEX(vstr,'3').NE.0) vcase(3)=.TRUE. IF(INDEX(vstr,'4').NE.0) vcase(4)=.TRUE. IF(.NOT.(ANY(vcase))) THEN WRITE(*,*)'visu1D case not found:',visu1D,' nothing visualized...' RETURN END IF !interpolation points DO i=0,n_int-1 rho_int(1+i)=REAL(i,wp)/REAL(n_int-1,wp) END DO !strech towards axis and edge rho_int=rho_int+0.05_wp*SIN(Pi*(2.0_wp*rho_int-1.0_wp)) rho_int(1)=1.0e-12 rho_int(n_int)=1.0-1e-12 nVal=1 Varnames(nVal)='Phi' values( nVal,:)=Phi_prof(:) DO i=1,n_int values_int(nVal,i)=vmec_phi_profile%eval_at_rho(rho_int(i)) END DO !i nVal=nVal+1 Varnames(nVal)='chi' values( nVal,:)=Chi_prof(:) DO i=1,n_int values_int(nVal,i)=vmec_chi_profile%eval_at_rho(rho_int(i)) END DO !i nVal=nVal+1 Varnames(nVal)='rho' values( nVal,:)=rho(:) values_int(nVal,:)=rho_int(:) rho_half(1)=1.0e-12 DO i=1,nFluxVMEC-1 rho_half(i+1)=SQRT(0.5_wp*(NormFlux_prof(i+1)+NormFlux_prof(i))) !0.5*(rho(iFlux)+rho(iFlux+1)) END DO nVal=nVal+1 Varnames(nVal)='rho_half' values( nVal,:)= rho_half(:) values_int(nVal,:)=0. nVal=nVal+1 Varnames(nVal)='iota(Phi_norm)' values( nVal,:)=iotaf(:) DO i=1,n_int values_int(nVal,i)=vmec_iota_profile%eval_at_rho(rho_int(i)) END DO !i nVal=nVal+1 Varnames(nVal)='pres(Phi_norm)' values( nVal,:)=presf(:) DO i=1,n_int values_int(nVal,i)=vmec_pres_profile%eval_at_rho(rho_int(i)) END DO !i nValRewind=nVal IF(vcase(1))THEN WRITE(*,*)'1) Visualize VMEC modes R,Z,lambda interpolated...' nval=nValRewind CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_Rmnc","Rmnc",0,rho_int,Rmnc_Spl) nval=nValRewind CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_Zmns","Zmns",0,rho_int,Zmns_Spl) nval=nValRewind IF(lambda_grid.EQ."full")THEN CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_Lmns","Lmns",0,rho_int,Lmns_Spl) ELSE CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_Lmns_half","Lmns_h",0,rho_int,Lmns_spl) END IF IF(lasym)THEN nval=nValRewind CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_Rmns","Rmns",0,rho_int,Rmns_Spl) nval=nValRewind CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_Zmnc","Zmnc",0,rho_int,Zmnc_Spl) nval=nValRewind IF(lambda_grid.EQ."full")THEN CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_Lmnc","Lmnc",0,rho_int,Lmnc_Spl) ELSE CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_Lmnc_half","Lmnc_h",0,rho_int,Lmnc_spl) END IF END IF!lasym END IF !vcase(1) IF(vcase(2))THEN WRITE(*,*)'2) Visualize VMEC modes dRrho,dZrho interpolated...' nval=nValRewind CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_dRmnc","dRmnc",1,rho_int,Rmnc_Spl) nval=nValRewind CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_dZmns","dZmns",1,rho_int,Zmns_Spl) IF(lasym)THEN !interpolated profiles nval=nValRewind CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_dRmns","dRmns",1,rho_int,Rmns_Spl) nval=nValRewind CALL writeDataMN_int(TRIM(ProjectName)//"_VMEC_INT_dZmnc","dZmnc",1,rho_int,Zmnc_Spl) END IF!lasym END IF !vcase(2) IF(vcase(3))THEN WRITE(*,*)'3) Visualize VMEC modes R,Z,lambda pointwise ...' nval=nValRewind CALL writeDataMN(TRIM(ProjectName)//"_VMEC_Rmnc","Rmnc",0,rho,Rmnc) nval=nValRewind CALL writeDataMN(TRIM(ProjectName)//"_VMEC_Zmns","Zmns",0,rho,Zmns) nval=nValRewind IF(lambda_grid.EQ."full")THEN CALL writeDataMN(TRIM(ProjectName)//"_VMEC_Lmns","Lmns",0,rho,Lmns) ELSE CALL writeDataMN(TRIM(ProjectName)//"_VMEC_Lmns_half","Lmns_h",0,rho_half,Lmns) END IF IF(lasym)THEN nval=nValRewind CALL writeDataMN(TRIM(ProjectName)//"_VMEC_Rmns","Rmns",0,rho,Rmns) nval=nValRewind CALL writeDataMN(TRIM(ProjectName)//"_VMEC_Zmnc","Zmnc",0,rho,Zmnc) nval=nValRewind IF(lambda_grid.EQ."full")THEN CALL writeDataMN(TRIM(ProjectName)//"_VMEC_Lmnc","Lmnc",0,rho,Lmnc) ELSE CALL writeDataMN(TRIM(ProjectName)//"_VMEC_Lmnc_half","Lmnc_h",0,rho_half,Lmnc) END IF END IF!lasym END IF !vcase(3) IF(vcase(4))THEN WRITE(*,*)'4) Visualize VMEC modes dRrho,dZrho pointwise (1st order finite difference)...' nval=nValRewind CALL writeDataMN(TRIM(ProjectName)//"_VMEC_dRmnc","dRmnc",1,rho,Rmnc) nval=nValRewind CALL writeDataMN(TRIM(ProjectName)//"_VMEC_dZmns","dZmns",1,rho,Zmns) IF(lasym)THEN nval=nValRewind CALL writeDataMN(TRIM(ProjectName)//"_VMEC_dRmns","dRmns",1,rho,Rmns) nval=nValRewind CALL writeDataMN(TRIM(ProjectName)//"_VMEC_dZmnc","dZmnc",1,rho,Zmnc) END IF!lasym END IF !vcase(4) CONTAINS SUBROUTINE writeDataMN(fname,vname,rderiv,coord,xx) INTEGER,INTENT(IN) :: rderiv !0: point values, 1: 1/2 ( (R(i+1)-R(i))/rho(i+1)-rho(i) (R(i)-R(i-1))/rho(i)-rho(i-1)) CHARACTER(LEN=*),INTENT(IN):: fname CHARACTER(LEN=*),INTENT(IN):: vname REAL(wp),INTENT(IN) :: xx(:,:) REAL(wp),INTENT(IN) :: coord(nFluxVMEC) !local REAL(wp) :: dxx(size(xx,1),size(xx,2)) !derivative in Rho IF(rderiv.EQ.1) THEN dxx(:,1)=(xx(:,2)-xx(:,1))/(rho(2)-rho(1)) DO i=2,nFluxVMEC-1 dxx(:,i)=0.5_wp*( (xx(:,i+1)-xx(:,i ))/(rho(i+1)-rho(i )) & +(xx(:,i )-xx(:,i-1))/(rho(i )-rho(i-1))) !mean slope END DO dxx(:,nFluxVMEC)=(xx(:,nFluxVMEC)-xx(:,nFluxVMEC-1))/(rho(nFluxVMEC)-rho(nFluxVMEC-1)) ELSE dxx=xx END IF DO iMode=1,mn_mode nVal=nVal+1 WRITE(VarNames(nVal),'(A,", m=",I4.3,", n=",I4.3)')TRIM(vname),NINT(xm(iMode)),NINT(xn(iMode))/nfp values(nVal,:)=dxx(iMode,:) END DO CALL write_modes(TRIM(fname)//'.csv',vname,nVal,mn_mode,INT(xm),INT(xn),coord,rho(2),values,VarNames) END SUBROUTINE writeDataMN SUBROUTINE writeDataMN_int(fname,vname,rderiv,coord,xx_Spl) INTEGER,INTENT(IN) :: rderiv !0: eval spl, 1: eval spl deriv CHARACTER(LEN=*),INTENT(IN):: fname CHARACTER(LEN=*),INTENT(IN):: vname TYPE(t_cubspl),INTENT(IN) :: xx_Spl(:) REAL(wp),INTENT(IN) :: coord(n_int) DO iMode=1,mn_mode nVal=nVal+1 WRITE(VarNames(nVal),'(A,", m=",I4.3,", n=",I4.3)')TRIM(vname),NINT(xm(iMode)),NINT(xn(iMode))/nfp values_int(nVal,:)= VMEC_EvalSplMode((/iMode/),rderiv,coord,xx_Spl) END DO CALL write_modes(TRIM(fname)//'.csv',vname,nVal,mn_mode,INT(xm),INT(xn),coord,rho(2),values_int,VarNames) END SUBROUTINE writeDataMN_int END SUBROUTINE VMEC1D_visu