If you are using Gmsh to create more complex grids and are using "Physical groups" to mark different boundary segments, you can normally access these inside your definition of the neumann
function (solution dependent von Neumann boundaries) in your problem file by using something like the following:
NumEqVector neumann(const Element& element,
const FVElementGeometry& fvGeometry,
const ElementVolumeVariables& elemVolVars,
const SubControlVolumeFace& scvf) const
{
...
const auto boundaryId = gridData_->getBoundaryDomainMarker(scvf.boundaryFlag());
...
}
where gridData_
should be a GridData
instance and a member of your problem class. (Add the grid data as argument in your problem constructor, it can be obtained via the grid manager: gridManager.getGridData()
.)
Additionally, you have to specify to use boundary segments and domain markers in your params.input
file:
[Grid]
File = mygrid.msh
DomainMarkers = 1
BoundarySegments = 1
Unfortunately ALUGrid
uses boundary flags differently, therefore you have to adapt your FVGridGeometry
to use the class BoundarySegmentIndexFlag
instead of the normal BoundaryFlag
class. This can be done in your property settings, where you need to add the following:
namespace Properties {
...
template<class GridView>
struct MyGridGeometryTraits : public BoxDefaultGridGeometryTraits<GridView>
{
struct MyScvfTraits : public BoxDefaultScvfGeometryTraits<GridView>
{
using BoundaryFlag = BoundarySegmentIndexFlag;
};
using SubControlVolumeFace = BoxSubControlVolumeFace<GridView, MyScvfTraits>;
};
template<class TypeTag>
struct FVGridGeometry<TypeTag, TTag::MyProblem>
{
private:
static constexpr bool enableCache = getPropValue<TypeTag, Properties::EnableFVGridGeometryCache>();
using GridView = GetPropType<TypeTag, Properties::GridView>;
using Scalar = GetPropType<TypeTag, Properties::Scalar>;
public:
using type = BoxFVGridGeometry<Scalar, GridView, enableCache,
MyGridGeometryTraits<GridView>>;
};
...
}
Boundary flag to store e.g. in sub control volume faces.
This was how to do it when using the Box discretization, for CCTpfa it works similarly:
namespace Properties {
...
template<class GridView>
struct MyGridGeometryTraits : public CCTpfaDefaultGridGeometryTraits<GridView>
{
struct MyScvfTraits : public CCTpfaDefaultScvfGeometryTraits<GridView>
{
using BoundaryFlag = BoundarySegmentIndexFlag;
};
using SubControlVolumeFace = CCTpfaSubControlVolumeFace<GridView, MyScvfTraits>;
};
template<class TypeTag>
struct FVGridGeometry<TypeTag, TTag::MyProblem>
{
private:
static constexpr bool enableCache = getPropValue<TypeTag, Properties::EnableFVGridGeometryCache>();
using GridView = GetPropType<TypeTag, Properties::GridView>;
using Scalar = GetPropType<TypeTag, Properties::Scalar>;
public:
using type = CCTpfaFVGridGeometry<GridView, enableCache,
MyGridGeometryTraits<GridView>>;
};
...
}
Then you can access the boundary marker/physical group in the same way as shown above.
🛠 Edit above doc on GitLab