[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] [getfem-commits] branch master updated: A attempt for making diff working with interpolate transformations,
Yves Renard <=