analytic_divertor_equilibrium_m.f90 Source File


Source Code

module analytic_divertor_equilibrium_m
    use divertor_equilibrium_m, only: divertor_equilibrium_t, max_polygon_N_pts
    use precision_m, only : FP

    implicit none

    type, abstract, extends(divertor_equilibrium_t) :: &
        analytic_divertor_equilibrium_t
        real(FP) :: R0
        !! Non-normalised magentic axis radius
        real(FP) :: Z0
        !! Non-normalised magentic axis vertical position
        real(FP) :: RX
        !! Normalised primary x-point radius
        real(FP) :: ZX
        !! Normalised primary x-point vertical position
        real(FP) :: rhomin_privflux
    contains
        procedure, public :: check_privflux_regions
    end type analytic_divertor_equilibrium_t

contains

    subroutine check_privflux_regions(self, x, y, phi, local_rhomin, &
                        local_rhomin_exists, local_rhomax, local_rhomax_exists)
        !! For simple X-point geometries, can set any points below the X-point
        !! as private flux if not in the SOL
        class(analytic_divertor_equilibrium_t), intent(in) :: self
        real(FP), intent(in) :: x, y, phi
        real(FP), intent(inout) :: local_rhomax, local_rhomin
        logical, intent(out) :: local_rhomin_exists, local_rhomax_exists

        local_rhomin_exists = .false.
        local_rhomax_exists = .false.

        if ((y <= self%ZX) .neqv. self%flip_Z) then
            local_rhomin = max(self%rhomin_privflux, local_rhomin)
            local_rhomin_exists = .true.
        endif

    end subroutine check_privflux_regions

end module analytic_divertor_equilibrium_m