VMEC1D_visu Subroutine

private subroutine VMEC1D_visu()

Uses

  • proc~~vmec1d_visu~~UsesGraph proc~vmec1d_visu VMEC1D_visu MODgvec_VMEC_Readin MODgvec_VMEC_Readin proc~vmec1d_visu->MODgvec_VMEC_Readin module~modgvec_analyze_vars MODgvec_Analyze_Vars proc~vmec1d_visu->module~modgvec_analyze_vars module~modgvec_cubic_spline MODgvec_cubic_spline proc~vmec1d_visu->module~modgvec_cubic_spline module~modgvec_globals MODgvec_Globals proc~vmec1d_visu->module~modgvec_globals module~modgvec_output_vars MODgvec_Output_Vars proc~vmec1d_visu->module~modgvec_output_vars module~modgvec_vmec MODgvec_VMEC proc~vmec1d_visu->module~modgvec_vmec module~modgvec_vmec_vars MODgvec_VMEC_Vars proc~vmec1d_visu->module~modgvec_vmec_vars module~modgvec_write_modes MODgvec_write_modes proc~vmec1d_visu->module~modgvec_write_modes module~modgvec_analyze_vars->module~modgvec_globals 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_output_vars->module~modgvec_globals module~modgvec_vmec->module~modgvec_cubic_spline module~modgvec_vmec->module~modgvec_globals module~modgvec_vmec_vars->module~modgvec_cubic_spline module~modgvec_vmec_vars->module~modgvec_globals module~modgvec_rprofile_base MODgvec_rProfile_base module~modgvec_vmec_vars->module~modgvec_rprofile_base module~modgvec_write_modes->module~modgvec_globals 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

Visualize VMEC flux surface data for each mode, for Rmnc

Arguments

None

Calls

proc~~vmec1d_visu~~CallsGraph proc~vmec1d_visu VMEC1D_visu iotaf iotaf proc~vmec1d_visu->iotaf presf presf proc~vmec1d_visu->presf proc~rprofile_eval_at_rho c_rProfile%rProfile_eval_at_rho proc~vmec1d_visu->proc~rprofile_eval_at_rho vmec_evalsplmode vmec_evalsplmode proc~vmec1d_visu->vmec_evalsplmode write_modes write_modes proc~vmec1d_visu->write_modes xm xm proc~vmec1d_visu->xm xn xn proc~vmec1d_visu->xn eval_at_rho2 eval_at_rho2 proc~rprofile_eval_at_rho->eval_at_rho2 proc~rho2_derivative rho2_derivative proc~rprofile_eval_at_rho->proc~rho2_derivative proc~rprofile_drho2 c_rProfile%rProfile_drho2 proc~rprofile_eval_at_rho->proc~rprofile_drho2 proc~rprofile_drho3 c_rProfile%rProfile_drho3 proc~rprofile_eval_at_rho->proc~rprofile_drho3 proc~rprofile_drho4 c_rProfile%rProfile_drho4 proc~rprofile_eval_at_rho->proc~rprofile_drho4 proc~poly_derivative_prefactor poly_derivative_prefactor proc~rho2_derivative->proc~poly_derivative_prefactor proc~rprofile_drho2->eval_at_rho2 proc~rprofile_drho2->proc~rho2_derivative proc~rprofile_drho3->eval_at_rho2 proc~rprofile_drho3->proc~rho2_derivative proc~rprofile_drho4->eval_at_rho2 proc~rprofile_drho4->proc~rho2_derivative

Called by

proc~~vmec1d_visu~~CalledByGraph proc~vmec1d_visu VMEC1D_visu proc~analyze Analyze proc~analyze->proc~vmec1d_visu

Source Code

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