getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] [getfem-commits] branch master updated: A attempt for m


From: Yves Renard
Subject: [Getfem-commits] [getfem-commits] branch master updated: A attempt for making diff working with interpolate transformations
Date: Sun, 10 Jan 2021 11:27:00 -0500

This is an automated email from the git hooks/post-receive script.

renard pushed a commit to branch master
in repository getfem.

The following commit(s) were added to refs/heads/master by this push:
     new 56d8db1  A attempt for making diff working with interpolate 
transformations
56d8db1 is described below

commit 56d8db12077ba5f813223561387309537030e9ed
Author: Yves Renard <Yves.Renard@insa-lyon.fr>
AuthorDate: Sun Jan 10 17:26:48 2021 +0100

    A attempt for making diff working with interpolate transformations
---
 src/getfem_generic_assembly_semantic.cc | 86 +++++++++++++++++----------------
 1 file changed, 45 insertions(+), 41 deletions(-)

diff --git a/src/getfem_generic_assembly_semantic.cc 
b/src/getfem_generic_assembly_semantic.cc
index 2cf6b18..b2df289 100644
--- a/src/getfem_generic_assembly_semantic.cc
+++ b/src/getfem_generic_assembly_semantic.cc
@@ -35,7 +35,7 @@ namespace getfem {
   static void ga_node_derivation
   (ga_tree &tree, const ga_workspace &workspace, const mesh &m,
    pga_tree_node pnode, const std::string &varname,
-   const std::string &interpolatename, size_type order);
+   const std::string &interpolatename, size_type order, bool any_trans = 
false);
 
   static void ga_node_grad(ga_tree &tree, const ga_workspace &workspace,
                            const mesh &m, pga_tree_node pnode);
@@ -115,11 +115,11 @@ namespace getfem {
   static bool ga_node_mark_tree_for_variable
   (pga_tree_node pnode, const ga_workspace &workspace, const mesh &m,
    const std::string &varname,
-   const std::string &interpolatename) {
+   const std::string &interpolatename, bool any_trans = false) {
     bool marked = false;
     for (size_type i = 0; i < pnode->children.size(); ++i)
       if (ga_node_mark_tree_for_variable(pnode->children[i], workspace, m,
-                                         varname, interpolatename))
+                                         varname, interpolatename, any_trans))
         marked = true;
 
     bool plain_node(pnode->node_type == GA_NODE_VAL ||
@@ -155,7 +155,8 @@ namespace getfem {
     if ((plain_node || interpolate_node || secondary_node ||
          elementary_node || xfem_node) &&
         (pnode->name.compare(varname) == 0 &&
-         pnode->interpolate_name.compare(interpolatename) == 0)) marked = true;
+         (any_trans || pnode->interpolate_name.compare(interpolatename) == 0)))
+      marked = true;
 
     if (interpolate_node || interpolate_test_node ||
         pnode->node_type == GA_NODE_INTERPOLATE_X ||
@@ -167,7 +168,8 @@ namespace getfem {
       for (std::set<var_trans_pair>::iterator it=vars.begin();
            it != vars.end(); ++it) {
         if (it->varname.compare(varname) == 0 &&
-            it->transname.compare(interpolatename) == 0) marked = true;
+            (any_trans ||
+             it->transname.compare(interpolatename) == 0)) marked = true;
       }
     }
     pnode->marked = marked;
@@ -1951,8 +1953,10 @@ namespace getfem {
             ga_throw_error(pnode->expr, child2->pos, "Cannot derive further "
                            "this order two expression");
 
-          if (ga_node_mark_tree_for_variable(child1,workspace,me,vardiff,"")) {
-            ga_node_derivation(tree, workspace, me, child1, 
vardiff,"",order+1);
+          if (ga_node_mark_tree_for_variable(child1,workspace,me,
+                                             vardiff,"",true)) {
+            ga_node_derivation(tree, workspace, me, child1,
+                               vardiff,"",order+1, true);
             child1 = pnode->children[1];
             ga_node_analysis(tree, workspace, child1, me, ref_elt_dim,
                              eval_fixed_size, ignore_X, option);
@@ -3226,7 +3230,7 @@ namespace getfem {
                                  pga_tree_node pnode,
                                  const std::string &varname,
                                  const std::string &interpolatename,
-                                 size_type order) {
+                                 size_type order, bool any_trans) {
 
     size_type nbch = pnode->children.size();
     pga_tree_node child0 = (nbch > 0) ? pnode->children[0] : 0;
@@ -3267,7 +3271,8 @@ namespace getfem {
         bool is_diverg(pnode->node_type == GA_NODE_INTERPOLATE_DIVERG);
 
         bool ivar = (pnode->name.compare(varname) == 0 &&
-                     pnode->interpolate_name.compare(interpolatename) == 0);
+                     (any_trans ||
+                      pnode->interpolate_name.compare(interpolatename) == 0));
         bool itrans = !ivar;
         if (!itrans) {
           std::set<var_trans_pair> vars;
@@ -3288,9 +3293,8 @@ namespace getfem {
           tree.duplicate_with_addition(pnode);
           pnode_trans = pnode->parent->children[1];
         }
-
         if (ivar) { // Derivative wrt the interpolated variable
-          mi.resize(1); mi[0] = 2;
+         mi.resize(1); mi[0] = 2;
           for (size_type i = 0; i < pnode->tensor_order(); ++i)
             mi.push_back(pnode->tensor_proper_size(i));
           pnode->t.adjust_sizes(mi);
@@ -3433,7 +3437,7 @@ namespace getfem {
 
     case GA_NODE_INTERPOLATE_FILTER:
       ga_node_derivation(tree, workspace, m, child0, varname,
-                         interpolatename, order);
+                         interpolatename, order, any_trans);
       break;
 
     case GA_NODE_SECONDARY_DOMAIN_VAL:
@@ -3499,16 +3503,16 @@ namespace getfem {
         case GA_PLUS: case GA_MINUS:
           if (mark0 && mark1) {
             ga_node_derivation(tree, workspace, m, child0, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
             ga_node_derivation(tree, workspace, m, child1, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
           } else if (mark0) {
             ga_node_derivation(tree, workspace, m, child0, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
             tree.replace_node_by_child(pnode, 0);
           } else {
             ga_node_derivation(tree, workspace, m, child1, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
             if (pnode->op_type == GA_MINUS) {
               pnode->op_type = GA_UNARY_MINUS;
               tree.clear_node(child0);
@@ -3521,7 +3525,7 @@ namespace getfem {
       case GA_UNARY_MINUS: case GA_QUOTE: case GA_SYM: case GA_SKEW:
       case GA_TRACE: case GA_DEVIATOR: case GA_PRINT:
         ga_node_derivation(tree, workspace, m, child0, varname,
-                           interpolatename, order);
+                           interpolatename, order, any_trans);
         break;
 
       case GA_DOT: case GA_MULT: case GA_COLON: case GA_TMULT:
@@ -3531,7 +3535,7 @@ namespace getfem {
               (pnode->op_type != GA_MULT || child0->tensor_order() < 2) &&
               (pnode->op_type != GA_DOT  || child0->tensor_order() < 2)) {
             ga_node_derivation(tree, workspace, m, child1, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
             tree.insert_node(pnode, GA_NODE_OP);
             pnode->parent->op_type = GA_MULT;
             tree.add_child(pnode->parent);
@@ -3547,17 +3551,17 @@ namespace getfem {
                  child1->tensor_proper_size()== 1))
               std::swap(pnode->children[0], pnode->children[1]);
             ga_node_derivation(tree, workspace, m, child0, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
             ga_node_derivation(tree, workspace, m,
                                pnode->parent->children[1]->children[1],
-                               varname, interpolatename, order);
+                               varname, interpolatename, order, any_trans);
           }
         } else if (mark0) {
           ga_node_derivation(tree, workspace, m, child0, varname,
-                             interpolatename, order);
+                             interpolatename, order, any_trans);
         } else
           ga_node_derivation(tree, workspace, m, child1, varname,
-                             interpolatename, order);
+                             interpolatename, order, any_trans);
         break;
 
       case GA_DIV: case GA_DOTDIV:
@@ -3569,7 +3573,7 @@ namespace getfem {
             if (mark0) {
               tree.duplicate_with_substraction(pnode);
               ga_node_derivation(tree, workspace, m, child0, varname,
-                                 interpolatename, order);
+                                 interpolatename, order, any_trans);
               pnode = pnode->parent->children[1];
             } else {
               tree.insert_node(pnode, GA_NODE_OP);
@@ -3592,10 +3596,10 @@ namespace getfem {
           tree.copy_node(pnode_param->children[1],
                          pnode_mult, pnode_mult->children[1]);
           ga_node_derivation(tree, workspace, m, pnode_mult->children[1],
-                             varname, interpolatename, order);
+                             varname, interpolatename, order, any_trans);
         } else {
           ga_node_derivation(tree, workspace, m, child0, varname,
-                             interpolatename, order);
+                             interpolatename, order, any_trans);
         }
         break;
 
@@ -3607,7 +3611,7 @@ namespace getfem {
       for (size_type i = 0; i < pnode->children.size(); ++i) {
         if (pnode->children[i]->marked)
           ga_node_derivation(tree, workspace, m, pnode->children[i],
-                             varname, interpolatename, order);
+                             varname, interpolatename, order, any_trans);
         else {
           pnode->children[i]->init_scalar_tensor(scalar_type(0));
           pnode->children[i]->node_type = GA_NODE_ZERO;
@@ -3621,28 +3625,28 @@ namespace getfem {
           child0->node_type == GA_NODE_SWAP_IND||
           child0->node_type == GA_NODE_IND_MOVE_LAST) {
         ga_node_derivation(tree, workspace, m, pnode->children[1],
-                           varname, interpolatename, order);
+                           varname, interpolatename, order, any_trans);
       } else if (child0->node_type == GA_NODE_CROSS_PRODUCT) {
         pga_tree_node child2 = pnode->children[2];
         bool mark2 = child2->marked;
         if (mark1 && mark2) {
           tree.duplicate_with_addition(pnode);
           ga_node_derivation(tree, workspace, m, child1, varname,
-                             interpolatename, order);
+                             interpolatename, order, any_trans);
           ga_node_derivation(tree, workspace, m,
                              pnode->parent->children[1]->children[2],
-                             varname, interpolatename, order);
+                             varname, interpolatename, order, any_trans);
         } else if (mark1) {
           ga_node_derivation(tree, workspace, m, child1, varname,
-                             interpolatename, order);
+                             interpolatename, order, any_trans);
         } else
           ga_node_derivation(tree, workspace, m, child2, varname,
-                             interpolatename, order);
+                             interpolatename, order, any_trans);
       } else if (child0->node_type == GA_NODE_CONTRACT) {
 
         if (pnode->children.size() == 4) {
           ga_node_derivation(tree, workspace, m, pnode->children[1],
-                             varname, interpolatename, order);
+                             varname, interpolatename, order, any_trans);
         } else if (pnode->children.size() == 5 || pnode->children.size() == 7) 
{
           size_type n2 = (pnode->children.size()==5) ? 3 : 4;
           pga_tree_node child2 = pnode->children[n2];
@@ -3650,16 +3654,16 @@ namespace getfem {
           if (mark1 && child2->marked) {
             tree.duplicate_with_addition(pnode);
             ga_node_derivation(tree, workspace, m, child1, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
             ga_node_derivation(tree, workspace, m,
                                pnode->parent->children[1]->children[n2],
-                               varname, interpolatename, order);
+                               varname, interpolatename, order, any_trans);
           } else if (mark1) {
             ga_node_derivation(tree, workspace, m, child1, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
           } else
             ga_node_derivation(tree, workspace, m, child2, varname,
-                               interpolatename, order);
+                               interpolatename, order, any_trans);
 
         } else GMM_ASSERT1(false, "internal error");
       } else if (child0->node_type == GA_NODE_PREDEF_FUNC) {
@@ -3722,7 +3726,7 @@ namespace getfem {
             pnode_op->children.resize(2, nullptr);
             tree.copy_node(child1, pnode_op, pnode_op->children[1]);
             ga_node_derivation(tree, workspace, m, pnode_op->children[1],
-                               varname, interpolatename, order);
+                               varname, interpolatename, order, any_trans);
           }
         } else {
           pga_tree_node child2 = pnode->children[2];
@@ -3760,7 +3764,7 @@ namespace getfem {
             pnode_op->children.resize(2, nullptr);
             tree.copy_node(child1, pnode_op, pnode_op->children[1]);
             ga_node_derivation(tree, workspace, m, pnode_op->children[1],
-                               varname, interpolatename, order);
+                               varname, interpolatename, order, any_trans);
           }
           if (child2->marked) {
             pnode = pg2;
@@ -3793,7 +3797,7 @@ namespace getfem {
             pnode_op->children.resize(2, nullptr);
             tree.copy_node(child2, pnode_op, pnode_op->children[1]);
             ga_node_derivation(tree, workspace, m, pnode_op->children[1],
-                               varname, interpolatename, order);
+                               varname, interpolatename, order, any_trans);
           }
         }
       } else if (child0->node_type == GA_NODE_SPEC_FUNC) {
@@ -3842,7 +3846,7 @@ namespace getfem {
             tree.copy_node(pnode->children[i], pnode_op,
                            pnode_op->children[1]);
             ga_node_derivation(tree, workspace, m, pnode_op->children[1],
-                               varname, interpolatename, order);
+                               varname, interpolatename, order, any_trans);
 
             if (pnode2->children[0]->name.compare("Norm_sqr") == 0
                 && pnode2->children[0]->der1 == 1) {
@@ -3858,7 +3862,7 @@ namespace getfem {
 
       } else {
         ga_node_derivation(tree, workspace, m, child0, varname,
-                           interpolatename, order);
+                           interpolatename, order, any_trans);
       }
       break;
 



reply via email to

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