[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] (no subject)
From: |
Konstantinos Poulios |
Subject: |
[Getfem-commits] (no subject) |
Date: |
Fri, 27 May 2022 05:23:05 -0400 (EDT) |
branch: devel-logari81-interpolate-element-matrices
commit 5f88efb4b1be63caceb0193d4db7b256cad80726
Author: Konstantinos Poulios <logari81@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 << ","