[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] [getfem-commits] branch master updated: Split parent as
From: |
Konstantinos Poulios |
Subject: |
[Getfem-commits] [getfem-commits] branch master updated: Split parent assignment out of ga_tree::copy_node |
Date: |
Sun, 17 Sep 2023 03:34:39 -0400 |
This is an automated email from the git hooks/post-receive script.
logari81 pushed a commit to branch master
in repository getfem.
The following commit(s) were added to refs/heads/master by this push:
new 37870199 Split parent assignment out of ga_tree::copy_node
37870199 is described below
commit 378701998a665bc3491362c1702c7c2ea80c91d6
Author: Konstantinos Poulios <logari81@gmail.com>
AuthorDate: Sun Sep 17 09:34:24 2023 +0200
Split parent assignment out of ga_tree::copy_node
---
src/getfem/getfem_generic_assembly_tree.h | 12 ++-
src/getfem_generic_assembly_semantic.cc | 162 ++++++++++++++++--------------
src/getfem_generic_assembly_tree.cc | 39 ++++---
src/getfem_generic_assembly_workspace.cc | 3 +-
4 files changed, 122 insertions(+), 94 deletions(-)
diff --git a/src/getfem/getfem_generic_assembly_tree.h
b/src/getfem/getfem_generic_assembly_tree.h
index b3d2405b..711cddf2 100644
--- a/src/getfem/getfem_generic_assembly_tree.h
+++ b/src/getfem/getfem_generic_assembly_tree.h
@@ -401,6 +401,11 @@ namespace getfem {
inline void adopt_child(pga_tree_node new_child)
{ children.push_back(new_child); children.back()->parent = this; }
+ inline void accept_child(size_type i) {
+ GMM_ASSERT1(i < children.size(), "Internal error");
+ children[i]->parent = this;
+ }
+
inline void replace_child(pga_tree_node oldchild,
pga_tree_node newchild) {
bool found = false;
@@ -453,8 +458,7 @@ namespace getfem {
void clear() { clear_node_rec(root); root = current_node = nullptr; }
void clear_children(pga_tree_node pnode);
void replace_node_by_child(pga_tree_node pnode, size_type i);
- void copy_node(pga_tree_node pnode, pga_tree_node parent,
- pga_tree_node &child);
+ void copy_node(pga_tree_node pnode, pga_tree_node &pnode_new);
void duplicate_with_operation(pga_tree_node pnode, GA_TOKEN_TYPE op_type);
void duplicate_with_addition(pga_tree_node pnode)
{ duplicate_with_operation(pnode, GA_PLUS); }
@@ -475,14 +479,14 @@ namespace getfem {
secondary_domain(tree.secondary_domain)
{
if (tree.root)
- copy_node(tree.root, nullptr, root);
+ copy_node(tree.root, root);
}
ga_tree &operator =(const ga_tree &tree) {
clear();
secondary_domain = tree.secondary_domain;
if (tree.root)
- copy_node(tree.root, nullptr, root);
+ copy_node(tree.root, root);
return *this;
}
diff --git a/src/getfem_generic_assembly_semantic.cc
b/src/getfem_generic_assembly_semantic.cc
index 302f7688..134eec8c 100644
--- a/src/getfem_generic_assembly_semantic.cc
+++ b/src/getfem_generic_assembly_semantic.cc
@@ -199,7 +199,7 @@ namespace getfem {
bool need_hess = (pnode->node_type == GA_NODE_HESS_TEST);
if (need_grad && grad_expr.root == nullptr) {
- tree.copy_node(pexpr, nullptr, grad_expr.root);
+ tree.copy_node(pexpr, grad_expr.root);
if (ga_node_mark_tree_for_grad(grad_expr.root, workspace)) {
ga_node_grad(grad_expr, workspace, me, grad_expr.root);
ga_node_analysis(grad_expr, workspace, grad_expr.root, me,
@@ -215,7 +215,7 @@ namespace getfem {
}
if (need_hess && hess_expr.root == nullptr) {
- tree.copy_node(grad_expr.root, nullptr, hess_expr.root);
+ tree.copy_node(grad_expr.root, hess_expr.root);
if (ga_node_mark_tree_for_grad(hess_expr.root, workspace)) {
ga_node_grad(hess_expr, workspace, me, hess_expr.root);
ga_node_analysis(hess_expr, workspace, hess_expr.root, me,
@@ -237,18 +237,20 @@ namespace getfem {
{
pga_tree_node pnode_new = nullptr;
if (pnode->node_type == GA_NODE_VAL_TEST)
- tree.copy_node(pexpr, parent, pnode_new); // allocates
new
+ tree.copy_node(pexpr, pnode_new); // allocates new
else if (pnode->node_type == GA_NODE_GRAD_TEST ||
pnode->node_type == GA_NODE_DIVERG_TEST)
- tree.copy_node(grad_expr.root, parent, pnode_new); // allocates
new
+ tree.copy_node(grad_expr.root, pnode_new); // allocates new
else if (pnode->node_type == GA_NODE_HESS_TEST)
- tree.copy_node(hess_expr.root, parent, pnode_new); // allocates
new
+ tree.copy_node(hess_expr.root, pnode_new); // allocates new
+ pnode_new->parent = parent;
parent->replace_child(pnode, pnode_new);
if (pnode->node_type == GA_NODE_DIVERG_TEST) {
tree.insert_node(pnode_new, GA_NODE_OP);
pnode_new->parent->op_type = GA_TRACE;
}
- delete pnode; pnode = nullptr; // deallocates
old
+ delete pnode; // deallocates old
+ pnode = nullptr;
}
break;
case GA_NODE_INTERPOLATE_VAL_TEST: case GA_NODE_INTERPOLATE_GRAD_TEST:
@@ -598,15 +600,15 @@ namespace getfem {
break;
}
//[[fallthrough]];
- case GA_NODE_ELEMENTARY: // and ... case GA_NODE_INTERPOLATE:
+ case GA_NODE_ELEMENTARY: // +GA_NODE_SECONDARY_DOMAIN, GA_NODE_INTERPOLATE:
case GA_NODE_XFEM_PLUS:
case GA_NODE_XFEM_MINUS:
{
- int ndt = ((pnode->node_type == GA_NODE_INTERPOLATE) ? 1 : 0)
- + ((pnode->node_type == GA_NODE_ELEMENTARY) ? 2 : 0)
- + ((pnode->node_type == GA_NODE_SECONDARY_DOMAIN) ? 3 : 0)
- + ((pnode->node_type == GA_NODE_XFEM_PLUS) ? 4 : 0)
- + ((pnode->node_type == GA_NODE_XFEM_MINUS) ? 5 : 0);
+ int ndt = ((pnode->node_type == GA_NODE_INTERPOLATE) ? 1 : 0)
+ + ((pnode->node_type == GA_NODE_ELEMENTARY) ? 2 : 0)
+ + ((pnode->node_type == GA_NODE_SECONDARY_DOMAIN) ? 3 : 0)
+ + ((pnode->node_type == GA_NODE_XFEM_PLUS) ? 4 : 0)
+ + ((pnode->node_type == GA_NODE_XFEM_MINUS) ? 5 : 0);
std::string op__name =
(pnode->node_type == GA_NODE_INTERPOLATE) ? "Interpolation" : ""
+ (pnode->node_type == GA_NODE_ELEMENTARY) ?
@@ -2725,14 +2727,16 @@ namespace getfem {
}
ga_valid_operand(tree.root);
// cout << "End of semantic analysis";
- // if (tree.root) ga_print_node(tree.root, cout); cout << endl;
+ // if (tree.root)
+ // ga_print_node(tree.root, cout);
+ // cout << endl;
}
void ga_extract_factor(ga_tree &result_tree, pga_tree_node pnode,
pga_tree_node &new_pnode) {
result_tree.clear();
- result_tree.copy_node(pnode, 0, result_tree.root);
+ result_tree.copy_node(pnode, result_tree.root);
new_pnode = result_tree.root;
bool minus_sign = false;
@@ -2774,13 +2778,13 @@ namespace getfem {
result_tree.root->expr = pnode->expr;
result_tree.root->children.resize(2, nullptr);
if (child0 == pnode_child) {
- result_tree.copy_node(child1, result_tree.root,
- result_tree.root->children[1]);
+ result_tree.copy_node(child1, result_tree.root->children[1]);
+ result_tree.root->accept_child(1);
} else if (child1 == pnode_child) {
std::swap(result_tree.root->children[1],
result_tree.root->children[0]);
- result_tree.copy_node(child0, result_tree.root,
- result_tree.root->children[0]);
+ result_tree.copy_node(child0, result_tree.root->children[0]);
+ result_tree.root->accept_child(0);
} else GMM_ASSERT1(false, "Corrupted tree");
break;
default: GMM_ASSERT1(false, "Unexpected operation. Internal error.");
@@ -2799,9 +2803,11 @@ namespace getfem {
std::swap(result_tree.root->children[1],
result_tree.root->children[0]);
for (size_type i = 0; i < pnode->children.size(); ++i)
- if (i != 1)
- result_tree.copy_node(pnode->children[i], result_tree.root,
+ if (i != 1) {
+ result_tree.copy_node(pnode->children[i],
result_tree.root->children[i]);
+ result_tree.root->accept_child(i);
+ }
} else if (child0->node_type == GA_NODE_CROSS_PRODUCT) {
pga_tree_node child2 = pnode->children[2];
result_tree.insert_node(result_tree.root, pnode->node_type);
@@ -2811,17 +2817,21 @@ namespace getfem {
if (child1 == pnode_child) {
std::swap(result_tree.root->children[1],
result_tree.root->children[0]);
- result_tree.copy_node(pnode->children[0], result_tree.root,
- result_tree.root->children[0]);
- result_tree.copy_node(pnode->children[2], result_tree.root,
+ result_tree.copy_node(pnode->children[0],
+ result_tree.root->children[0]);
+ result_tree.root->accept_child(0);
+ result_tree.copy_node(pnode->children[2],
result_tree.root->children[2]);
+ result_tree.root->accept_child(2);
} else if (child2 == pnode_child) {
std::swap(result_tree.root->children[2],
result_tree.root->children[0]);
- result_tree.copy_node(pnode->children[0], result_tree.root,
- result_tree.root->children[0]);
- result_tree.copy_node(pnode->children[1], result_tree.root,
+ result_tree.copy_node(pnode->children[0],
+ result_tree.root->children[0]);
+ result_tree.root->accept_child(0);
+ result_tree.copy_node(pnode->children[1],
result_tree.root->children[1]);
+ result_tree.root->accept_child(1);
} else GMM_ASSERT1(false, "Corrupted tree");
} else if (child0->node_type == GA_NODE_SWAP_IND) {
GMM_ASSERT1(child1 == pnode_child, "Cannot extract a factor of a "
@@ -2836,9 +2846,11 @@ namespace getfem {
std::swap(result_tree.root->children[i],
result_tree.root->children[0]);
for (size_type i = 0; i < pnode->children.size(); ++i)
- if (pnode->children[i] != pnode_child)
- result_tree.copy_node(pnode->children[i], result_tree.root,
+ if (pnode->children[i] != pnode_child) {
+ result_tree.copy_node(pnode->children[i],
result_tree.root->children[i]);
+ result_tree.root->accept_child(i);
+ }
} else if (child0->node_type == GA_NODE_IND_MOVE_LAST) {
GMM_ASSERT1(child1 == pnode_child, "Cannot extract a factor of a "
"Index_move_last size parameter");
@@ -2852,9 +2864,11 @@ namespace getfem {
std::swap(result_tree.root->children[i],
result_tree.root->children[0]);
for (size_type i = 0; i < pnode->children.size(); ++i)
- if (pnode->children[i] != pnode_child)
- result_tree.copy_node(pnode->children[i], result_tree.root,
+ if (pnode->children[i] != pnode_child) {
+ result_tree.copy_node(pnode->children[i],
result_tree.root->children[i]);
+ result_tree.root->accept_child(i);
+ }
} else if (child0->node_type == GA_NODE_CONTRACT) {
// Copy of the term and other children
result_tree.insert_node(result_tree.root, pnode->node_type);
@@ -2866,9 +2880,11 @@ namespace getfem {
std::swap(result_tree.root->children[i],
result_tree.root->children[0]);
for (size_type i = 0; i < pnode->children.size(); ++i)
- if (pnode->children[i] != pnode_child)
- result_tree.copy_node(pnode->children[i], result_tree.root,
+ if (pnode->children[i] != pnode_child) {
+ result_tree.copy_node(pnode->children[i],
result_tree.root->children[i]);
+ result_tree.root->accept_child(i);
+ }
} else
GMM_ASSERT1(false, "Cannot extract a factor which is a parameter "
"of a nonlinear operator/function");
@@ -2890,7 +2906,7 @@ namespace getfem {
pnode->children[i]
= new ga_tree_node(GA_NODE_ZERO, pnode->pos, pnode->expr);
pnode->children[i]->init_scalar_tensor(scalar_type(0));
- pnode->children[i]->parent = pnode;
+ pnode->accept_child(i);
}
}
break;
@@ -3198,14 +3214,14 @@ namespace getfem {
if (j == i) {
pga_tree_node param_node = new_pnode->children[k*N+j]
= new ga_tree_node(GA_NODE_PARAMS, pnode->pos, pnode->expr);
- new_pnode->children[k+j*meshdim]->parent = new_pnode;
+ new_pnode->accept_child(k+j*meshdim);
param_node->children.resize(2);
param_node->children[0]
= new ga_tree_node(GA_NODE_NORMAL, pnode->pos, pnode->expr);
- param_node->children[0]->parent = param_node;
+ param_node->accept_child(0);
param_node->children[1]
= new ga_tree_node(GA_NODE_CONSTANT, pnode->pos, pnode->expr);
- param_node->children[1]->parent = param_node;
+ param_node->accept_child(1);
param_node->children[1]->init_scalar_tensor(scalar_type(k));
} else {
@@ -3213,7 +3229,7 @@ namespace getfem {
= new ga_tree_node(GA_NODE_ZERO, pnode->pos, pnode->expr);
new_pnode->children[k+j*meshdim]
->init_scalar_tensor(scalar_type(0));
- new_pnode->children[k+j*meshdim]->parent = new_pnode;
+ new_pnode->accept_child(k+j*meshdim);
}
}
}
@@ -3642,8 +3658,8 @@ namespace getfem {
else
pnode_mult->op_type = GA_MULT;
pnode_mult->children.resize(2, nullptr);
- tree.copy_node(pnode_param->children[1],
- pnode_mult, pnode_mult->children[1]);
+ tree.copy_node(pnode_param->children[1], pnode_mult->children[1]);
+ pnode_mult->accept_child(1);
ga_node_derivation(tree, workspace, m, pnode_mult->children[1],
varname, interpolatename, order, any_trans);
} else {
@@ -3774,7 +3790,8 @@ namespace getfem {
else
pnode_op->op_type = GA_DOTMULT;
pnode_op->children.resize(2, nullptr);
- tree.copy_node(child1, pnode_op, pnode_op->children[1]);
+ tree.copy_node(child1, pnode_op->children[1]);
+ pnode_op->accept_child(1);
ga_node_derivation(tree, workspace, m, pnode_op->children[1],
varname, interpolatename, order, any_trans);
}
@@ -3813,7 +3830,8 @@ namespace getfem {
else
pnode_op->op_type = GA_DOTMULT;
pnode_op->children.resize(2, nullptr);
- tree.copy_node(child1, pnode_op, pnode_op->children[1]);
+ tree.copy_node(child1, pnode_op->children[1]);
+ pnode_op->accept_child(1);
ga_node_derivation(tree, workspace, m, pnode_op->children[1],
varname, interpolatename, order, any_trans);
}
@@ -3847,7 +3865,8 @@ namespace getfem {
else
pnode_op->op_type = GA_DOTMULT;
pnode_op->children.resize(2, nullptr);
- tree.copy_node(child2, pnode_op, pnode_op->children[1]);
+ tree.copy_node(child2, pnode_op->children[1]);
+ pnode_op->accept_child(1);
ga_node_derivation(tree, workspace, m, pnode_op->children[1],
varname, interpolatename, order, any_trans);
}
@@ -3874,7 +3893,8 @@ namespace getfem {
pnode_op->node_type = GA_NODE_OP;
pnode_op->op_type = GA_PLUS;
pnode_op->children.resize(2, nullptr);
- tree.copy_node(pnode, pnode_op , pnode_op->children[1]);
+ tree.copy_node(pnode, pnode_op->children[1]);
+ pnode_op->accept_child(1);
pnode2 = pnode_op->children[1];
}
else pnode2 = pnode;
@@ -3895,8 +3915,8 @@ namespace getfem {
"string. Bad reduction order.")
}
pnode_op->children.resize(2, nullptr);
- tree.copy_node(pnode->children[i], pnode_op,
- pnode_op->children[1]);
+ tree.copy_node(pnode->children[i], pnode_op->children[1]);
+ pnode_op->accept_child(1);
ga_node_derivation(tree, workspace, m, pnode_op->children[1],
varname, interpolatename, order, any_trans);
@@ -4155,8 +4175,8 @@ namespace getfem {
tree.clear_node_rec(pnode->parent->children[1]);
pnode->parent->children[1] = nullptr;
- tree.copy_node(trans_tree.root, pnode->parent,
- pnode->parent->children[1]);
+ tree.copy_node(trans_tree.root, pnode->parent->children[1]);
+ pnode->parent->accept_child(1);
} else {
pnode->node_type = GA_NODE_ZERO;
mi = pnode->tensor().sizes();
@@ -4362,25 +4382,15 @@ namespace getfem {
}
break;
- case GA_SYM: // Replace Sym(T) by (T+T')*0.5
- tree.replace_node_by_child(pnode, 0);
- tree.duplicate_with_addition(child0);
- tree.insert_node(child0->parent, GA_NODE_OP);
- tree.add_child(child0->parent->parent);
- child0->parent->parent->op_type = GA_MULT;
- child0->parent->parent->children[1]->node_type = GA_NODE_CONSTANT;
- child0->parent->parent->children[1]->init_scalar_tensor(0.5);
- tree.insert_node(child0->parent->children[1], GA_NODE_OP);
- child0->parent->children[1]->op_type = GA_QUOTE;
- ga_node_grad(tree, workspace, m, child0);
- ga_node_grad(tree, workspace, m,
- child0->parent->children[1]->children[0]);
- break;
-
-
+ case GA_SYM: // Replace Sym(T) by (T+T')*0.5
case GA_SKEW: // Replace Skew(T) by (T-T')*0.5
- tree.replace_node_by_child(pnode, 0);
- tree.duplicate_with_substraction(child0);
+ if (pnode->op_type == GA_SYM) {
+ tree.replace_node_by_child(pnode, 0); // cannot be before the if
+ tree.duplicate_with_addition(child0);
+ } else { // if (pnode->node_type == GA_SKEW)
+ tree.replace_node_by_child(pnode, 0); // cannot be before the if
+ tree.duplicate_with_substraction(child0);
+ }
tree.insert_node(child0->parent, GA_NODE_OP);
tree.add_child(child0->parent->parent);
child0->parent->parent->op_type = GA_MULT;
@@ -4620,7 +4630,8 @@ namespace getfem {
}
pnode_mult->children.resize(2, nullptr);
tree.copy_node(pnode_param->children[1],
- pnode_mult, pnode_mult->children[1]);
+ pnode_mult->children[1]);
+ pnode_mult->accept_child(1);
ga_node_grad(tree, workspace, m, pnode_mult->children[1]);
}
@@ -4662,8 +4673,9 @@ namespace getfem {
pnode->children.resize(orgsize*m.dim(), nullptr);
for (size_type i = orgsize; i < pnode->children.size(); ++i) {
- tree.copy_node(pnode->children[i % orgsize], pnode,
+ tree.copy_node(pnode->children[i % orgsize],
pnode->children[i]);
+ pnode->accept_child(i);
}
for (size_type i = 0; i < pnode->children.size(); ++i) {
pga_tree_node child = pnode->children[i];
@@ -4799,7 +4811,8 @@ namespace getfem {
scalar_type(1));
}
pnode_op->children.resize(2, nullptr);
- tree.copy_node(child1, pnode_op, pnode_op->children[1]);
+ tree.copy_node(child1, pnode_op->children[1]);
+ pnode_op->accept_child(1);
ga_node_grad(tree, workspace, m, pnode_op->children[1]);
}
} else {
@@ -4844,7 +4857,8 @@ namespace getfem {
scalar_type(1));
}
pnode_op->children.resize(2, nullptr);
- tree.copy_node(child1, pnode_op, pnode_op->children[1]);
+ tree.copy_node(child1, pnode_op->children[1]);
+ pnode_op->accept_child(1);
ga_node_grad(tree, workspace, m, pnode_op->children[1]);
}
if (child2->marked) {
@@ -4884,7 +4898,8 @@ namespace getfem {
scalar_type(1));
}
pnode_op->children.resize(2, nullptr);
- tree.copy_node(child2, pnode_op, pnode_op->children[1]);
+ tree.copy_node(child2, pnode_op->children[1]);
+ pnode_op->accept_child(1);
ga_node_grad(tree, workspace, m, pnode_op->children[1]);
}
}
@@ -4910,7 +4925,8 @@ namespace getfem {
pnode_op->node_type = GA_NODE_OP;
pnode_op->op_type = GA_PLUS;
pnode_op->children.resize(2, nullptr);
- tree.copy_node(pnode, pnode_op , pnode_op->children[1]);
+ tree.copy_node(pnode, pnode_op->children[1]);
+ pnode_op->accept_child(1);
pnode2 = pnode_op->children[1];
}
else pnode2 = pnode;
@@ -4931,8 +4947,8 @@ namespace getfem {
"string. Bad reduction order.")
}
pnode_op->children.resize(2, nullptr);
- tree.copy_node(pnode->children[i], pnode_op,
- pnode_op->children[1]);
+ tree.copy_node(pnode->children[i], pnode_op->children[1]);
+ pnode_op->accept_child(1);
ga_node_grad(tree, workspace, m, pnode_op->children[1]);
if (pnode2->children[0]->name.compare("Norm_sqr") == 0
diff --git a/src/getfem_generic_assembly_tree.cc
b/src/getfem_generic_assembly_tree.cc
index ee75f4d0..9ba538ea 100644
--- a/src/getfem_generic_assembly_tree.cc
+++ b/src/getfem_generic_assembly_tree.cc
@@ -432,16 +432,19 @@ namespace getfem {
delete pnode;
}
- void ga_tree::copy_node(pga_tree_node pnode, pga_tree_node parent,
- pga_tree_node &child) {
- GMM_ASSERT1(child == nullptr, "Internal error");
- child = new ga_tree_node();
- *child = *pnode;
- child->parent = parent;
- for (pga_tree_node &grandchild : child->children)
- grandchild = nullptr;
- for (size_type j = 0; j < child->children.size(); ++j)
- copy_node(pnode->children[j], child, child->children[j]);
+ // This function allocates a new node "pnode_new", copies the content of
"pnode"
+ // into the newly allocated node (including deep copies of all of its
children)
+ void ga_tree::copy_node(pga_tree_node pnode,
+ pga_tree_node &pnode_new) {
+ GMM_ASSERT1(pnode_new == nullptr, "Internal error");
+ pnode_new = new ga_tree_node();
+ *pnode_new = *pnode;
+ pnode_new->parent = nullptr;
+ for (size_type j = 0; j < pnode_new->children.size(); ++j) {
+ pnode_new->children[j] = nullptr;
+ copy_node(pnode->children[j], pnode_new->children[j]);
+ pnode_new->accept_child(j);
+ }
}
void ga_tree::duplicate_with_operation(pga_tree_node pnode,
@@ -456,7 +459,8 @@ namespace getfem {
else
root = newop;
pnode->parent = newop;
- copy_node(pnode, newop, newop->children[1]);
+ copy_node(pnode, newop->children[1]);
+ newop->accept_child(1);
}
void ga_tree::add_child(pga_tree_node pnode, GA_NODE_TYPE node_type) {
@@ -1390,7 +1394,8 @@ namespace getfem {
} else {
pga_tree_node pnode_old = pnode;
pnode = nullptr;
- tree.copy_node(pchild, pnode_old->parent, pnode);
+ tree.copy_node(pchild, pnode);
+ pnode->parent = pnode_old->parent;
if (pnode_old->parent)
pnode_old->parent->replace_child(pnode_old, pnode);
else
@@ -1421,8 +1426,8 @@ namespace getfem {
if (gam.nb_params()==0) { // Macro without parameters
pga_tree_node pnode_old = pnode->children[0];
pnode->children[0] = nullptr;
- tree.copy_node(gam.tree().root,
- pnode_old->parent,pnode->children[0]);
+ tree.copy_node(gam.tree().root, pnode->children[0]);
+ pnode->children[0]->parent = pnode_old->parent;
GMM_ASSERT1(pnode_old->children.empty(), "Internal error");
delete pnode_old;
} else { // Macro with parameters
@@ -1434,7 +1439,8 @@ namespace getfem {
pga_tree_node pnode_old = pnode;
pnode = nullptr;
- tree.copy_node(gam.tree().root, pnode_old->parent, pnode);
+ tree.copy_node(gam.tree().root, pnode);
+ pnode->parent = pnode_old->parent;
if (pnode_old->parent)
pnode_old->parent->replace_child(pnode_old, pnode);
else
@@ -1457,7 +1463,8 @@ namespace getfem {
pga_tree_node pnode_old = pnode;
pnode = nullptr;
- tree.copy_node(gam.tree().root, pnode_old->parent, pnode);
+ tree.copy_node(gam.tree().root, pnode);
+ pnode->parent = pnode_old->parent;
if (pnode_old->parent)
pnode_old->parent->replace_child(pnode_old, pnode);
else
diff --git a/src/getfem_generic_assembly_workspace.cc
b/src/getfem_generic_assembly_workspace.cc
index f9c8d233..fd3d6c75 100644
--- a/src/getfem_generic_assembly_workspace.cc
+++ b/src/getfem_generic_assembly_workspace.cc
@@ -490,7 +490,8 @@ namespace getfem {
ftree.insert_node(ftree.root, GA_NODE_OP);
ftree.root->op_type = GA_PLUS;
ftree.root->children.resize(2, nullptr);
- ftree.copy_node(tree.root, ftree.root, ftree.root->children[1]);
+ ftree.copy_node(tree.root, ftree.root->children[1]);
+ ftree.root->children[1]->parent = ftree.root;
ga_semantic_analysis(ftree, *this, m,
ref_elt_dim_of_mesh(m,rg), false,
function_expr);
found = true;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] [getfem-commits] branch master updated: Split parent assignment out of ga_tree::copy_node,
Konstantinos Poulios <=