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.ren...@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;