This is an automated email from the git hooks/post-receive script. logari81 pushed a commit to branch master in repository getfem.
The following commit(s) were added to refs/heads/master by this push: new 938c963d Maintain underlying mesh_fem type when cloning mesh_fem objects in scripting API 938c963d is described below commit 938c963d4f74d80b1f68c2bc7b98d52c67fcb4c9 Author: Konstantinos Poulios <logar...@gmail.com> AuthorDate: Tue Nov 7 13:37:56 2023 +0100 Maintain underlying mesh_fem type when cloning mesh_fem objects in scripting API --- interface/src/gf_mesh_fem.cc | 37 +++++++++++++++++++++++++++++----- src/getfem/getfem_mesh_fem_level_set.h | 9 +++++---- src/getfem/getfem_partial_mesh_fem.h | 2 ++ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/interface/src/gf_mesh_fem.cc b/interface/src/gf_mesh_fem.cc index 93f33046..3851f036 100644 --- a/interface/src/gf_mesh_fem.cc +++ b/interface/src/gf_mesh_fem.cc @@ -134,10 +134,36 @@ void gf_mesh_fem(getfemint::mexargs_in& m_in, Create a copy of a @tmf.@*/ sub_command ("clone", 1, 1, 0, 1, - - getfem::mesh_fem *mmf2 = to_meshfem_object(in.pop()); - mm = &mmf2->linked_mesh(); - mmf = std::make_shared<getfem::mesh_fem>(*mmf2); + getfem::mesh_fem *mmf_in = to_meshfem_object(in.pop()); + mm = &mmf_in->linked_mesh(); + getfem::mesh_fem_sum *mfsum + = dynamic_cast<getfem::mesh_fem_sum *>(mmf_in); + getfem::mesh_fem_product *mfprod + = dynamic_cast<getfem::mesh_fem_product *>(mmf_in); + getfem::mesh_fem_level_set *mfls + = dynamic_cast<getfem::mesh_fem_level_set *>(mmf_in); + getfem::partial_mesh_fem *mfpart + = dynamic_cast<getfem::partial_mesh_fem *>(mmf_in); + getfem::mesh_fem_global_function *mfglob + = dynamic_cast<getfem::mesh_fem_global_function *>(mmf_in); + if (mfsum) + mmf = std::make_shared<getfem::mesh_fem_sum>(*mfsum); + else if (mfprod) + mmf = std::make_shared<getfem::mesh_fem_product>(*mfprod); + else if (mfls) { + std::shared_ptr<getfem::mesh_fem_level_set> mmfls + = std::make_shared<getfem::mesh_fem_level_set>(mfls->linked_mesh_level_set(), + mfls->linked_mesh_fem()); + mmfls->adapt(); + mmf = mmfls; + } else if (mfpart) { + GMM_WARNING1("Cloning a partial_mesh_fem simply clones the underlying" + " adapted mesh_fem"); + mmf = std::make_shared<getfem::mesh_fem>(mfpart->linked_mesh_fem()); + } else if (mfglob) + mmf = std::make_shared<getfem::mesh_fem_global_function>(*mfglob); + else + mmf = std::make_shared<getfem::mesh_fem>(*mmf_in); ); @@ -156,7 +182,8 @@ void gf_mesh_fem(getfemint::mexargs_in& m_in, if (mmf.get() == 0) { mm = &gfimf->linked_mesh(); msum = std::make_shared<getfem::mesh_fem_sum>(*mm); - mmf = msum; store_meshfem_object(mmf); + mmf = msum; + store_meshfem_object(mmf); } workspace().set_dependence(mmf.get(), gfimf); mftab.push_back(gfimf); diff --git a/src/getfem/getfem_mesh_fem_level_set.h b/src/getfem/getfem_mesh_fem_level_set.h index 1e803b28..c892cbf6 100644 --- a/src/getfem/getfem_mesh_fem_level_set.h +++ b/src/getfem/getfem_mesh_fem_level_set.h @@ -59,12 +59,13 @@ namespace getfem { void build_method_of_convex(size_type cv); public : - void update_from_context(void) const { is_adapted = false; } - void adapt(void); - void clear(void); // to be modified - size_type get_xfem_index(void) const { return xfem_index; } + void update_from_context() const { is_adapted = false; } + void adapt(); + void clear(); // to be modified + size_type get_xfem_index() const { return xfem_index; } const mesh_level_set &linked_mesh_level_set() const { return mls; } + const mesh_fem &linked_mesh_fem() const { return mf; } size_type memsize() const { return mesh_fem::memsize(); // + ... ; diff --git a/src/getfem/getfem_partial_mesh_fem.h b/src/getfem/getfem_partial_mesh_fem.h index c0b7fadb..83ca0a23 100644 --- a/src/getfem/getfem_partial_mesh_fem.h +++ b/src/getfem/getfem_partial_mesh_fem.h @@ -98,6 +98,8 @@ namespace getfem { "the original fem"); } + const mesh_fem &linked_mesh_fem() const { return mf; } + ind_dof_ct ind_basic_dof_of_element(size_type cv) const { return mf.ind_basic_dof_of_element(cv); }