getfem-commits
[Top][All Lists]
Advanced

[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 << ","



reply via email to

[Prev in Thread] Current Thread [Next in Thread]