From 7e560e157de58ee1f30dfba8f1c7749ca9ec8964 Mon Sep 17 00:00:00 2001 From: Joachim Schoeberl Date: Wed, 22 Mar 2023 21:23:22 +0100 Subject: [PATCH] Setting refinement flags and adaptive refinement in Netgen --- libsrc/meshing/bisect.hpp | 4 +-- libsrc/meshing/python_mesh.cpp | 48 +++++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/libsrc/meshing/bisect.hpp b/libsrc/meshing/bisect.hpp index 9cab3ef3..eef60d73 100644 --- a/libsrc/meshing/bisect.hpp +++ b/libsrc/meshing/bisect.hpp @@ -10,8 +10,8 @@ public: const char * femcode; int maxlevel; int usemarkedelements; - bool refine_hp; - bool refine_p; + bool refine_hp = false; + bool refine_p = false; bool onlyonce = false; NgTaskManager task_manager = &DummyTaskManager; NgTracer tracer = &DummyTracer; diff --git a/libsrc/meshing/python_mesh.cpp b/libsrc/meshing/python_mesh.cpp index 50665ed3..2be7d9cd 100644 --- a/libsrc/meshing/python_mesh.cpp +++ b/libsrc/meshing/python_mesh.cpp @@ -415,7 +415,8 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) ) .def("__repr__", &ToString) .def_property("index", &Element::GetIndex, &Element::SetIndex) - .def_property("curved", &Element::IsCurved, &Element::SetCurved) + .def_property("curved", &Element::IsCurved, &Element::SetCurved) + .def_property("refine", &Element::TestRefinementFlag, &Element::SetRefinementFlag) .def_property_readonly("vertices", FunctionPointer ([](const Element & self) -> py::list { @@ -451,7 +452,11 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) py::detail::field_descriptor { "np", data_layout["np"], sizeof(int8_t), py::format_descriptor::format(), - pybind11::dtype("int8") } + pybind11::dtype("int8") }, + py::detail::field_descriptor { + "refine", data_layout["refine"], sizeof(bool), + py::format_descriptor::format(), + py::detail::npy_format_descriptor::dtype() } }); } @@ -496,6 +501,7 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) ) .def_property("index", &Element2d::GetIndex, &Element2d::SetIndex) .def_property("curved", &Element2d::IsCurved, &Element2d::SetCurved) + .def_property("refine", &Element2d::TestRefinementFlag, &Element2d::SetRefinementFlag) .def_property_readonly("vertices", FunctionPointer([](const Element2d & self) -> py::list { @@ -511,7 +517,7 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) for (int i = 0; i < self.GetNP(); i++) li.append (py::cast(self[i])); return li; - })) + })) ; if(ngcore_have_numpy) @@ -530,7 +536,11 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) py::detail::field_descriptor { "np", data_layout["np"], sizeof(int8_t), py::format_descriptor::format(), - pybind11::dtype("int8") } + pybind11::dtype("int8") }, + py::detail::field_descriptor { + "refine", data_layout["refine"], sizeof(bool), + py::format_descriptor::format(), + py::detail::npy_format_descriptor::dtype() } }); } @@ -1220,12 +1230,32 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) }, py::arg("mp")=nullptr, py::call_guard()) .def ("Refine", FunctionPointer - ([](Mesh & self) + ([](Mesh & self, bool adaptive) { - self.GetGeometry()->GetRefinement().Refine(self); - self.UpdateTopology(); - }),py::call_guard()) - + if (!adaptive) + { + self.GetGeometry()->GetRefinement().Refine(self); + self.UpdateTopology(); + } + else + { + BisectionOptions biopt; + biopt.usemarkedelements = 1; + biopt.refine_p = 0; + biopt.refine_hp = 0; + /* + biopt.onlyonce = onlyonce; + if (reftype == NG_REFINE_P) + biopt.refine_p = 1; + if (reftype == NG_REFINE_HP) + biopt.refine_hp = 1; + */ + self.GetGeometry()->GetRefinement().Bisect (self, biopt); + self.UpdateTopology(); + self.GetCurvedElements().SetIsHighOrder (false); + } + }), py::arg("adaptive")=false, py::call_guard()) + .def("ZRefine", &Mesh::ZRefine) .def ("SecondOrder", FunctionPointer