From 6b10e48f8f09abc5f0bd890ad43a57f4fd1142ec Mon Sep 17 00:00:00 2001 From: Frederik Hennig <frederik.hennig@fau.de> Date: Wed, 6 Nov 2024 15:28:55 +0100 Subject: [PATCH] refactor hbb boundaries to take a blockforest ref, instead of a shared_ptr. Extend SweepProperties to accept custom initializers. --- include/GenericHbbBoundary.hpp | 18 +++++++++--------- src/sfg_walberla/api.py | 14 ++++++++++++-- src/sfg_walberla/boundaries/hbb.py | 2 +- src/sfg_walberla/sweep.py | 18 +++++++++++++++--- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/include/GenericHbbBoundary.hpp b/include/GenericHbbBoundary.hpp index a81ec74..cf9e954 100644 --- a/include/GenericHbbBoundary.hpp +++ b/include/GenericHbbBoundary.hpp @@ -69,22 +69,22 @@ public: using Stencil = Stencil_T; using IndexVectors = BoundaryIndexVectors< HbbLink >; - GenericHbbBoundary(const std::shared_ptr< StructuredBlockForest >& blocks) + GenericHbbBoundary(StructuredBlockForest& blocks) { auto createIdxVector = [](IBlock* const, StructuredBlockStorage* const) { return new IndexVectors(); }; - indexVectorsId_ = blocks->addStructuredBlockData< IndexVectors >(createIdxVector); + indexVectorsId_ = blocks.addStructuredBlockData< IndexVectors >(createIdxVector); } template< typename FlagField_T > - void fillFromFlagField(const shared_ptr< StructuredBlockForest >& blocks, ConstBlockDataID flagFieldID, + void fillFromFlagField(StructuredBlockForest& blocks, ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID, FlagUID domainFlagUID) { - for (auto blockIt = blocks->begin(); blockIt != blocks->end(); ++blockIt) - fillFromFlagField< FlagField_T >(&*blockIt, flagFieldID, boundaryFlagUID, domainFlagUID); + for (auto & block: blocks) + fillFromFlagField< FlagField_T >(block, flagFieldID, boundaryFlagUID, domainFlagUID); } template< typename FlagField_T > - void fillFromFlagField(IBlock* block, ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID, FlagUID domainFlagUID); + void fillFromFlagField(IBlock& block, ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID, FlagUID domainFlagUID); protected: BlockDataID indexVectorsId_; @@ -92,12 +92,12 @@ protected: template< typename Stencil_T > template< typename FlagField_T > -void GenericHbbBoundary< Stencil_T >::fillFromFlagField(IBlock* block, ConstBlockDataID flagFieldID, +void GenericHbbBoundary< Stencil_T >::fillFromFlagField(IBlock& block, ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID, FlagUID domainFlagUID) { - auto* indexVectors = block->getData< IndexVectors >(indexVectorsId_); + auto* indexVectors = block.getData< IndexVectors >(indexVectorsId_); auto& indexVectorAll = indexVectors->vector(); - auto* flagField = block->getData< FlagField_T >(flagFieldID); + auto* flagField = block.getData< FlagField_T >(flagFieldID); if (!(flagField->flagExists(boundaryFlagUID) && flagField->flagExists(domainFlagUID))) return; diff --git a/src/sfg_walberla/api.py b/src/sfg_walberla/api.py index f5d391a..b9f78ad 100644 --- a/src/sfg_walberla/api.py +++ b/src/sfg_walberla/api.py @@ -24,7 +24,7 @@ class Vector2(SrcVector): def extract_component(self, coordinate: int) -> AugExpr: if coordinate > 1: raise ValueError(f"Cannot extract component {coordinate} from Vector2") - + return AugExpr(self._value_type).bind("{}[{}]", self, coordinate) @@ -66,9 +66,19 @@ class StructuredBlockForest: @staticmethod def shared_ptr_ref(name, const: bool = False): const_str = "const " if const else "" - dtype = PsCustomType(f"std::shared_ptr< {const_str}walberla::StructuredBlockForest >", const=True) + dtype = PsCustomType( + f"std::shared_ptr< {const_str}walberla::StructuredBlockForest >", const=True + ) return AugExpr(Ref(dtype)).var(name) + @staticmethod + def ref_type(const: bool = False): + return Ref(PsCustomType("walberla::StructuredBlockForest", const=const)) + + @staticmethod + def ref(name, const: bool = False): + return AugExpr(StructuredBlockForest.ref_type(const)).var(name) + class GhostLayerFieldPtr(SrcField): diff --git a/src/sfg_walberla/boundaries/hbb.py b/src/sfg_walberla/boundaries/hbb.py index 97db11d..49d0830 100644 --- a/src/sfg_walberla/boundaries/hbb.py +++ b/src/sfg_walberla/boundaries/hbb.py @@ -66,7 +66,7 @@ class BoundaryIndexVectorsPtr(SrcField): class HbbBoundaryProperties(SweepClassProperties): def _constructor(self, sfg: SfgComposer) -> SfgClassComposer.ConstructorBuilder: - sbfs = StructuredBlockForest.shared_ptr_ref("blocks") + sbfs = StructuredBlockForest.ref("blocks") return sfg.constructor(sbfs).init("GenericHbbBoundary")(sbfs) diff --git a/src/sfg_walberla/sweep.py b/src/sfg_walberla/sweep.py index 59f7b38..89e4114 100644 --- a/src/sfg_walberla/sweep.py +++ b/src/sfg_walberla/sweep.py @@ -21,7 +21,7 @@ from pystencils.types import PsType, constify, deconstify, PsCustomType from pystencilssfg import SfgComposer from pystencilssfg.lang import VarLike, asvar, SfgVar, AugExpr, Ref, SrcVector -from .api import GhostLayerFieldPtr, IBlockPtr, BlockDataID, Vector2, Vector3 +from .api import StructuredBlockForest, GhostLayerFieldPtr, IBlockPtr, BlockDataID, Vector2, Vector3 class SweepClassProperties: @@ -31,6 +31,7 @@ class SweepClassProperties: dtype: PsType getter: bool setter: bool + initializer: AugExpr | None = None def __post_init__(self): if self.dtype.const and self.setter: @@ -103,10 +104,21 @@ class SweepClassProperties: ctor = self._constructor(sfg) for p in self.properties: - ctor.add_param(p.var) + if p.initializer is None: + ctor.add_param(p.var) + else: + for var in p.initializer.depends: + if var not in ctor.parameters: + if deconstify(var.dtype) == StructuredBlockForest.ref_type(): + ctor.add_param(var, 0) + else: + ctor.add_param(var) for p in self._properties.values(): - ctor.init(p.member_var)(p.var) + if p.initializer is not None: + ctor.init(p.member_var)(p.initializer) + else: + ctor.init(p.member_var)(p.var) methods = chain.from_iterable(p.make_methods(sfg) for p in self.properties) pub = sfg.public(ctor, *(methods)) -- GitLab