branch: devel-logari81-interpolate-element-matrices commit 5f88efb4b1be63caceb0193d4db7b256cad80726 Author: Konstantinos Poulios <logar...@gmail.com> AuthorDate: Fri May 27 11:22:29 2022 +0200
Support element_K and element_B interpolates in GWFL --- src/getfem/getfem_generic_assembly_tree.h | 2 ++ src/getfem_generic_assembly_compile_and_exec.cc | 15 +++++++++ src/getfem_generic_assembly_semantic.cc | 42 ++++++++++++++++++++++++- src/getfem_generic_assembly_tree.cc | 14 +++++++-- 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/getfem/getfem_generic_assembly_tree.h b/src/getfem/getfem_generic_assembly_tree.h index 0d9ad00a..9c9ba7ac 100644 --- a/src/getfem/getfem_generic_assembly_tree.h +++ b/src/getfem/getfem_generic_assembly_tree.h @@ -158,6 +158,8 @@ namespace getfem { GA_NODE_INTERPOLATE_HESS_TEST, GA_NODE_INTERPOLATE_DIVERG_TEST, GA_NODE_INTERPOLATE_X, + GA_NODE_INTERPOLATE_ELT_K, + GA_NODE_INTERPOLATE_ELT_B, GA_NODE_INTERPOLATE_NORMAL, GA_NODE_INTERPOLATE_DERIVATIVE, GA_NODE_ELEMENTARY, diff --git a/src/getfem_generic_assembly_compile_and_exec.cc b/src/getfem_generic_assembly_compile_and_exec.cc index a875de3f..7b1260e5 100644 --- a/src/getfem_generic_assembly_compile_and_exec.cc +++ b/src/getfem_generic_assembly_compile_and_exec.cc @@ -5577,6 +5577,21 @@ namespace getfem { rmi.instructions.push_back(std::move(pgai)); break; + case GA_NODE_INTERPOLATE_ELT_K: + case GA_NODE_INTERPOLATE_ELT_B: + GMM_ASSERT1(!function_case, + "No use of Interpolate is allowed in functions"); + if (pnode->node_type == GA_NODE_INTERPOLATE_ELT_K) + pgai = std::make_shared<ga_instruction_element_K> + (pnode->tensor(), + rmi.interpolate_infos[pnode->interpolate_name].ctx); + else if (pnode->node_type == GA_NODE_INTERPOLATE_ELT_B) + pgai = std::make_shared<ga_instruction_element_B> + (pnode->tensor(), + rmi.interpolate_infos[pnode->interpolate_name].ctx); + rmi.instructions.push_back(std::move(pgai)); + break; + case GA_NODE_SECONDARY_DOMAIN_X: case GA_NODE_SECONDARY_DOMAIN_NORMAL: { diff --git a/src/getfem_generic_assembly_semantic.cc b/src/getfem_generic_assembly_semantic.cc index 6522ba69..a9b5ac31 100644 --- a/src/getfem_generic_assembly_semantic.cc +++ b/src/getfem_generic_assembly_semantic.cc @@ -99,6 +99,8 @@ namespace getfem { pnode->node_type == GA_NODE_INTERPOLATE_HESS_TEST || pnode->node_type == GA_NODE_INTERPOLATE_DIVERG_TEST || pnode->node_type == GA_NODE_INTERPOLATE_X || + pnode->node_type == GA_NODE_INTERPOLATE_ELT_K || + pnode->node_type == GA_NODE_INTERPOLATE_ELT_B || pnode->node_type == GA_NODE_INTERPOLATE_NORMAL) { workspace.interpolate_transformation(pnode->interpolate_name) ->extract_variables(workspace, vars, ignore_data, m, @@ -160,6 +162,8 @@ namespace getfem { if (interpolate_node || interpolate_test_node || pnode->node_type == GA_NODE_INTERPOLATE_X || + pnode->node_type == GA_NODE_INTERPOLATE_ELT_K || + pnode->node_type == GA_NODE_INTERPOLATE_ELT_B || pnode->node_type == GA_NODE_INTERPOLATE_NORMAL) { std::set<var_trans_pair> vars; workspace.interpolate_transformation(pnode->interpolate_name) @@ -381,7 +385,9 @@ namespace getfem { case GA_NODE_XFEM_MINUS_HESS_TEST: case GA_NODE_XFEM_MINUS_DIVERG_TEST: c += 1.33*(1.22+ga_hash_code(pnode->name)); break; - case GA_NODE_INTERPOLATE_X: case GA_NODE_INTERPOLATE_NORMAL: + case GA_NODE_INTERPOLATE_X: + case GA_NODE_INTERPOLATE_ELT_K: case GA_NODE_INTERPOLATE_ELT_B: + case GA_NODE_INTERPOLATE_NORMAL: case GA_NODE_SECONDARY_DOMAIN_X: case GA_NODE_SECONDARY_DOMAIN_NORMAL: c += M_PI*1.33*ga_hash_code(pnode->interpolate_name); break; @@ -450,6 +456,7 @@ namespace getfem { case GA_NODE_RESHAPE: case GA_NODE_CROSS_PRODUCT: case GA_NODE_IND_MOVE_LAST: case GA_NODE_SWAP_IND: case GA_NODE_CONTRACT: case GA_NODE_INTERPOLATE_X: + case GA_NODE_INTERPOLATE_ELT_K: case GA_NODE_INTERPOLATE_ELT_B: case GA_NODE_INTERPOLATE_NORMAL: case GA_NODE_SECONDARY_DOMAIN_X: case GA_NODE_SECONDARY_DOMAIN_NORMAL: pnode->test_function_type = 0; break; @@ -584,6 +591,23 @@ namespace getfem { } break; } + if (pnode->name.compare("element_K") == 0) { + if (pnode->node_type == GA_NODE_INTERPOLATE) { + pnode->node_type = GA_NODE_INTERPOLATE_ELT_K; + if (ref_elt_dim == 1) + pnode->init_vector_tensor(meshdim); + else + pnode->init_matrix_tensor(meshdim, ref_elt_dim); + } + break; + } + if (pnode->name.compare("element_B") == 0) { + if (pnode->node_type == GA_NODE_INTERPOLATE) { + pnode->node_type = GA_NODE_INTERPOLATE_ELT_B; + pnode->init_matrix_tensor(ref_elt_dim, meshdim); + } + break; + } //[[fallthrough]]; case GA_NODE_ELEMENTARY: // and ... case GA_NODE_INTERPOLATE: case GA_NODE_XFEM_PLUS: @@ -2976,6 +3000,7 @@ namespace getfem { case GA_NODE_INTERPOLATE_DIVERG_TEST: case GA_NODE_INTERPOLATE_HESS_TEST: case GA_NODE_INTERPOLATE_X: + case GA_NODE_INTERPOLATE_ELT_K: case GA_NODE_INTERPOLATE_ELT_B: case GA_NODE_INTERPOLATE_NORMAL: case GA_NODE_INTERPOLATE_DERIVATIVE: { @@ -3452,6 +3477,14 @@ namespace getfem { } break; + case GA_NODE_INTERPOLATE_ELT_K: + GMM_ASSERT1(false, "Sorry, cannot derive the interpolated element_K"); + break; + + case GA_NODE_INTERPOLATE_ELT_B: + GMM_ASSERT1(false, "Sorry, cannot derive the interpolated element_B"); + break; + case GA_NODE_INTERPOLATE_NORMAL: GMM_ASSERT1(false, "Sorry, cannot derive the interpolated Normal"); break; @@ -3967,6 +4000,8 @@ namespace getfem { (workspace.associated_mf(pnode->name) != 0)) marked = true; if (pnode->node_type == GA_NODE_INTERPOLATE_X || + pnode->node_type == GA_NODE_INTERPOLATE_ELT_K || + pnode->node_type == GA_NODE_INTERPOLATE_ELT_B || pnode->node_type == GA_NODE_INTERPOLATE_NORMAL) marked = true; pnode->marked = marked; @@ -4150,6 +4185,11 @@ namespace getfem { case GA_NODE_INTERPOLATE_NORMAL: GMM_ASSERT1(false, "Sorry, Gradient of Normal vector not implemented"); + case GA_NODE_ELT_K: case GA_NODE_ELT_B: + case GA_NODE_INTERPOLATE_ELT_K: case GA_NODE_INTERPOLATE_ELT_B: + GMM_ASSERT1(false, "Sorry, Gradient of element_K or element_B " + "not implemented"); + case GA_NODE_INTERPOLATE_DERIVATIVE: GMM_ASSERT1(false, "Sorry, gradient of the derivative of a " "tranformation not implemented"); diff --git a/src/getfem_generic_assembly_tree.cc b/src/getfem_generic_assembly_tree.cc index d8cf672f..52b17c9e 100644 --- a/src/getfem_generic_assembly_tree.cc +++ b/src/getfem_generic_assembly_tree.cc @@ -552,8 +552,11 @@ namespace getfem { pnode1->nbc1 != pnode2->nbc1) return false; break; - case GA_NODE_INTERPOLATE_X: case GA_NODE_SECONDARY_DOMAIN_X: - case GA_NODE_INTERPOLATE_NORMAL: case GA_NODE_SECONDARY_DOMAIN_NORMAL: + case GA_NODE_INTERPOLATE_X: + case GA_NODE_SECONDARY_DOMAIN_X: + case GA_NODE_INTERPOLATE_ELT_K: case GA_NODE_INTERPOLATE_ELT_B: + case GA_NODE_INTERPOLATE_NORMAL: + case GA_NODE_SECONDARY_DOMAIN_NORMAL: if (pnode1->interpolate_name.compare(pnode2->interpolate_name)) return false; break; @@ -787,6 +790,7 @@ namespace getfem { switch(pnode->node_type) { case GA_NODE_INTERPOLATE: case GA_NODE_INTERPOLATE_X: + case GA_NODE_INTERPOLATE_ELT_K: case GA_NODE_INTERPOLATE_ELT_B: case GA_NODE_INTERPOLATE_NORMAL: case GA_NODE_INTERPOLATE_VAL: case GA_NODE_INTERPOLATE_GRAD: @@ -989,6 +993,12 @@ namespace getfem { case GA_NODE_INTERPOLATE_NORMAL: case GA_NODE_SECONDARY_DOMAIN_NORMAL: str << "Normal"; break; + case GA_NODE_INTERPOLATE_ELT_K: + str << "element_K"; + break; + case GA_NODE_INTERPOLATE_ELT_B: + str << "element_B"; + break; case GA_NODE_INTERPOLATE_DERIVATIVE: str << (pnode->test_function_type == 1 ? "Test_" : "Test2_") << "Interpolate_derivative(" << pnode->interpolate_name_der << ","