diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp index c060da50d6da17915937edda6f5403a9e604355e..9b698b9e095ff6c227c58a2e6fe6bae5f7f72ad4 100644 --- a/src/language/modules/MeshModule.cpp +++ b/src/language/modules/MeshModule.cpp @@ -308,6 +308,46 @@ MeshModule::MeshModule() return DualMeshManager::instance().getMedianDualMesh(mesh_v); } + )); + + this->_addBuiltinFunction("cell_owner", std::function( + + [](const std::shared_ptr<const MeshVariant>& mesh_v) + -> std::shared_ptr<const ItemValueVariant> { + return std::visit( + [&](auto&& mesh) { + const auto& connectivity = mesh->connectivity(); + auto cell_owner = connectivity.cellOwner(); + CellValue<long int> cell_owner_long{connectivity}; + parallel_for( + connectivity.numberOfCells(), PUGS_LAMBDA(const CellId cell_id) { + cell_owner_long[cell_id] = cell_owner[cell_id]; + }); + return std::make_shared<const ItemValueVariant>(cell_owner_long); + }, + mesh_v->variant()); + } + + )); + + this->_addBuiltinFunction("node_owner", std::function( + + [](const std::shared_ptr<const MeshVariant>& mesh_v) + -> std::shared_ptr<const ItemValueVariant> { + return std::visit( + [&](auto&& mesh) { + const auto& connectivity = mesh->connectivity(); + auto node_owner = connectivity.nodeOwner(); + NodeValue<long int> node_owner_long{connectivity}; + parallel_for( + connectivity.numberOfNodes(), PUGS_LAMBDA(const NodeId node_id) { + node_owner_long[node_id] = node_owner[node_id]; + }); + return std::make_shared<const ItemValueVariant>(node_owner_long); + }, + mesh_v->variant()); + } + )); }