[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] r4915 - in /trunk/getfem/src: getfem/getfem_linearized_
From: |
Yves . Renard |
Subject: |
[Getfem-commits] r4915 - in /trunk/getfem/src: getfem/getfem_linearized_plates.h getfem_generic_assembly.cc getfem_linearized_plates.cc |
Date: |
Fri, 27 Mar 2015 13:25:38 -0000 |
Author: renard
Date: Fri Mar 27 14:25:38 2015
New Revision: 4915
URL: http://svn.gna.org/viewcvs/getfem?rev=4915&view=rev
Log:
Avoiding multiple computation of the elementary transformation
Modified:
trunk/getfem/src/getfem/getfem_linearized_plates.h
trunk/getfem/src/getfem_generic_assembly.cc
trunk/getfem/src/getfem_linearized_plates.cc
Modified: trunk/getfem/src/getfem/getfem_linearized_plates.h
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_linearized_plates.h?rev=4915&r1=4914&r2=4915&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_linearized_plates.h (original)
+++ trunk/getfem/src/getfem/getfem_linearized_plates.h Fri Mar 27 14:25:38 2015
@@ -51,7 +51,7 @@
/** Add a term corresponding to the classical Reissner-Mindlin plate
- model for which `U` is the transverse displacement,
+ model for which `u3` is the transverse displacement,
`Theta` the rotation of
fibers normal to the midplane, 'param_E' the Young Modulus,
`param_nu` the poisson ratio,
@@ -76,16 +76,11 @@
*/
size_type add_Mindlin_Reissner_plate_brick
(model &md, const mesh_im &mim, const mesh_im &mim_reduced,
- const std::string &U,
+ const std::string &u3,
const std::string &Theta, const std::string ¶m_E,
const std::string ¶m_nu, const std::string ¶m_epsilon,
const std::string ¶m_kappa, size_type variant = size_type(2),
size_type region = size_type(-1));
-
-
-
-
-
/* ******************************************************************** */
Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=4915&r1=4914&r2=4915&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Fri Mar 27 14:25:38 2015
@@ -1560,6 +1560,12 @@
std::map<var_trans_pair, base_tensor> derivatives;
};
+ struct elementary_trans_info {
+ base_matrix M;
+ const mesh_fem *mf;
+ size_type icv;
+ };
+
std::set<std::string> transformations;
struct region_mim_instructions {
@@ -1579,6 +1585,7 @@
std::map<std::string, std::set<std::string> > transformations;
std::set<std::string> transformations_der;
std::map<std::string, interpolate_info> interpolate_infos;
+ std::map<std::string, elementary_trans_info> elementary_trans_infos;
ga_instruction_list instructions;
std::map<scalar_type, std::list<pga_tree_node> > node_list;
@@ -2678,23 +2685,30 @@
struct ga_instruction_elementary_transformation {
const base_vector &coeff_in;
base_vector coeff_out;
- base_matrix M;
pelementary_transformation elemtrans;
const mesh_fem &mf;
fem_interpolation_context &ctx;
+ base_matrix &M;
+ const mesh_fem **mf_M;
+ size_type &icv;
void do_transformation(void) {
size_type nn = gmm::vect_size(coeff_in);
+ if (M.size() == 0 || icv != ctx.convex_num() || &mf != *mf_M) {
+ gmm::resize(M, nn, nn);
+ *mf_M = &mf; icv = ctx.convex_num();
+ elemtrans->give_transformation(mf, icv, M);
+ }
coeff_out.resize(nn);
- gmm::resize(M, nn, nn);
- elemtrans->give_transformation(mf, ctx.convex_num(), M);
gmm::mult(M, coeff_in, coeff_out); // remember: coeff == coeff_out
}
ga_instruction_elementary_transformation
(const base_vector &co, pelementary_transformation e,
- const mesh_fem &mf_, fem_interpolation_context &ctx_)
- : coeff_in(co), elemtrans(e), mf(mf_), ctx(ctx_) {}
+ const mesh_fem &mf_, fem_interpolation_context &ctx_, base_matrix &M_,
+ const mesh_fem **mf_M_, size_type &icv_)
+ : coeff_in(co), elemtrans(e), mf(mf_), ctx(ctx_),
+ M(M_), mf_M(mf_M_), icv(icv_) {}
~ga_instruction_elementary_transformation() {};
};
@@ -2711,9 +2725,11 @@
ga_instruction_elementary_transformation_val
(base_tensor &tt, base_tensor &Z_, const base_vector &co, size_type q,
pelementary_transformation e, const mesh_fem &mf_,
- fem_interpolation_context &ctx_)
+ fem_interpolation_context &ctx_, base_matrix &M_,
+ const mesh_fem **mf_M_, size_type &icv_)
: ga_instruction_val(tt, Z_, coeff_out, q),
- ga_instruction_elementary_transformation(co, e, mf_, ctx_) {}
+ ga_instruction_elementary_transformation(co, e, mf_, ctx_, M_,
+ mf_M_, icv_) {}
};
struct ga_instruction_elementary_transformation_grad
@@ -2728,9 +2744,11 @@
ga_instruction_elementary_transformation_grad
(base_tensor &tt, base_tensor &Z_, const base_vector &co, size_type q,
pelementary_transformation e, const mesh_fem &mf_,
- fem_interpolation_context &ctx_)
+ fem_interpolation_context &ctx_, base_matrix &M_,
+ const mesh_fem **mf_M_, size_type &icv_)
: ga_instruction_grad(tt, Z_, coeff_out, q),
- ga_instruction_elementary_transformation(co, e, mf_, ctx_) {}
+ ga_instruction_elementary_transformation(co, e, mf_, ctx_, M_,
+ mf_M_, icv_) {}
};
struct ga_instruction_elementary_transformation_hess
@@ -2745,9 +2763,11 @@
ga_instruction_elementary_transformation_hess
(base_tensor &tt, base_tensor &Z_, const base_vector &co, size_type q,
pelementary_transformation e, const mesh_fem &mf_,
- fem_interpolation_context &ctx_)
+ fem_interpolation_context &ctx_, base_matrix &M_,
+ const mesh_fem **mf_M_, size_type &icv_)
: ga_instruction_hess(tt, Z_, coeff_out, q),
- ga_instruction_elementary_transformation(co, e, mf_, ctx_) {}
+ ga_instruction_elementary_transformation(co, e, mf_, ctx_, M_,
+ mf_M_, icv_) {}
};
struct ga_instruction_update_group_info : public ga_instruction {
@@ -2960,25 +2980,28 @@
struct ga_instruction_elementary_transformation_base {
base_tensor t_in;
base_tensor &t_out;
- base_matrix M;
pelementary_transformation elemtrans;
const mesh_fem &mf;
fem_interpolation_context &ctx;
+ base_matrix &M;
+ const mesh_fem **mf_M;
+ size_type &icv;
void do_transformation(size_type n) {
- gmm::resize(M, n, n);
- elemtrans->give_transformation(mf, ctx.convex_num(), M);
- // cout << "M = " << M << endl;
+ if (M.size() == 0 || icv != ctx.convex_num() || &mf != *mf_M) {
+ gmm::resize(M, n, n);
+ *mf_M = &mf; icv = ctx.convex_num();
+ elemtrans->give_transformation(mf, icv, M);
+ }
t_out.mat_reduction(t_in, M, 0);
- // cout << "t_out = " << t_out << endl;
- // cout << "t_in = " << t_in << endl;
- // gmm::copy(t_in.as_vector(), t_out.as_vector());
}
ga_instruction_elementary_transformation_base
(base_tensor &t_, pelementary_transformation e, const mesh_fem &mf_,
- fem_interpolation_context &ctx_)
- : t_out(t_), elemtrans(e), mf(mf_), ctx(ctx_) {}
+ fem_interpolation_context &ctx_, base_matrix &M_,
+ const mesh_fem **mf_M_, size_type &icv_)
+ : t_out(t_), elemtrans(e), mf(mf_), ctx(ctx_),
+ M(M_), mf_M(mf_M_), icv(icv_) {}
};
struct ga_instruction_elementary_transformation_val_base
@@ -2999,9 +3022,11 @@
ga_instruction_elementary_transformation_val_base
(base_tensor &t_, base_tensor &Z_, size_type q,
pelementary_transformation e, const mesh_fem &mf_,
- fem_interpolation_context &ctx_)
+ fem_interpolation_context &ctx_, base_matrix &M_,
+ const mesh_fem **mf_M_, size_type &icv_)
: ga_instruction_copy_val_base(t_in, Z_, q),
- ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_) {}
+ ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_, M_,
+ mf_M_, icv_) {}
};
struct ga_instruction_elementary_transformation_grad_base
@@ -3022,9 +3047,11 @@
ga_instruction_elementary_transformation_grad_base
(base_tensor &t_, base_tensor &Z_, size_type q,
pelementary_transformation e, const mesh_fem &mf_,
- fem_interpolation_context &ctx_)
+ fem_interpolation_context &ctx_, base_matrix &M_,
+ const mesh_fem **mf_M_, size_type &icv_)
: ga_instruction_copy_grad_base(t_in, Z_, q),
- ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_) {}
+ ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_, M_,
+ mf_M_, icv_) {}
};
struct ga_instruction_elementary_transformation_hess_base
@@ -3045,9 +3072,11 @@
ga_instruction_elementary_transformation_hess_base
(base_tensor &t_, base_tensor &Z_, size_type q,
pelementary_transformation e, const mesh_fem &mf_,
- fem_interpolation_context &ctx_)
+ fem_interpolation_context &ctx_, base_matrix &M_,
+ const mesh_fem **mf_M_, size_type &icv_)
: ga_instruction_copy_hess_base(t_in, Z_, q),
- ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_) {}
+ ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_, M_,
+ mf_M_, icv_) {}
};
@@ -7741,25 +7770,37 @@
rmi.local_dofs[pnode->name], workspace.qdim(pnode->name));
break;
case GA_NODE_ELEMENTARY_VAL:
- pgai = new ga_instruction_elementary_transformation_val
- (pnode->t, rmi.base[mf],
- rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
- workspace.elementary_transformation(pnode->elementary_name),
- *mf, gis.ctx);
+ {
+ ga_instruction_set::elementary_trans_info &eti
+ = rmi.elementary_trans_infos[pnode->elementary_name];
+ pgai = new ga_instruction_elementary_transformation_val
+ (pnode->t, rmi.base[mf],
+ rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
+ workspace.elementary_transformation(pnode->elementary_name),
+ *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+ }
break;
case GA_NODE_ELEMENTARY_GRAD:
- pgai = new ga_instruction_elementary_transformation_grad
- (pnode->t, rmi.grad[mf],
- rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
- workspace.elementary_transformation(pnode->elementary_name),
- *mf, gis.ctx);
+ {
+ ga_instruction_set::elementary_trans_info &eti
+ = rmi.elementary_trans_infos[pnode->elementary_name];
+ pgai = new ga_instruction_elementary_transformation_grad
+ (pnode->t, rmi.grad[mf],
+ rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
+ workspace.elementary_transformation(pnode->elementary_name),
+ *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+ }
break;
case GA_NODE_ELEMENTARY_HESS:
- pgai = new ga_instruction_elementary_transformation_hess
- (pnode->t, rmi.hess[mf],
- rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
- workspace.elementary_transformation(pnode->elementary_name),
- *mf, gis.ctx);
+ {
+ ga_instruction_set::elementary_trans_info &eti
+ = rmi.elementary_trans_infos[pnode->elementary_name];
+ pgai = new ga_instruction_elementary_transformation_hess
+ (pnode->t, rmi.hess[mf],
+ rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
+ workspace.elementary_transformation(pnode->elementary_name),
+ *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+ }
break;
default: break;
}
@@ -7870,22 +7911,34 @@
(pnode->t, rmi.hess[mf], mf->get_qdim());
break;
case GA_NODE_ELEMENTARY_TEST:
- pgai = new ga_instruction_elementary_transformation_val_base
- (pnode->t, rmi.base[mf], mf->get_qdim(),
- workspace.elementary_transformation(pnode->elementary_name),
- *mf, gis.ctx);
+ {
+ ga_instruction_set::elementary_trans_info &eti
+ = rmi.elementary_trans_infos[pnode->elementary_name];
+ pgai = new ga_instruction_elementary_transformation_val_base
+ (pnode->t, rmi.base[mf], mf->get_qdim(),
+ workspace.elementary_transformation(pnode->elementary_name),
+ *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+ }
break;
case GA_NODE_ELEMENTARY_GRAD_TEST:
- pgai = new ga_instruction_elementary_transformation_grad_base
- (pnode->t, rmi.grad[mf], mf->get_qdim(),
- workspace.elementary_transformation(pnode->elementary_name),
- *mf, gis.ctx);
+ {
+ ga_instruction_set::elementary_trans_info &eti
+ = rmi.elementary_trans_infos[pnode->elementary_name];
+ pgai = new ga_instruction_elementary_transformation_grad_base
+ (pnode->t, rmi.grad[mf], mf->get_qdim(),
+ workspace.elementary_transformation(pnode->elementary_name),
+ *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+ }
break;
case GA_NODE_ELEMENTARY_HESS_TEST:
- pgai = new ga_instruction_elementary_transformation_hess_base
- (pnode->t, rmi.hess[mf], mf->get_qdim(),
- workspace.elementary_transformation(pnode->elementary_name),
- *mf, gis.ctx);
+ {
+ ga_instruction_set::elementary_trans_info &eti
+ = rmi.elementary_trans_infos[pnode->elementary_name];
+ pgai = new ga_instruction_elementary_transformation_hess_base
+ (pnode->t, rmi.hess[mf], mf->get_qdim(),
+ workspace.elementary_transformation(pnode->elementary_name),
+ *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+ }
break;
default: break;
}
Modified: trunk/getfem/src/getfem_linearized_plates.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_linearized_plates.cc?rev=4915&r1=4914&r2=4915&view=diff
==============================================================================
--- trunk/getfem/src/getfem_linearized_plates.cc (original)
+++ trunk/getfem/src/getfem_linearized_plates.cc Fri Mar 27 14:25:38 2015
@@ -109,13 +109,16 @@
virtual void give_transformation(const mesh_fem &mf, size_type cv,
base_matrix &M) const{
+ DEFINE_STATIC_THREAD_LOCAL(base_matrix, M_old);
+ DEFINE_STATIC_THREAD_LOCAL_INITIALIZED(pfem, pf_old, 0);
+
// Obtaining the fem descriptors
pfem pf1 = mf.fem_of_element(cv);
size_type N = 2;
GMM_ASSERT1(pf1->dim() == 2, "This projection is only defined "
"for two-dimensional elements");
size_type qmult = N / pf1->target_dim();
-
+
bool simplex = false;
if (pf1->ref_convex(cv) == bgeot::simplex_of_reference(dim_type(N))) {
simplex = true;
@@ -126,7 +129,10 @@
GMM_ASSERT1(false, "Cannot adapt the method for such an element.");
}
- // GMM_ASSERT1(pf1->is_equivalent(), "For tau-equivalent fem only."); //
A remplacer par si non tau équivalent faire le calcul à chaque fois
+ if (pf1 == pf_old && pf1->is_equivalent() && M.size() == M_old.size()) {
+ gmm::copy(M_old, M);
+ return;
+ }
std::stringstream fem_desc;
fem_desc << "FEM_RT0" << (simplex ? "":"Q") << "(" << N << ")";
@@ -183,6 +189,7 @@
"Element not convenient for projection");
gmm::mult(aux2, gmm::transposed(B), M);
gmm::clean(M, 1E-15);
+ M_old = M; pf_old = pf1;
}
};
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] r4915 - in /trunk/getfem/src: getfem/getfem_linearized_plates.h getfem_generic_assembly.cc getfem_linearized_plates.cc,
Yves . Renard <=