mms_zhdanov_slab_s.f90 Source File


Contents


Source Code

submodule(mms_zhdanov_m) mms_zhdanov_slab_s 
    !! MMS Solutions and Sources for Zhdanov model in slab geometry
    implicit none
    
    real(GP), parameter :: ZaDe = 1.0_GP, &
                           ZaTr = 1.0_GP, &
                           ZaHe = 2.0_GP
       
    real(GP), parameter :: AmpDensDe = 1.0_GP, &
                           AmpDensTr = 0.3_GP, &
                           AmpDensHe = 0.1_GP
                           
    real(GP), parameter :: KxDensDe = 1.0_GP, &
                           KxDensTr = 2.0_GP, &
                           KxDensHe = 1.0_GP
                           
    real(GP), parameter :: KyDensDe = 2.0_GP, &
                           KyDensTr = 1.0_GP, &
                           KyDensHe = 3.0_GP
                        
    real(GP), parameter :: yPhDensDe = 0.5_GP, &
                           yPhDensTr = 0.9_GP, &
                           yPhDensHe = 1.6_GP

    real(GP), parameter :: KzDensDe = 2.0_GP, &
                           KzDensTr = 1.0_GP, &
                           KzDensHe = 1.0_GP
                           
    real(GP), parameter :: zPhDensDe = 0.8_GP, &
                           zPhDensTr = 1.5_GP, &
                           zPhDensHe = 1.9_GP
                           
    real(GP), parameter :: OmegaDensDe = 50.0_GP, &
                           OmegaDensTr = 96.0_GP, &
                           OmegaDensHe = 73.0_GP
                           
    real(GP), parameter :: TPhDensDe = 2.0_GP, &
                           TPhDensTr = 1.2_GP, &
                           TPhDensHe = 0.9_GP

    !! Offset of MMS solutions (for positively defined quantites, i.e. density and temperatures)
    real(GP), parameter :: OffsetDensDe = AmpDensDe + 1.5E-1_GP, & 
                           OffsetDensTr = AmpDensTr + 1.3E-1_GP, &
                           OffsetDensHe = AmpDensHe + 1.2E-1_GP
                                                  
contains

    real(GP) module function MmsSolDensSlab(equi, species, x, y, z, t)
        class(equilibrium_t) :: equi
        integer, intent(in) :: species
        real(GP), intent(in) :: x
        real(GP), intent(in) :: y
        real(GP), intent(in) :: z
        real(GP), intent(in) :: t
        
        real(GP) ::  xmin, xmax, ymin, ymax, twopi
                          
        twopi = TWO_PI     
        xmin = equi%xmin
        xmax = equi%xmax
        ymin = equi%ymin
        ymax = equi%ymax      

        
        select case(species)
        case(0)
            ! Electrons
            MmsSolDensSlab = MmsSolDensSlabEl()
        case(1)
            ! Deuterium
            MmsSolDensSlab = MmsSolDensSlabDe()
        case(2)
            ! Tritium
            MmsSolDensSlab = MmsSolDensSlabTr()
        case(3)
            ! Helium
            MmsSolDensSlab = MmsSolDensSlabHe()
        case default
            call handle_error('Species not valid', &
                              GRILLIX_ERR_OTHER, __LINE__, __FILE__, &
                              error_info_t('Species: ',[species]))
        end select

    contains
        
        real(GP) function MmsSolDensSlabEl() result(res)
            include 'MmsSol/MmsSolDensEl_header.txt'
            include 'MmsSol/MmsSolDensEl.txt'
        end
        
        real(GP) function MmsSolDensSlabDe() result(res)
            include 'MmsSol/MmsSolDensDe_header.txt'
            include 'MmsSol/MmsSolDensDe.txt'
        end
        
        real(GP) function MmsSolDensSlabTr() result(res)
            include 'MmsSol/MmsSolDensTr_header.txt'
            include 'MmsSol/MmsSolDensTr.txt'
        end
        
        real(GP) function MmsSolDensSlabHe() result(res)
            include 'MmsSol/MmsSolDensHe_header.txt'
            include 'MmsSol/MmsSolDensHe.txt'
        end

    end function 
    
    real(GP) module function MmsSourceDensSlab(equi, species,&
        x, y, z, t, params_species)
        class(equilibrium_t) :: equi
        integer, intent(in) :: species
        real(GP), intent(in) :: x
        real(GP), intent(in) :: y
        real(GP), intent(in) :: z
        real(GP), intent(in) :: t
        type(params_zhdanov_species_t) :: params_species
        
        real(GP) ::  xmin, xmax, ymin, ymax, twopi, SourceParam
                          
        twopi = TWO_PI     
        xmin = equi%xmin
        xmax = equi%xmax
        ymin = equi%ymin
        ymax = equi%ymax      
        SourceParam = params_species%source_param
        
        select case(species)
        case(0)
            ! Electrons
            MmsSourceDensSlab = 0.0_GP
        case(1)
            ! Deuterium
            MmsSourceDensSlab = MmsSourceDensSlabDe()
        case(2)
            ! Tritium
            MmsSourceDensSlab = MmsSourceDensSlabTr()
        case(3)
            ! Helium
            MmsSourceDensSlab = MmsSourceDensSlabHe()
        case default
            call handle_error('Species not valid', &
                              GRILLIX_ERR_OTHER, __LINE__, __FILE__, &
                              error_info_t('Species: ',[species]))
        end select      
        
    contains
                
        real(GP) function MmsSourceDensSlabDe() result(res)
            include 'MmsSource/MmsSourceDensDe_header.txt'
            include 'MmsSource/MmsSourceDensDe.txt'
        end
        
        real(GP) function MmsSourceDensSlabTr() result(res)
            include 'MmsSource/MmsSourceDensTr_header.txt'
            include 'MmsSource/MmsSourceDensTr.txt'
        end
        
        real(GP) function MmsSourceDensSlabHe() result(res)
            include 'MmsSource/MmsSourceDensHe_header.txt'
            include 'MmsSource/MmsSourceDensHe.txt'
        end

    end function  

end submodule