changeset 1134:667e9c588f23 feature/boundary_conditions

Add type for different kind of boundary data and refactor the BoundaryConditions such that they are general w.r.t the boundary data type
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Tue, 11 Oct 2022 18:12:40 +0200
parents a8c8517a310f
children 05b1d6fd6401
files src/BoundaryConditions/BoundaryConditions.jl src/BoundaryConditions/boundary_condition.jl
diffstat 2 files changed, 65 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/BoundaryConditions/BoundaryConditions.jl	Wed Oct 05 22:05:23 2022 +0200
+++ b/src/BoundaryConditions/BoundaryConditions.jl	Tue Oct 11 18:12:40 2022 +0200
@@ -1,12 +1,24 @@
 module BoundaryConditions
 
+export BoundaryDataType
+export ConstantBoundaryData
+export SpaceDependentBoundaryData
+export TimeDependentBoundaryData
+export SpaceDependentBoundaryData
+
 export BoundaryCondition
-export BoundaryConditionType
-export Neumann
-export Dirichlet
+export NeumannCondition
+export DirichletCondition
+export RobinCondition
+
+export data
+export sat
+export sat_tensors
 
 using Sbplib.Grids
+using Sbplib.LazyTensors
 
 include("boundary_condition.jl")
+include("sat.jl")
 
 end # module
--- a/src/BoundaryConditions/boundary_condition.jl	Wed Oct 05 22:05:23 2022 +0200
+++ b/src/BoundaryConditions/boundary_condition.jl	Tue Oct 11 18:12:40 2022 +0200
@@ -1,11 +1,52 @@
-abstract type BoundaryConditionType end
-struct Dirichlet <: BoundaryConditionType end
-struct Neumann <: BoundaryConditionType end
+"""
+    BoundaryDataType
+
+A type for storing boundary data, e.g. constant, space-dependent, time-dependent etc.
+Subtypes of `BoundaryDataType` should store the boundary data in a field `val`, i.e.
+`struct MyBoundaryDataType{T} <: BoundaryDataType val::T end`.
+"""
+abstract type BoundaryDataType end
+
+struct ConstantBoundaryData{T} <: BoundaryDataType
+    val::T
+end
+
+struct SpaceDependentBoundaryData{T} <: BoundaryDataType
+    val::T
+end
+
+struct TimeDependentBoundaryData{T} <: BoundaryDataType
+    val::T
+end
+
+struct SpaceTimeDependentBoundaryData{T} <: BoundaryDataType
+    val::T
+end
 
-struct BoundaryCondition{BCType <: BoundaryConditionType, ID <: BoundaryIdentifier, DType}
-    id::ID
-    data::DType
-    BoundaryCondition{BCType}(id::ID, data::DType) where {BCType <: BoundaryConditionType,
-                                                          ID <: BoundaryIdentifier,
-                                                          DType} = new{BCType,ID,DType}(id, data)
+"""
+    BoundaryCondition
+
+A type for implementing data needed in order to impose a boundary condition.
+Subtypes refer to perticular types of boundary conditions, e.g. Neumann conditions.
+"""
+# TODO: Parametrize the boundary id as well?
+abstract type BoundaryCondition{T<:BoundaryDataType} end
+
+data(bc::BoundaryCondition) = bc.data.val
+
+struct NeumannCondition{BDT<:BoundaryDataType} <: BoundaryCondition{BDT}
+    id::BoundaryIdentifier
+    data::BDT
+end
+
+struct DirichletCondition{BDT<:BoundaryDataType} <: BoundaryCondition{BDT}
+    id::BoundaryIdentifier
+    data::BDT
+end
+
+struct RobinCondition{BDT<:BoundaryDataType,T<:Real} <: BoundaryCondition{BDT}
+    id::BoundaryIdentifier
+    data::BDT
+    α::T
+    β::T
 end
\ No newline at end of file