[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] r5025 - in /trunk/getfem/src: ./ getfem/
From: |
Yves . Renard |
Subject: |
[Getfem-commits] r5025 - in /trunk/getfem/src: ./ getfem/ |
Date: |
Wed, 03 Jun 2015 14:35:48 -0000 |
Author: renard
Date: Wed Jun 3 16:35:47 2015
New Revision: 5025
URL: http://svn.gna.org/viewcvs/getfem?rev=5025&view=rev
Log:
Bug fix on actualize_sizes
Modified:
trunk/getfem/src/getfem/bgeot_tensor.h
trunk/getfem/src/getfem/getfem_generic_assembly.h
trunk/getfem/src/getfem/getfem_models.h
trunk/getfem/src/getfem_generic_assembly.cc
trunk/getfem/src/getfem_models.cc
Modified: trunk/getfem/src/getfem/bgeot_tensor.h
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/bgeot_tensor.h?rev=5025&r1=5024&r2=5025&view=diff
==============================================================================
--- trunk/getfem/src/getfem/bgeot_tensor.h (original)
+++ trunk/getfem/src/getfem/bgeot_tensor.h Wed Jun 3 16:35:47 2015
@@ -90,6 +90,12 @@
for (size_type i = 0; i < m.size(); ++i)
if (m[i] != (*this)[i]) return false;
return true;
+ }
+
+ size_type total_size(void) const {
+ size_type s = 1;
+ for (size_type k = 0; k < this->size(); ++k) s *= (*this)[k];
+ return s;
}
size_type memsize() const {
Modified: trunk/getfem/src/getfem/getfem_generic_assembly.h
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_generic_assembly.h?rev=5025&r1=5024&r2=5025&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_generic_assembly.h (original)
+++ trunk/getfem/src/getfem/getfem_generic_assembly.h Wed Jun 3 16:35:47 2015
@@ -545,23 +545,24 @@
GMM_ASSERT1(false, "Undefined variable " << name);
}
- size_type qdim(const std::string &name) const {
- const mesh_fem *mf = associated_mf(name);
- const im_data *imd = associated_im_data(name);
- size_type n = gmm::vect_size(value(name));
- if (mf) {
- size_type ndof = mf->nb_dof();
- GMM_ASSERT1(ndof, "Variable " << name << " with no dof. You probably "
- "made a wrong initialization of a mesh_fem object");
- return mf->get_qdim() * (n / ndof);
- } else if (imd) {
- size_type q = n / imd->nb_filtered_index();
- GMM_ASSERT1(q % imd->nb_tensor_elem() == 0,
- "Invalid mesh im data vector");
- return q;
- }
- return n;
- }
+ size_type qdim(const std::string &name) const;
+// {
+// const mesh_fem *mf = associated_mf(name);
+// const im_data *imd = associated_im_data(name);
+// size_type n = ;
+// if (mf) {
+// size_type ndof = mf->nb_dof();
+// GMM_ASSERT1(ndof, "Variable " << name << " with no dof. You
probably "
+// "made a wrong initialization of a mesh_fem object");
+// return mf->get_qdim() * (n / ndof);
+// } else if (imd) {
+// size_type q = n / imd->nb_filtered_index();
+// GMM_ASSERT1(q % imd->nb_tensor_elem() == 0,
+// "Invalid mesh im data vector");
+// return q;
+// }
+// return gmm::vect_size(value(name));
+// }
bgeot::multi_index qdims(const std::string &name) const;
Modified: trunk/getfem/src/getfem/getfem_models.h
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_models.h?rev=5025&r1=5024&r2=5025&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_models.h (original)
+++ trunk/getfem/src/getfem/getfem_models.h Wed Jun 3 16:35:47 2015
@@ -214,11 +214,7 @@
// im data description
const im_data *pim_data;
- size_type qdim(void) const {
- size_type q = 1;
- for (size_type i = 0; i < qdims.size(); ++i) q *= qdims[i];
- return q;
- }
+ size_type qdim(void) const { return qdims.total_size(); }
var_description(bool is_var = false, bool is_com = false,
bool is_fem = false, size_type n_it = 1,
@@ -971,6 +967,7 @@
bgeot::multi_index qdims_of_variable(const std::string &name) const;
+ size_type qdim_of_variable(const std::string &name) const;
/** Gives the access to the tangent matrix. For the real version. */
const model_real_sparse_matrix &real_tangent_matrix(void) const {
Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=5025&r1=5024&r2=5025&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Wed Jun 3 16:35:47 2015
@@ -4513,9 +4513,6 @@
const im_data *imd = it->second.imd;
size_type n = it->second.qdim();
if (mf) {
- size_type ndof = mf->nb_dof();
- GMM_ASSERT1(ndof, "Variable " << name << " with no dof. You probably
"
- "made a wrong initialization of a mesh_fem object");
bgeot::multi_index mi = mf->get_qdims();
if (n > 1 || it->second.qdims.size() > 1) {
size_type i = 0;
@@ -4547,7 +4544,29 @@
return qdims(first_variable_of_group(name));
GMM_ASSERT1(false, "Undefined variable or group " << name);
}
-
+
+ size_type ga_workspace::qdim(const std::string &name) const {
+ VAR_SET::const_iterator it = variables.find(name);
+ if (it != variables.end()) {
+ const mesh_fem *mf = it->second.is_fem_dofs ? it->second.mf : 0;
+ const im_data *imd = it->second.imd;
+ size_type n = it->second.qdim();
+ if (mf) {
+ return n * mf->get_qdim();
+ } else if (imd) {
+ return n * imd->tensor_size().total_size();
+ }
+ return n;
+ }
+ if (md && md->variable_exists(name))
+ return md->qdim_of_variable(name);
+ if (parent_workspace && parent_workspace->variable_exists(name))
+ return parent_workspace->qdim(name);
+ if (variable_group_exists(name))
+ return qdim(first_variable_of_group(name));
+ GMM_ASSERT1(false, "Undefined variable or group " << name);
+ }
+
typedef std::pair<std::string, std::string> var_trans_pair;
@@ -6436,13 +6455,13 @@
size_type q = workspace.qdim(name);
size_type n = mf->linked_mesh().dim();
bgeot::multi_index mii = workspace.qdims(name);
-
+
if (!q) ga_throw_error(expr, pnode->pos,
"Invalid null size of variable " << name);
if (mii.size() > 6)
ga_throw_error(expr, pnode->pos,
"Tensor with too much dimensions. Limited to 6");
-
+
switch (prefix_id) {
case 0: // value
pnode->node_type = test ? GA_NODE_VAL_TEST : GA_NODE_VAL;
Modified: trunk/getfem/src/getfem_models.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_models.cc?rev=5025&r1=5024&r2=5025&view=diff
==============================================================================
--- trunk/getfem/src/getfem_models.cc (original)
+++ trunk/getfem/src/getfem_models.cc Wed Jun 3 16:35:47 2015
@@ -344,8 +344,40 @@
bool bupd = false;
bool cplx = is_complex() && brick.pbr->is_complex();
+ if (!(brick.tlist.size())) {
+ bool varc = false, multc = false;
+ for (size_type iv = 0; iv < brick.vlist.size(); ++iv) {
+ if (!(mults[k].compare(brick.vlist[iv]))) multc = true;
+ if (!(it2->first.compare(brick.vlist[iv]))) varc = true;
+ }
+ if (multc && varc) {
+ GMM_ASSERT1(!cplx, "Sorry, not taken into account");
+ generic_expressions.clear();
+ brick.terms_to_be_computed = true;
+ update_brick(ib, BUILD_MATRIX);
+ if (generic_expressions.size()) {
+ GMM_TRACE2("Generic assembly for actualize sizes");
+ ga_workspace workspace(*this);
+ for (std::list<gen_expr>::iterator ig
+ = generic_expressions.begin();
+ ig != generic_expressions.end(); ++ig) {
+ workspace.add_expression(ig->expr,ig->mim,ig->region);
+ }
+ gmm::clear(rTM);
+ workspace.set_assembled_matrix(rTM);
+ workspace.assembly(2);
+ gmm::add
+ (gmm::sub_matrix(rTM, it->second.I, it2->second.I),MM);
+ gmm::add(gmm::transposed
+ (gmm::sub_matrix(rTM, it2->second.I,
+ it->second.I)), MM);
+ bupd = false;
+ }
+ }
+ }
+
+
for (size_type j = 0; j < brick.tlist.size(); ++j) {
-
const term_description &term = brick.tlist[j];
if (term.is_matrix_term) {
@@ -363,32 +395,14 @@
update_brick(ib, BUILD_MATRIX);
bupd = true;
}
- if (generic_expressions.size()) {
- GMM_TRACE2("Generic assembly for actualize sizes");
- ga_workspace workspace(*this);
- for (std::list<gen_expr>::iterator ig
- = generic_expressions.begin();
- ig != generic_expressions.end(); ++ig) {
- workspace.add_expression(ig->expr,ig->mim,ig->region);
- }
- gmm::clear(rTM);
- workspace.set_assembled_matrix(rTM);
- workspace.assembly(2);
- gmm::add
- (gmm::sub_matrix(rTM, it->second.I, it2->second.I),MM);
- gmm::add(gmm::transposed
- (gmm::sub_matrix(rTM, it2->second.I,
- it->second.I)), MM);
- bupd = false;
- } else {
- gmm::add(gmm::sub_matrix(brick.rmatlist[j],
- it->second.I, it2->second.I),
- MM);
- gmm::add(gmm::transposed(gmm::sub_matrix
- (brick.rmatlist[j],
- it2->second.I, it->second.I)),
- MM);
- }
+ gmm::add(gmm::sub_matrix(brick.rmatlist[j],
+ it->second.I, it2->second.I),
+ MM);
+ gmm::add(gmm::transposed(gmm::sub_matrix
+ (brick.rmatlist[j],
+ it2->second.I, it->second.I)),
+ MM);
+ termadded = true;
}
} else if (!mults[k].compare(term.var1) &&
!it2->first.compare(term.var2)) {
@@ -2708,9 +2722,6 @@
const im_data *imd = it->second.pim_data;
size_type n = it->second.qdim();
if (mf) {
- size_type ndof = mf->nb_dof();
- GMM_ASSERT1(ndof, "Variable " << name << " with no dof. You probably "
- "made a wrong initialization of a mesh_fem object");
bgeot::multi_index mi = mf->get_qdims();
if (n > 1 || it->second.qdims.size() > 1) {
size_type i = 0;
@@ -2734,6 +2745,21 @@
}
return it->second.qdims;
}
+
+ size_type model::qdim_of_variable(const std::string &name) const {
+ VAR_SET::const_iterator it = variables.find(name);
+ GMM_ASSERT1(it!=variables.end(), "Undefined variable " << name);
+ const mesh_fem *mf = it->second.passociated_mf();
+ const im_data *imd = it->second.pim_data;
+ size_type n = it->second.qdim();
+ if (mf) {
+ return mf->get_qdim() * n;
+ } else if (imd) {
+ return imd->tensor_size().total_size() * n;
+ }
+ return n;
+ }
+
const model_real_plain_vector &
model::real_variable(const std::string &name, size_type niter) const {
@@ -3341,18 +3367,15 @@
" in assembly string for nonlinear terms");
model::varnamelist vl, vl_test1, vl_test2, ddl, dl;
workspace.used_variables(vl, vl_test1, vl_test2, ddl, order);
-
for (size_type i = 0; i < ddl.size(); ++i)
if (md.is_true_data(ddl[i])) dl.push_back(ddl[i]);
else vl.push_back(ddl[i]);
-
if (order == 0) { is_coercive = is_sym = true; }
pbrick pbr = new gen_nonlinear_assembly_brick(expr, is_sym, is_coercive,
brickname);
model::termlist tl; // No term
// tl.push_back(model::term_description(true, is_sym));
// TODO to be changed.
-
return md.add_brick(pbr, vl, dl, tl, model::mimlist(1, &mim), region);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] r5025 - in /trunk/getfem/src: ./ getfem/,
Yves . Renard <=