getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] (no subject)


From: Yves Renard
Subject: [Getfem-commits] (no subject)
Date: Sat, 23 Jun 2018 09:07:17 -0400 (EDT)

branch: master
commit fede46dbefcec8e3aeab9650318484d076228c35
Author: Yves Renard <address@hidden>
Date:   Sat Jun 23 15:06:59 2018 +0200

    fix a problem with Grad(.) operator for test functions
---
 interface/tests/python/check_asm.py     |  3 +
 src/getfem_generic_assembly_semantic.cc | 99 +++++++++++++++++++++++----------
 2 files changed, 72 insertions(+), 30 deletions(-)

diff --git a/interface/tests/python/check_asm.py 
b/interface/tests/python/check_asm.py
index 317f709..d0972c5 100644
--- a/interface/tests/python/check_asm.py
+++ b/interface/tests/python/check_asm.py
@@ -236,3 +236,6 @@ res = gf.asm('expression analysis', str,  mim, 2, md)
 if (res != "(Grad_w(2, 2))"):
   print("Bad gradient"); exit(1)
 
+str = "Grad(u*Test_u)"; print('\nAssembly string "%s" gives:' % str)
+res = gf.asm('expression analysis', str,  mim, 1, md)
+
diff --git a/src/getfem_generic_assembly_semantic.cc 
b/src/getfem_generic_assembly_semantic.cc
index c087ced..a4885b3 100644
--- a/src/getfem_generic_assembly_semantic.cc
+++ b/src/getfem_generic_assembly_semantic.cc
@@ -3737,22 +3737,31 @@ namespace getfem {
       = dal::singleton<ga_predef_function_tab>::instance(0);
 
     switch (pnode->node_type) {
-    case GA_NODE_VAL:
-      pnode->node_type = GA_NODE_GRAD;
+    case GA_NODE_VAL: case GA_NODE_VAL_TEST:
+      if (pnode->node_type == GA_NODE_VAL)
+       pnode->node_type = GA_NODE_GRAD;
+      else
+       pnode->node_type = GA_NODE_GRAD_TEST;
       mi = pnode->tensor().sizes();
       if (mi.back() != 1) mi.push_back(m.dim()); else mi.back() = m.dim();
       pnode->t.adjust_sizes(mi);
       break;
-    case GA_NODE_GRAD:
-      pnode->node_type = GA_NODE_HESS;
+    case GA_NODE_GRAD: case GA_NODE_GRAD_TEST:
+      if (pnode->node_type == GA_NODE_GRAD)
+       pnode->node_type = GA_NODE_HESS;
+      else
+       pnode->node_type = GA_NODE_HESS_TEST;
       mi = pnode->tensor().sizes();
       if (mi.back() != 1) mi.push_back(m.dim()); else mi.back() = m.dim();
       pnode->t.adjust_sizes(mi);
       break;
-    case GA_NODE_HESS:
+    case GA_NODE_HESS: case GA_NODE_HESS_TEST:
       GMM_ASSERT1(false, "Sorry, cannot derive an Hessian once more");
-    case GA_NODE_DIVERG: // Hess_u : Id(meshdim)
-      pnode->node_type = GA_NODE_HESS;
+    case GA_NODE_DIVERG: case GA_NODE_DIVERG_TEST: // Hess_u : Id(meshdim)
+      if (pnode->node_type == GA_NODE_DIVERG)
+       pnode->node_type = GA_NODE_HESS;
+      else
+       pnode->node_type = GA_NODE_HESS_TEST;
       mi = pnode->tensor().sizes();
       mi.pop_back(), mi.push_back(m.dim());
       if (m.dim() > 1) mi.push_back(m.dim());
@@ -3897,22 +3906,31 @@ namespace getfem {
       ga_node_grad(tree, workspace, m, child0);
       break;
 
-    case GA_NODE_ELEMENTARY_VAL:
-      pnode->node_type = GA_NODE_ELEMENTARY_GRAD;
+    case GA_NODE_ELEMENTARY_VAL: case GA_NODE_ELEMENTARY_VAL_TEST:
+      if (pnode->node_type == GA_NODE_ELEMENTARY_VAL)
+       pnode->node_type = GA_NODE_ELEMENTARY_GRAD;
+      else
+       pnode->node_type = GA_NODE_ELEMENTARY_GRAD_TEST;
       mi = pnode->tensor().sizes();
       if (mi.back() != 1) mi.push_back(m.dim()); else mi.back() = m.dim();
       pnode->t.adjust_sizes(mi);
       break;
-    case GA_NODE_ELEMENTARY_GRAD:
-      pnode->node_type = GA_NODE_ELEMENTARY_HESS;
+    case GA_NODE_ELEMENTARY_GRAD: case GA_NODE_ELEMENTARY_GRAD_TEST:
+      if (pnode->node_type == GA_NODE_ELEMENTARY_VAL)
+       pnode->node_type = GA_NODE_ELEMENTARY_HESS;
+      else
+       pnode->node_type = GA_NODE_ELEMENTARY_HESS_TEST;
       mi = pnode->tensor().sizes();
       if (mi.back() != 1) mi.push_back(m.dim()); else mi.back() = m.dim();
       pnode->t.adjust_sizes(mi);
       break;
-    case GA_NODE_ELEMENTARY_HESS:
+    case GA_NODE_ELEMENTARY_HESS: case GA_NODE_ELEMENTARY_HESS_TEST:
       GMM_ASSERT1(false, "Sorry, cannot derive an Hessian once more");
-    case GA_NODE_ELEMENTARY_DIVERG: // Hess_u : Id(meshdim)
-      pnode->node_type = GA_NODE_ELEMENTARY_HESS;
+    case GA_NODE_ELEMENTARY_DIVERG: case GA_NODE_ELEMENTARY_DIVERG_TEST:
+      if (pnode->node_type == GA_NODE_ELEMENTARY_DIVERG)
+       pnode->node_type = GA_NODE_ELEMENTARY_HESS;
+      else
+       pnode->node_type = GA_NODE_ELEMENTARY_HESS_TEST;
       mi = pnode->tensor().sizes();
       mi.pop_back(), mi.push_back(m.dim());
       if (m.dim() > 1) mi.push_back(m.dim());
@@ -3926,22 +3944,31 @@ namespace getfem {
       child1->node_type = GA_NODE_CONSTANT;
       break;
 
-    case GA_NODE_XFEM_PLUS_VAL:
-      pnode->node_type = GA_NODE_XFEM_PLUS_GRAD;
+    case GA_NODE_XFEM_PLUS_VAL: case GA_NODE_XFEM_PLUS_VAL_TEST:
+      if (pnode->node_type == GA_NODE_XFEM_PLUS_VAL)
+       pnode->node_type = GA_NODE_XFEM_PLUS_GRAD;
+      else
+       pnode->node_type = GA_NODE_XFEM_PLUS_GRAD_TEST;
       mi = pnode->tensor().sizes();
       if (mi.back() != 1) mi.push_back(m.dim()); else mi.back() = m.dim();
       pnode->t.adjust_sizes(mi);
       break;
-    case GA_NODE_XFEM_PLUS_GRAD:
-      pnode->node_type = GA_NODE_XFEM_PLUS_HESS;
+    case GA_NODE_XFEM_PLUS_GRAD: case GA_NODE_XFEM_PLUS_GRAD_TEST:
+      if (pnode->node_type == GA_NODE_XFEM_PLUS_GRAD)
+       pnode->node_type = GA_NODE_XFEM_PLUS_HESS;
+      else
+       pnode->node_type = GA_NODE_XFEM_PLUS_HESS_TEST;
       mi = pnode->tensor().sizes();
       if (mi.back() != 1) mi.push_back(m.dim()); else mi.back() = m.dim();
       pnode->t.adjust_sizes(mi);
       break;
-    case GA_NODE_XFEM_PLUS_HESS:
+    case GA_NODE_XFEM_PLUS_HESS: case GA_NODE_XFEM_PLUS_HESS_TEST:
       GMM_ASSERT1(false, "Sorry, cannot derive an Hessian once more");
-    case GA_NODE_XFEM_PLUS_DIVERG: // Hess_u : Id(meshdim)
-      pnode->node_type = GA_NODE_XFEM_PLUS_HESS;
+    case GA_NODE_XFEM_PLUS_DIVERG: case GA_NODE_XFEM_PLUS_DIVERG_TEST: 
+      if (pnode->node_type == GA_NODE_XFEM_PLUS_DIVERG)
+       pnode->node_type = GA_NODE_XFEM_PLUS_HESS;
+      else
+       pnode->node_type = GA_NODE_XFEM_PLUS_HESS_TEST;
       mi = pnode->tensor().sizes();
       mi.pop_back(), mi.push_back(m.dim());
       if (m.dim() > 1) mi.push_back(m.dim());
@@ -3955,22 +3982,31 @@ namespace getfem {
       child1->node_type = GA_NODE_CONSTANT;
       break;
 
-    case GA_NODE_XFEM_MINUS_VAL:
-      pnode->node_type = GA_NODE_XFEM_MINUS_GRAD;
+    case GA_NODE_XFEM_MINUS_VAL: case GA_NODE_XFEM_MINUS_VAL_TEST:
+      if (pnode->node_type == GA_NODE_XFEM_MINUS_VAL)
+       pnode->node_type = GA_NODE_XFEM_MINUS_GRAD;
+      else
+       pnode->node_type = GA_NODE_XFEM_MINUS_GRAD_TEST;
       mi = pnode->tensor().sizes();
       if (mi.back() != 1) mi.push_back(m.dim()); else mi.back() = m.dim();
       pnode->t.adjust_sizes(mi);
       break;
-    case GA_NODE_XFEM_MINUS_GRAD:
-      pnode->node_type = GA_NODE_XFEM_MINUS_HESS;
+    case GA_NODE_XFEM_MINUS_GRAD: case GA_NODE_XFEM_MINUS_GRAD_TEST:
+      if (pnode->node_type == GA_NODE_XFEM_MINUS_GRAD)
+       pnode->node_type = GA_NODE_XFEM_MINUS_HESS;
+      else
+       pnode->node_type = GA_NODE_XFEM_MINUS_HESS_TEST;
       mi = pnode->tensor().sizes();
       if (mi.back() != 1) mi.push_back(m.dim()); else mi.back() = m.dim();
       pnode->t.adjust_sizes(mi);
       break;
-    case GA_NODE_XFEM_MINUS_HESS:
+    case GA_NODE_XFEM_MINUS_HESS: case GA_NODE_XFEM_MINUS_HESS_TEST:
       GMM_ASSERT1(false, "Sorry, cannot derive an Hessian once more");
-    case GA_NODE_XFEM_MINUS_DIVERG: // Hess_u : Id(meshdim)
-      pnode->node_type = GA_NODE_XFEM_MINUS_HESS;
+    case GA_NODE_XFEM_MINUS_DIVERG: case GA_NODE_XFEM_MINUS_DIVERG_TEST:
+      if (pnode->node_type == GA_NODE_XFEM_MINUS_DIVERG)
+       pnode->node_type = GA_NODE_XFEM_MINUS_HESS;
+      else
+       pnode->node_type = GA_NODE_XFEM_MINUS_HESS_TEST;
       mi = pnode->tensor().sizes();
       mi.pop_back(), mi.push_back(m.dim());
       if (m.dim() > 1) mi.push_back(m.dim());
@@ -4190,7 +4226,10 @@ namespace getfem {
              if (pnode->op_type ==  GA_MULT || pnode->op_type ==  GA_COLON ||
                  pnode->op_type ==  GA_DOT) {
                if (pg2->children[1]->tensor_proper_size() == 1) {
-                 pg2->op_type = GA_TMULT;
+                 if (pg2->children[0]->tensor_proper_size() == 1)
+                   pg2->op_type = GA_MULT;
+                 else
+                   pg2->op_type = GA_TMULT;
                  ga_node_grad(tree, workspace, m, pg2->children[1]);
                } else if (pg2->children[0]->tensor_proper_size() == 1) {
                  pg2->op_type = GA_MULT;
@@ -4614,7 +4653,7 @@ namespace getfem {
 
 
     default: GMM_ASSERT1(false, "Unexpected node type " << pnode->node_type
-                         << " in derivation. Internal error.");
+                         << " in gradient. Internal error.");
     }
   }
  



reply via email to

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