[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] r5393 - in /trunk/getfem/src: getfem/getfem_fem_global_
From: |
logari81 |
Subject: |
[Getfem-commits] r5393 - in /trunk/getfem/src: getfem/getfem_fem_global_function.h getfem_fem_global_function.cc |
Date: |
Fri, 07 Oct 2016 21:42:04 -0000 |
Author: logari81
Date: Fri Oct 7 23:42:03 2016
New Revision: 5393
URL: http://svn.gna.org/viewcvs/getfem?rev=5393&view=rev
Log:
fix missing dependency to static stored point tabs
Modified:
trunk/getfem/src/getfem/getfem_fem_global_function.h
trunk/getfem/src/getfem_fem_global_function.cc
Modified: trunk/getfem/src/getfem/getfem_fem_global_function.h
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_fem_global_function.h?rev=5393&r1=5392&r2=5393&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_fem_global_function.h (original)
+++ trunk/getfem/src/getfem/getfem_fem_global_function.h Fri Oct 7
23:42:03 2016
@@ -56,8 +56,18 @@
mutable std::vector<std::vector<size_type> > index_of_global_dof_;
mutable bgeot::pstored_point_tab pspt_override;
- mutable std::vector< std::map<bgeot::pstored_point_tab,
std::vector<base_tensor> > >
- precompval, precompgrad, precomphess; // store values, gradients and
hessians of base functions
+ struct precomp_data { std::vector<base_tensor> val, grad, hess; };
+
+ class precomp_pool
+ : virtual public dal::static_stored_object,
+ public std::vector< std::map<bgeot::pstored_point_tab,
+ precomp_data > >
+ {};
+
+ // store values, gradients and hessians of base functions
+ mutable std::shared_ptr<precomp_pool> precomps;
+
+ DAL_SIMPLE_KEY(precomp_pool_key, std::shared_ptr<precomp_pool>);
void init();
virtual void update_from_context() const;
Modified: trunk/getfem/src/getfem_fem_global_function.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_fem_global_function.cc?rev=5393&r1=5392&r2=5393&view=diff
==============================================================================
--- trunk/getfem/src/getfem_fem_global_function.cc (original)
+++ trunk/getfem/src/getfem_fem_global_function.cc Fri Oct 7 23:42:03 2016
@@ -68,9 +68,17 @@
void fem_global_function::update_from_context() const {
- precompval.clear();
- precompgrad.clear();
- precomphess.clear();
+ if (precomps) {
+ for (const auto &cv_precomps : *precomps)
+ for (const auto &keyval : cv_precomps)
+ dal::del_dependency(precomps, keyval.first);
+ precomps->clear();
+ } else {
+ precomps = std::make_shared<precomp_pool>();
+ dal::pstatic_stored_object_key pkey
+ = std::make_shared<precomp_pool_key>(precomps);
+ dal::add_stored_object(pkey, precomps);
+ }
mib.resize(2);
mib[0] = short_type(1);
@@ -188,22 +196,31 @@
mib[0] = short_type(nbdof);
t.adjust_sizes(mib);
if (c.have_pfp() && c.ii() != size_type(-1)) {
- if (precompval.size() == 0)
- precompval.resize(m.nb_allocated_convex());
+ GMM_ASSERT1(precomps, "Internal error");
+ if (precomps->size() == 0)
+ precomps->resize(m.nb_allocated_convex());
+ GMM_ASSERT1(precomps->size() == m.nb_allocated_convex(), "Internal
error");
const bgeot::pstored_point_tab ptab = c.pfp()->get_ppoint_tab();
- auto it = precompval[cv].find(ptab);
- if (it == precompval[cv].end()) {
- it = precompval[cv]
- .emplace(ptab, std::vector<base_tensor>(ptab->size())).first;
+ auto it = (*precomps)[cv].find(ptab);
+ if (it == (*precomps)[cv].end()) {
+ it = (*precomps)[cv].emplace(ptab, precomp_data()).first;
+ dal::add_dependency(precomps, ptab);
+ // we could have added the dependency to this->shared_from_this()
+ // instead, but there is a risk that this will shadow the same
+ // dependency through a different path, so that it becomes dangerous
+ // to delete the dependency later
+ }
+ if (it->second.val.size() == 0) {
+ it->second.val.resize(ptab->size());
base_matrix G;
bgeot::vectors_to_base_matrix(G, m.points_of_convex(cv));
for (size_type k = 0; k < ptab->size(); ++k) {
const fem_interpolation_context
ctx(m.trans_of_convex(cv), shared_from_this(), (*ptab)[k], G, cv);
- real_base_value(ctx, it->second[k]);
+ real_base_value(ctx, it->second.val[k]);
}
}
- gmm::copy(it->second[c.ii()].as_vector(), t.as_vector());
+ gmm::copy(it->second.val[c.ii()].as_vector(), t.as_vector());
} else
for (size_type i=0; i < nbdof; ++i) {
/*cerr << "fem_global_function: real_base_value(" << c.xreal() <<
")\n";
@@ -221,22 +238,27 @@
mig[0] = short_type(nbdof);
t.adjust_sizes(mig);
if (c.have_pfp() && c.ii() != size_type(-1)) {
- if (precompgrad.size() == 0)
- precompgrad.resize(m.nb_allocated_convex());
+ GMM_ASSERT1(precomps, "Internal error");
+ if (precomps->size() == 0)
+ precomps->resize(m.nb_allocated_convex());
+ GMM_ASSERT1(precomps->size() == m.nb_allocated_convex(), "Internal
error");
const bgeot::pstored_point_tab ptab = c.pfp()->get_ppoint_tab();
- auto it = precompgrad[cv].find(ptab);
- if (it == precompgrad[cv].end()) {
- it = precompgrad[cv]
- .emplace(ptab, std::vector<base_tensor>(ptab->size())).first;
+ auto it = (*precomps)[cv].find(ptab);
+ if (it == (*precomps)[cv].end()) {
+ it = (*precomps)[cv].emplace(ptab, precomp_data()).first;
+ dal::add_dependency(precomps, ptab);
+ }
+ if (it->second.grad.size() == 0) {
+ it->second.grad.resize(ptab->size());
base_matrix G;
bgeot::vectors_to_base_matrix(G, m.points_of_convex(cv));
for (size_type k = 0; k < ptab->size(); ++k) {
const fem_interpolation_context
ctx(m.trans_of_convex(cv), shared_from_this(), (*ptab)[k], G, cv);
- real_grad_base_value(ctx, it->second[k]);
+ real_grad_base_value(ctx, it->second.grad[k]);
}
}
- gmm::copy(it->second[c.ii()].as_vector(), t.as_vector());
+ gmm::copy(it->second.grad[c.ii()].as_vector(), t.as_vector());
} else {
base_small_vector G(dim());
for (size_type i=0; i < nbdof; ++i) {
@@ -255,22 +277,27 @@
mih[0] = short_type(nbdof);
t.adjust_sizes(mih);
if (c.have_pfp() && c.ii() != size_type(-1)) {
- if (precomphess.size() == 0)
- precomphess.resize(m.nb_allocated_convex());
+ GMM_ASSERT1(precomps, "Internal error");
+ if (precomps->size() == 0)
+ precomps->resize(m.nb_allocated_convex());
+ GMM_ASSERT1(precomps->size() == m.nb_allocated_convex(), "Internal
error");
const bgeot::pstored_point_tab ptab = c.pfp()->get_ppoint_tab();
- auto it = precomphess[cv].find(ptab);
- if (it == precomphess[cv].end()) {
- it = precomphess[cv]
- .emplace(ptab, std::vector<base_tensor>(ptab->size())).first;
+ auto it = (*precomps)[cv].find(ptab);
+ if (it == (*precomps)[cv].end()) {
+ it = (*precomps)[cv].emplace(ptab, precomp_data()).first;
+ dal::add_dependency(precomps, ptab);
+ }
+ if (it->second.hess.size() == 0) {
+ it->second.hess.resize(ptab->size());
base_matrix G;
bgeot::vectors_to_base_matrix(G, m.points_of_convex(cv));
for (size_type k = 0; k < ptab->size(); ++k) {
const fem_interpolation_context
ctx(m.trans_of_convex(cv), shared_from_this(), (*ptab)[k], G, cv);
- real_hess_base_value(ctx, it->second[k]);
+ real_hess_base_value(ctx, it->second.hess[k]);
}
}
- gmm::copy(it->second[c.ii()].as_vector(), t.as_vector());
+ gmm::copy(it->second.hess[c.ii()].as_vector(), t.as_vector());
} else {
base_matrix H(dim(),dim());
for (size_type i=0; i < nbdof; ++i) {
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] r5393 - in /trunk/getfem/src: getfem/getfem_fem_global_function.h getfem_fem_global_function.cc,
logari81 <=