[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: |
Wed, 2 May 2018 14:30:23 -0400 (EDT) |
branch: devel-yves-generic-assembly-modifs
commit 039ca29a53cf7ebcb4d04c2d416b04510351cc20
Author: Yves Renard <address@hidden>
Date: Wed May 2 20:29:31 2018 +0200
Grad operator, work in progress
---
src/getfem/getfem_generic_assembly.h | 1 +
src/getfem_generic_assembly_interpolation.cc | 11 +-
src/getfem_generic_assembly_semantic.cc | 188 ++++++++++++++-------------
3 files changed, 108 insertions(+), 92 deletions(-)
diff --git a/src/getfem/getfem_generic_assembly.h
b/src/getfem/getfem_generic_assembly.h
index 991bd58..6bde7da 100644
--- a/src/getfem/getfem_generic_assembly.h
+++ b/src/getfem/getfem_generic_assembly.h
@@ -108,6 +108,7 @@ namespace getfem {
std::map<var_trans_pair, base_tensor> &derivatives,
bool compute_derivatives) const = 0;
virtual void finalize() const = 0;
+ virtual std::string expression(void) const { return std::string(); }
virtual ~virtual_interpolate_transformation() {}
};
diff --git a/src/getfem_generic_assembly_interpolation.cc
b/src/getfem_generic_assembly_interpolation.cc
index 1006f56..4a088a9 100644
--- a/src/getfem_generic_assembly_interpolation.cc
+++ b/src/getfem_generic_assembly_interpolation.cc
@@ -620,6 +620,7 @@ namespace getfem {
local_gis = ga_instruction_set();
}
+ std::string expression(void) const { return expr; }
int transform(const ga_workspace &/*workspace*/, const mesh &m,
fem_interpolation_context &ctx_x,
@@ -748,6 +749,8 @@ namespace getfem {
const std::string &/* interpolate_name */) const {}
void init(const ga_workspace &/* workspace */) const {}
void finalize() const {}
+
+ std::string expression(void) const { return "Id(meshdim)"; }
int transform(const ga_workspace &/*workspace*/, const mesh &m_x,
fem_interpolation_context &ctx_x,
@@ -789,11 +792,8 @@ namespace getfem {
};
- pinterpolate_transformation interpolate_transformation_neighbour_instance()
- {
- pinterpolate_transformation
- p = std::make_shared<interpolate_transformation_neighbour>();
- return p;
+ pinterpolate_transformation interpolate_transformation_neighbour_instance() {
+ return (std::make_shared<interpolate_transformation_neighbour>());
}
//=========================================================================
@@ -814,6 +814,7 @@ namespace getfem {
const std::string &/* interpolate_name */) const {}
void init(const ga_workspace &/* workspace */) const {}
void finalize() const {}
+ std::string expression(void) const { return "Id(meshdim)"; }
int transform(const ga_workspace &/*workspace*/, const mesh &m_x,
fem_interpolation_context &ctx_x,
diff --git a/src/getfem_generic_assembly_semantic.cc
b/src/getfem_generic_assembly_semantic.cc
index 610c685..d5a0731 100644
--- a/src/getfem_generic_assembly_semantic.cc
+++ b/src/getfem_generic_assembly_semantic.cc
@@ -3205,100 +3205,117 @@ namespace getfem {
child1->node_type = GA_NODE_CONSTANT;
break;
- #ifdef continue_here
+ case GA_NODE_INTERPOLATE_HESS_TEST:
+ case GA_NODE_INTERPOLATE_HESS:
+ GMM_ASSERT1(false, "Sorry, cannot derive a hessian once more");
+ break;
+
case GA_NODE_INTERPOLATE_VAL:
case GA_NODE_INTERPOLATE_GRAD:
- case GA_NODE_INTERPOLATE_HESS:
case GA_NODE_INTERPOLATE_DIVERG:
{
bool is_val(pnode->node_type == GA_NODE_INTERPOLATE_VAL);
bool is_grad(pnode->node_type == GA_NODE_INTERPOLATE_GRAD);
- bool is_hess(pnode->node_type == GA_NODE_INTERPOLATE_HESS);
bool is_diverg(pnode->node_type == GA_NODE_INTERPOLATE_DIVERG);
-
- bool ivar = (pnode->name.compare(varname) == 0 &&
- pnode->interpolate_name.compare(interpolatename) == 0);
- bool itrans = !ivar;
- if (!itrans) {
- std::set<var_trans_pair> vars;
- workspace.interpolate_transformation(pnode->interpolate_name)
- ->extract_variables(workspace, vars, true, m,
- pnode->interpolate_name);
- for (const var_trans_pair &var : vars) {
- if (var.varname.compare(varname) == 0 &&
- var.transname.compare(interpolatename) == 0)
- itrans = true;
- }
- }
-
- pga_tree_node pnode_trans = pnode;
- if (is_hess) {
- GMM_ASSERT1(!itrans, "Sorry, cannot derive a hessian once more");
- } else if (itrans && ivar) {
- tree.duplicate_with_addition(pnode);
- pnode_trans = pnode->parent->children[1];
- }
-
- if (ivar) {
- 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);
- if (is_val) // --> t(Qmult*ndof,Qmult*target_dim)
- pnode->node_type = GA_NODE_INTERPOLATE_VAL_TEST;
- else if (is_grad) // --> t(Qmult*ndof,Qmult*target_dim,N)
- pnode->node_type = GA_NODE_INTERPOLATE_GRAD_TEST;
- else if (is_hess) // --> t(Qmult*ndof,Qmult*target_dim,N,N)
- pnode->node_type = GA_NODE_INTERPOLATE_HESS_TEST;
- else if (is_diverg) // --> t(Qmult*ndof)
- pnode->node_type = GA_NODE_INTERPOLATE_DIVERG_TEST;
- pnode->test_function_type = order;
- }
-
- if (itrans) {
- const mesh_fem *mf = workspace.associated_mf(pnode_trans->name);
- size_type q = workspace.qdim(pnode_trans->name);
- size_type n = mf->linked_mesh().dim();
- bgeot::multi_index mii = workspace.qdims(pnode_trans->name);
-
- if (is_val) // --> t(target_dim*Qmult,N)
- pnode_trans->node_type = GA_NODE_INTERPOLATE_GRAD;
- else if (is_grad || is_diverg) // --> t(target_dim*Qmult,N,N)
- pnode_trans->node_type = GA_NODE_INTERPOLATE_HESS;
-
- if (n > 1) {
- if (q == 1 && mii.size() <= 1) { mii.resize(1); mii[0] = n; }
- else mii.push_back(n);
-
- if (is_grad || is_diverg) mii.push_back(n);
- }
- pnode_trans->t.adjust_sizes(mii);
- tree.duplicate_with_operation(pnode_trans,
- (n > 1) ? GA_DOT : GA_MULT);
- pga_tree_node pnode_der = pnode_trans->parent->children[1];
- pnode_der->node_type = GA_NODE_INTERPOLATE_DERIVATIVE;
- if (n == 1)
- pnode_der->init_vector_tensor(2);
- else
- pnode_der->init_matrix_tensor(2, n);
- pnode_der->test_function_type = order;
- pnode_der->name = varname;
- pnode_der->interpolate_name_der = pnode_der->interpolate_name;
- pnode_der->interpolate_name = interpolatename;
-
- if (is_diverg) { // --> t(Qmult*ndof)
- tree.insert_node(pnode_trans->parent, GA_NODE_OP);
- pga_tree_node pnode_tr = pnode_trans->parent->parent;
- pnode_tr->op_type = GA_TRACE;
- pnode_tr->init_vector_tensor(2);
-// pnode_tr->test_function_type = order;
-// pnode_tr->name_test1 = pnode_trans->name_test1;
-// pnode_tr->name_test2 = pnode_trans->name_test2;
- }
- }
+
+ std::string &tname = pnode->interpolate_name;
+ std::string expr_trans =
+ workspace.interpolate_transformation(tname)->expression();
+ if (expr_trans.size() == 0)
+ GMM_ASSERT1(false, "Sorry, the gradient of tranformation "
+ << tname << " cannot be calculated. "
+ "The gradient computation is available only for "
+ "transformations having an explicit expression");
+
+
+ // bool ivar = (pnode->name.compare(varname) == 0 &&
+ // pnode->interpolate_name.compare(interpolatename) == 0);
+ // bool itrans = !ivar;
+ // if (!itrans) {
+ // std::set<var_trans_pair> vars;
+ // workspace.interpolate_transformation(pnode->interpolate_name)
+ // ->extract_variables(workspace, vars, true, m,
+ // pnode->interpolate_name);
+ // for (const var_trans_pair &var : vars) {
+ // if (var.varname.compare(varname) == 0 &&
+ // var.transname.compare(interpolatename) == 0)
+ // itrans = true;
+ // }
+ // }
+
+ pga_tree_node pnode_trans = pnode;
+ tree.duplicate_with_operation(pnode_trans, GA_MULT);
+ pga_tree_node pnode_grad_trans = pnode_trans->parent->children[1];
+
+ if (is_val) pnode_trans->node_type = GA_NODE_INTERPOLATE_GRAD;
+ if (is_grad) pnode_trans->node_type = GA_NODE_INTERPOLATE_HESS;
+ // if (is_diverg) ??;
+
+ // Pour le Hessien, il s'agit vraiment d'une multiplication ? ou d'un
"." ?
+
+ // Calcul et insertion du gradient de la transformation
+
+// if (ivar) {
+// 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);
+// if (is_val) // --> t(Qmult*ndof,Qmult*target_dim)
+// pnode->node_type = GA_NODE_INTERPOLATE_VAL_TEST;
+// else if (is_grad) // --> t(Qmult*ndof,Qmult*target_dim,N)
+// pnode->node_type = GA_NODE_INTERPOLATE_GRAD_TEST;
+// else if (is_hess) // --> t(Qmult*ndof,Qmult*target_dim,N,N)
+// pnode->node_type = GA_NODE_INTERPOLATE_HESS_TEST;
+// else if (is_diverg) // --> t(Qmult*ndof)
+// pnode->node_type = GA_NODE_INTERPOLATE_DIVERG_TEST;
+// pnode->test_function_type = order;
+// }
+
+// if (itrans) {
+// const mesh_fem *mf = workspace.associated_mf(pnode_trans->name);
+// size_type q = workspace.qdim(pnode_trans->name);
+// size_type n = mf->linked_mesh().dim();
+// bgeot::multi_index mii = workspace.qdims(pnode_trans->name);
+
+// if (is_val) // --> t(target_dim*Qmult,N)
+// pnode_trans->node_type = GA_NODE_INTERPOLATE_GRAD;
+// else if (is_grad || is_diverg) // --> t(target_dim*Qmult,N,N)
+// pnode_trans->node_type = GA_NODE_INTERPOLATE_HESS;
+
+// if (n > 1) {
+// if (q == 1 && mii.size() <= 1) { mii.resize(1); mii[0] = n; }
+// else mii.push_back(n);
+
+// if (is_grad || is_diverg) mii.push_back(n);
+// }
+// pnode_trans->t.adjust_sizes(mii);
+// tree.duplicate_with_operation(pnode_trans,
+// (n > 1) ? GA_DOT : GA_MULT);
+// pga_tree_node pnode_der = pnode_trans->parent->children[1];
+// pnode_der->node_type = GA_NODE_INTERPOLATE_DERIVATIVE;
+// if (n == 1)
+// pnode_der->init_vector_tensor(2);
+// else
+// pnode_der->init_matrix_tensor(2, n);
+// pnode_der->test_function_type = order;
+// pnode_der->name = varname;
+// pnode_der->interpolate_name_der = pnode_der->interpolate_name;
+// pnode_der->interpolate_name = interpolatename;
+
+// if (is_diverg) { // --> t(Qmult*ndof)
+// tree.insert_node(pnode_trans->parent, GA_NODE_OP);
+// pga_tree_node pnode_tr = pnode_trans->parent->parent;
+// pnode_tr->op_type = GA_TRACE;
+// pnode_tr->init_vector_tensor(2);
+// // pnode_tr->test_function_type = order;
+// // pnode_tr->name_test1 = pnode_trans->name_test1;
+// // pnode_tr->name_test2 = pnode_trans->name_test2;
+// }
+// }
}
break;
+ #ifdef continue_here
case GA_NODE_INTERPOLATE_VAL_TEST:
case GA_NODE_INTERPOLATE_GRAD_TEST:
@@ -3352,9 +3369,6 @@ namespace getfem {
}
break;
- case GA_NODE_INTERPOLATE_HESS_TEST:
- GMM_ASSERT1(false, "Sorry, cannot derive a hessian once more");
- break;
case GA_NODE_INTERPOLATE_X:
{