kinetic_stencil_templates.f90 Source File


Source Code

!-----------------------------------------------------------------------------------------------------------------------------------
! This file is part of ReMKiT1D.
!
! ReMKiT1D is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as 
! published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
!
! ReMKiT1D is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
!
! You should have received a copy of the GNU General Public License along with ReMKiT1D. If not, see <https://www.gnu.org/licenses/>. 
!
! Copyright 2023 United Kingdom Atomic Energy Authority (stefan.mijin@ukaea.uk)
!-----------------------------------------------------------------------------------------------------------------------------------
module kinetic_stencil_templates
    !! author: Stefan Mijin
    !!
    !! Contains kinetic stencil template generation for use in custom model construction

    use data_kinds                             ,only: rk, ik
    use runtime_constants                      ,only: debugging, assertions, assertionLvl
    use assertion_utility                      ,only: assert, assertIdentical, assertPure
    use variable_container_class               ,only: VariableContainer, CalculationRule
    use basic_environment_wrapper              ,only: EnvironmentWrapper
    use partition_class                        ,only: Partition
    use geometry_class                         ,only: Geometry
    use jagged_array_generator_class           ,only: JaggedArrayGenerator
    use interp_stencil_gen_class               ,only: InterpStencilGenerator
    use uwc_diff_stencil_gen_class             ,only: UWCDiffStencilValGenerator
    use fb_diff_stencil_gen_class              ,only: FBDiffStencilValGenerator
    use uwc_bc_stencil_gen_class               ,only: UWCBCStencilValGenerator
    use diffusion_stencil_gen_class            ,only: DiffusionStencilValGenerator
    use derivation_abstract_class              ,only: Derivation
    use mat_derivation_abstract_class          ,only: MatDerivation
    use general_mat_term_class                 ,only: StencilTemplate
    use model_class                            ,only: Model
    use multiplicative_generator_core_class    ,only: MultiplicativeGeneratorCore
    use multiplicative_stencil_generator_class ,only: MultiplicativeStencilGen
    use ddv_stencil_gen_class                  ,only: DDVStencilGenerator 
    use v_diffusion_stencil_gen_class          ,only: VDiffStencilGen 
    use stencil_class                          ,only: Stencil
    use sparse_row_data_class                  ,only: SparseRowData
    use fixed_boltzmann_stencil_gen_class      ,only: FixedBoltzmannStencilGen
    use modelbound_CRM_data_class              ,only: ModelboundCRMData
    use modelbound_data_abstract_class         ,only: ModelboundData
    use scaling_lbc_stencil_gen_class          ,only: ScalingLBCStencilGen
    use f_scaling_derivation_class             ,only: FScalingDerivation
    use term_moment_stencil_gen_class          ,only: TermMomentStencilGenerator
    use variable_boltzmann_stencil_gen_class   ,only: VariableBoltzmannStencilGen
    use physical_constants
    use support_functions
    use support_types
    use key_names

    implicit none 

!-----------------------------------------------------------------------------------------------------------------------------------
    interface 
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initKineticStencilTemplate(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar,mbData)
        !! Initialize kinetic stencil template based on existing model, environment object, and JSON file

        type(StencilTemplate)            ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)         ,intent(inout) :: envObj
        character(*)                     ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)                     ,intent(in)    :: evolvedVar
        character(*)                     ,intent(in)    :: implicitVar
        class(ModelboundData) ,optional ,intent(in)     :: mbData

    end subroutine initKineticStencilTemplate
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initKinDiagonalStencilTemplate(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar)
        !! Initialize diagonal stencil template based on environment object and JSON file

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar

    end subroutine initKinDiagonalStencilTemplate
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initMomentStencilTemplate(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar)
        !! Initialize distribution moment stencil template based on environment object and JSON file

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar

    end subroutine initMomentStencilTemplate
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initSpatialDiffStencilTemplate(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar)
        !! Initialize d/dx kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar

    end subroutine initSpatialDiffStencilTemplate
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initDDVStencilTemplate(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar)
        !! Initialize d/dv kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar

    end subroutine initDDVStencilTemplate
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initVelDiffusionStencilTemplate(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar)
        !! Initialize d^2/d^2v kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar

    end subroutine initVelDiffusionStencilTemplate
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initIJStencilTemplate(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar)
        !! Initialize Shkarofsky I/J integral kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar

    end subroutine initIJStencilTemplate
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initFixedBoltzmannStencil(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar,mbData)
        !! Initialize fixed mapping Boltzmann kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        class(ModelboundCRMData)   ,intent(in)    :: mbData

    end subroutine initFixedBoltzmannStencil
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initScalingLBCStencil(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar)
        !! Initialize scaling logical boundary condition kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar

    end subroutine initScalingLBCStencil
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initFixedBoltzmannStencilDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,mbData,&
        evolvedHarmonic,transitionIndex,fixedEnergyIndex,absorptionTerm,dbTerm)
        !! Initialize fixed mapping Boltzmann kinetic stencil template based on environment non-JSON inputs. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        class(ModelboundCRMData)   ,intent(in)    :: mbData
        integer(ik)                ,intent(in)    :: evolvedHarmonic
        integer(ik)                ,intent(in)    :: transitionIndex
        integer(ik)                ,intent(in)    :: fixedEnergyIndex
        logical                    ,intent(in)    :: absorptionTerm
        logical                    ,intent(in)    :: dbTerm

    end subroutine initFixedBoltzmannStencilDirect 
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initKinDiagonalStencilTemplateDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,&
        evolvedXCells,evolvedHarmonics,evolvedVCells)
        !! Initialize diagonal stencil template based on environment object and JSON file

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        integer(ik) ,dimension(:)  ,intent(in)    :: evolvedXCells
        integer(ik) ,dimension(:)  ,intent(in)    :: evolvedHarmonics
        integer(ik) ,dimension(:)  ,intent(in)    :: evolvedVCells

    end subroutine initKinDiagonalStencilTemplateDirect
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initMomentStencilTemplateDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,momentHarmonic,momentOrder)
        !! Initialize distribution moment stencil template based on direct input data
    
        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        integer(ik)                ,intent(in)    :: momentHarmonic
        integer(ik)                ,intent(in)    :: momentOrder

    end subroutine initMomentStencilTemplateDirect
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initSpatialDiffStencilTemplateDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,rowHarmonic,colHarmonic)
        !! Initialize d/dx kinetic stencil template based on direct input. 
    
        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        integer(ik)                ,intent(in)    :: rowHarmonic
        integer(ik)                ,intent(in)    :: colHarmonic

    end subroutine initSpatialDiffStencilTemplateDirect
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initDDVStencilTemplateDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,rowHarmonic,colHarmonic,&
        fixedC,fixedInterp,cfAtZero,modelboundC,modelboundInterp)
        !! Initialize d/dv kinetic stencil template based on direct input. 

        type(StencilTemplate)            ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)         ,intent(inout) :: envObj
        character(*)                     ,intent(in)    :: evolvedVar
        character(*)                     ,intent(in)    :: implicitVar
        integer(ik)                      ,intent(in)    :: rowHarmonic
        integer(ik)                      ,intent(in)    :: colHarmonic
        real(rk) ,optional ,dimension(:) ,intent(in)    :: fixedC
        real(rk) ,optional ,dimension(:) ,intent(in)    :: fixedInterp
        real(rk) ,optional ,dimension(2) ,intent(in)    :: cfAtZero
        character(*) ,optional           ,intent(in)    :: modelboundC
        character(*) ,optional           ,intent(in)    :: modelboundInterp
    
    end subroutine initDDVStencilTemplateDirect 
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initVelDiffusionStencilTemplateDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,rowHarmonic,&
                                                            colHarmonic,fixedA,adfAtZero,modelboundA)
        !! Initialize d^2/d^2v kinetic stencil template based on direct inputs. 

        type(StencilTemplate)            ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)         ,intent(inout) :: envObj
        character(*)                     ,intent(in)    :: evolvedVar
        character(*)                     ,intent(in)    :: implicitVar
        integer(ik)                      ,intent(in)    :: rowHarmonic
        integer(ik)                      ,intent(in)    :: colHarmonic
        real(rk) ,optional ,dimension(:) ,intent(in)    :: fixedA
        real(rk) ,optional ,dimension(2) ,intent(in)    :: adfAtZero
        character(*) ,optional           ,intent(in)    :: modelboundA

    end subroutine initVelDiffusionStencilTemplateDirect
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initIJStencilTemplateDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,&
        rowHarmonic,colHarmonic,integralIndex,jIntegral)
        !! Initialize Shkarofsky I/J integral kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        integer(ik)                ,intent(in)    :: rowHarmonic
        integer(ik)                ,intent(in)    :: colHarmonic
        integer(ik)                ,intent(in)    :: integralIndex
        logical                    ,intent(in)    :: jIntegral

    end subroutine initIJStencilTemplateDirect
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initScalingLBCStencilDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,rowHarmonic,colHarmonic,&
        decompHarmonics,derivName,derivReqVars,leftBoundary)
        !! Initialize scaling logical boundary condition kinetic stencil template based on direct input. 

        type(StencilTemplate)           ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)        ,intent(inout) :: envObj
        character(*)                    ,intent(in)    :: evolvedVar
        character(*)                    ,intent(in)    :: implicitVar
        integer(ik)                     ,intent(in)    :: rowHarmonic
        integer(ik)                     ,intent(in)    :: colHarmonic
        integer(ik) ,dimension(:)       ,intent(in)    :: decompHarmonics
        character(*)                    ,intent(in)    :: derivName
        type(StringArray) ,dimension(:) ,intent(in)    :: derivReqVars
        logical ,optional               ,intent(in)    :: leftBoundary

    end subroutine initScalingLBCStencilDirect
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initTermMomentStencil(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar)
        !! Initialize term moment kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar

    end subroutine initTermMomentStencil
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initTermMomentStencilDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,momentOrder,colHarmonic,termName)
        !! Initialize term moment kinetic stencil template based on direct input.
    
        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        integer(ik)                ,intent(in)    :: momentOrder
        integer(ik)                ,intent(in)    :: colHarmonic
        character(*)               ,intent(in)    :: termName

    end subroutine initTermMomentStencilDirect
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initVariableBoltzmannStencil(stencilTemplateObj,envObj,jsonPrefix,evolvedVar,implicitVar,mbData)
        !! Initialize variable mapping Boltzmann kinetic stencil template based on environment object and JSON file. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: jsonPrefix !! prefix for JSON keys for this template
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        class(ModelboundCRMData)   ,intent(in)    :: mbData

    end subroutine initVariableBoltzmannStencil
!-----------------------------------------------------------------------------------------------------------------------------------
    module subroutine initVariableBoltzmannStencilDirect(stencilTemplateObj,envObj,evolvedVar,implicitVar,mbData,&
        evolvedHarmonic,transitionIndex,absorptionTerm,superelasticTerm)
        !! Initialize variable mapping Boltzmann kinetic stencil template based on environment non-JSON inputs. 

        type(StencilTemplate)      ,intent(inout) :: stencilTemplateObj
        type(EnvironmentWrapper)   ,intent(inout) :: envObj
        character(*)               ,intent(in)    :: evolvedVar
        character(*)               ,intent(in)    :: implicitVar
        class(ModelboundCRMData)   ,intent(in)    :: mbData
        integer(ik)                ,intent(in)    :: evolvedHarmonic
        integer(ik)                ,intent(in)    :: transitionIndex
        logical                    ,intent(in)    :: absorptionTerm
        logical                    ,intent(in)    :: superelasticTerm

    end subroutine initVariableBoltzmannStencilDirect 
!-----------------------------------------------------------------------------------------------------------------------------------
    end interface
!-----------------------------------------------------------------------------------------------------------------------------------
end module kinetic_stencil_templates
!-----------------------------------------------------------------------------------------------------------------------------------