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