checkZeroCurvature Subroutine

public subroutine checkZeroCurvature(sf)

Sample axis and check for zero (<1.e-12) curvature

Arguments

Type IntentOptional Attributes Name
class(t_hmap_frenet), intent(in) :: sf

Calls

proc~~checkzerocurvature~~CallsGraph proc~checkzerocurvature checkZeroCurvature interface~cross CROSS proc~checkzerocurvature->interface~cross proc~hmap_frenet_eval_x0_fromrz t_hmap_frenet%hmap_frenet_eval_X0_fromRZ proc~checkzerocurvature->proc~hmap_frenet_eval_x0_fromrz interface~cross->interface~cross proc~eval_fourier1d eval_fourier1d proc~hmap_frenet_eval_x0_fromrz->proc~eval_fourier1d

Called by

proc~~checkzerocurvature~~CalledByGraph proc~checkzerocurvature checkZeroCurvature proc~hmap_frenet_init_params hmap_frenet_init_params proc~hmap_frenet_init_params->proc~checkzerocurvature interface~t_hmap_frenet t_hmap_frenet interface~t_hmap_frenet->proc~hmap_frenet_init_params proc~hmap_frenet_init hmap_frenet_init interface~t_hmap_frenet->proc~hmap_frenet_init proc~hmap_frenet_init->proc~hmap_frenet_init_params

Source Code

SUBROUTINE checkZeroCurvature( sf)
! MODULES
IMPLICIT NONE
!-----------------------------------------------------------------------------------------------------------------------------------
! INPUT VARIABLES
  CLASS(t_hmap_frenet), INTENT(IN) :: sf
!-----------------------------------------------------------------------------------------------------------------------------------
! OUTPUT VARIABLES
!-----------------------------------------------------------------------------------------------------------------------------------
! LOCAL VARIABLES
  INTEGER               :: iz,nz
  REAL(wp),DIMENSION(3) :: X0,X0p,X0pp,X0ppp,B
  REAL(wp)              :: lp,absB
  REAL(wp),DIMENSION((sf%n_max+1)*8) :: zeta,kappa
  LOGICAL ,DIMENSION((sf%n_max+1)*8) :: checkzero
!===================================================================================================================================
  nz=(sf%n_max+1)*8
  DO iz=1,nz
    zeta(iz)=REAL(iz-1,wp)/REAL(nz,wp)*TWOPI/sf%nfp  !0...2pi/nfp without endpoint
    CALL sf%eval_X0(zeta(iz),X0,X0p,X0pp,X0ppp)
    lp=SQRT(SUM(X0p*X0p))
    B=CROSS(X0p,X0pp)
    absB=SQRT(SUM(B*B))
    kappa(iz)=absB/(lp**3)
  END DO !iz
  checkzero=(kappa.LT.1.0e-8)
  IF(ANY(checkzero))THEN
    IF(sf%omnig)THEN
      !omnig=True: kappa can only be zero once, at 0,pi/nfp,[2pi/nfp...]
      IF(.NOT.(checkzero(1).AND.checkzero(nz/2+1).AND.(COUNT(checkzero).EQ.2)))THEN
        DO iz=1,nz
          IF(checkzero(iz)) WRITE(UNIT_StdOut,'(A,E15.5)')'         ...curvature <1e-8 at zeta/(2pi/nfp)=',zeta(iz)*sf%nfp/TWOPI
        END DO
        CALL abort(__STAMP__, &
             "hmap_frenet checkZeroCurvature with omnig=True: found additional points with zero curvature",&
             TypeInfo="InitializationError")
      END IF
    ELSE
      DO iz=1,nz
        IF(checkzero(iz)) WRITE(UNIT_StdOut,'(A,E15.5)')'         ...curvature <1e-8 at zeta/(2pi/nfp)=',zeta(iz)*sf%nfp/TWOPI
      END DO
      CALL abort(__STAMP__, &
           "hmap_frenet checkZeroCurvature with omnig=False: found points with zero curvature",&
           TypeInfo="InitializationError")
    END IF
  END IF
END SUBROUTINE CheckZeroCurvature