getfem-commits
[Top][All Lists]
Advanced

[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);
   }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]