getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] r4722 - /trunk/getfem/src/getfem_generic_assembly.cc


From: Yves . Renard
Subject: [Getfem-commits] r4722 - /trunk/getfem/src/getfem_generic_assembly.cc
Date: Thu, 17 Jul 2014 18:09:02 -0000

Author: renard
Date: Thu Jul 17 20:09:01 2014
New Revision: 4722

URL: http://svn.gna.org/viewcvs/getfem?rev=4722&view=rev
Log:
fix a bug in update_group_info call

Modified:
    trunk/getfem/src/getfem_generic_assembly.cc

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=4722&r1=4721&r2=4722&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Thu Jul 17 20:09:01 2014
@@ -2471,7 +2471,7 @@
     ga_workspace &workspace;
     ga_instruction_set &gis;
     ga_instruction_set::interpolate_info &inin;
-    const std::string &gname;
+    const std::string gname;
     ga_instruction_set::variable_group_info &vgi;
     virtual int exec(void) {
       GA_DEBUG_INFO("Instruction: Update group info for "+gname);
@@ -6911,19 +6911,6 @@
     }
   }
 
-  static void ensure_update_group_info_instruction
-  (ga_workspace &workspace, ga_instruction_set &gis,
-   ga_instruction_set::region_mim_instructions &rmi,
-   const std::string &transname, const std::string &gname) {
-    if (rmi.interpolate_infos[transname].groups_info.find(gname)
-        == rmi.interpolate_infos[transname].groups_info.end()) {
-      pga_instruction pgai = new ga_instruction_update_group_info
-        (workspace, gis, rmi.interpolate_infos[transname],
-         gname, rmi.interpolate_infos[transname].groups_info[gname]);
-      rmi.instructions.push_back(pgai);
-    }
-  }
-
   static void ga_clear_node_list
   (pga_tree_node pnode, std::map<scalar_type,
    std::list<pga_tree_node> > &node_list) {
@@ -6968,8 +6955,6 @@
         if (intn1.size()) pctx1 = &(rmi.interpolate_infos[intn1].ctx);
         if (intn1.size()
             && workspace.variable_group_exists(pnode->name_test1)) {
-          ensure_update_group_info_instruction(workspace, gis, rmi,
-                                               intn1, pnode->name_test1);
           ga_instruction_set::variable_group_info &vgi = 
             rmi.interpolate_infos[intn1].groups_info[pnode->name_test1];
           mfg1 = &(vgi.mf); mf1 = 0;
@@ -6983,8 +6968,6 @@
         if (intn2.size()) pctx2 = &(rmi.interpolate_infos[intn2].ctx);
         if (intn2.size()
             && workspace.variable_group_exists(pnode->name_test2)) {
-          ensure_update_group_info_instruction(workspace, gis, rmi,
-                                               intn2, pnode->name_test2);
           ga_instruction_set::variable_group_info &vgi = 
             rmi.interpolate_infos[intn2].groups_info[pnode->name_test2];
           mfg2 = &(vgi.mf); mf2 = 0;
@@ -7247,8 +7230,6 @@
         fem_interpolation_context *pctx = &(rmi.interpolate_infos[intn].ctx);
         const mesh **m2 = &(rmi.interpolate_infos[intn].m);
         if (workspace.variable_group_exists(pnode->name)) {
-          ensure_update_group_info_instruction(workspace, gis, rmi,
-                                               intn, pnode->name);
           ga_instruction_set::variable_group_info &vgi = 
             rmi.interpolate_infos[intn].groups_info[pnode->name];
           mfg = &(vgi.mf); mfn = 0; Ug = &(vgi.U); Un = 0;
@@ -7347,8 +7328,6 @@
         fem_interpolation_context *pctx = &(rmi.interpolate_infos[intn].ctx);
         const mesh **m2 = &(rmi.interpolate_infos[intn].m);
         if (workspace.variable_group_exists(pnode->name)) {
-          ensure_update_group_info_instruction(workspace, gis, rmi,
-                                               intn, pnode->name);
           ga_instruction_set::variable_group_info &vgi = 
             rmi.interpolate_infos[intn].groups_info[pnode->name];
           mfg = &(vgi.mf); mfn = 0;
@@ -7839,7 +7818,8 @@
   }
 
   static bool ga_node_used_interpolates
-  (pga_tree_node pnode, std::set<std::string> &interpolates,
+  (pga_tree_node pnode, ga_workspace &workspace,
+   std::map<std::string, std::set<std::string> > &interpolates,
    std::set<std::string> &interpolates_der) {
     bool found = false;
     if (pnode->node_type == GA_NODE_INTERPOLATE_FILTER ||
@@ -7851,15 +7831,27 @@
         pnode->node_type == GA_NODE_INTERPOLATE_HESS_TEST ||
         pnode->node_type == GA_NODE_INTERPOLATE_NORMAL ||
         pnode->node_type == GA_NODE_INTERPOLATE_X) {
-      interpolates.insert(pnode->interpolate_name);
+      interpolates[pnode->interpolate_name].size();
+      if (pnode->node_type == GA_NODE_INTERPOLATE_VAL ||
+          pnode->node_type == GA_NODE_INTERPOLATE_GRAD ||
+          pnode->node_type == GA_NODE_INTERPOLATE_HESS ||
+          pnode->node_type == GA_NODE_INTERPOLATE_TEST ||
+          pnode->node_type == GA_NODE_INTERPOLATE_GRAD_TEST ||
+          pnode->node_type == GA_NODE_INTERPOLATE_HESS_TEST) {
+        if (workspace.variable_group_exists(pnode->name))
+          interpolates[pnode->interpolate_name].insert(pnode->name);
+      }
+
       found = true;
     }
     if (pnode->node_type == GA_NODE_INTERPOLATE_DERIVATIVE) {
       interpolates_der.insert(pnode->interpolate_name_der);
-      interpolates.insert(pnode->interpolate_name_der);
+      interpolates[pnode->interpolate_name_der].size();
+      if (workspace.variable_group_exists(pnode->name))
+          interpolates[pnode->interpolate_name_der].insert(pnode->name);
     }
     for (size_type i = 0; i < pnode->children.size(); ++i)
-      found = ga_node_used_interpolates(pnode->children[i],
+      found = ga_node_used_interpolates(pnode->children[i], workspace,
                                         interpolates, interpolates_der)
         || found;
     return found;
@@ -7871,24 +7863,31 @@
    ga_instruction_set::region_mim_instructions &rmi, const mesh &m) {
 
     std::set<std::string> interpolates_der;
-    std::set<std::string> transformations;
-    // std::map<std::string, std::set<std::string> > transformations;
-    ga_node_used_interpolates(pnode, transformations, interpolates_der);
+    std::map<std::string, std::set<std::string> > transformations;
+    ga_node_used_interpolates(pnode, workspace, transformations, 
interpolates_der);
     
-    for (std::set<std::string>::iterator it = transformations.begin();
-         it != transformations.end(); ++it) {
-      bool compute_der = (interpolates_der.find(*it)!=interpolates_der.end());
-      if (rmi.transformations.find(*it) == rmi.transformations.end() ||
-          (compute_der && rmi.transformations_der.find(*it)
+    for (std::map<std::string, std::set<std::string> >::iterator
+           it = transformations.begin(); it != transformations.end(); ++it) {
+      bool compute_der = 
(interpolates_der.find(it->first)!=interpolates_der.end());
+      if (rmi.transformations.find(it->first) == rmi.transformations.end() ||
+          (compute_der && rmi.transformations_der.find(it->first)
            == rmi.transformations_der.end())) {
-        rmi.transformations.insert(*it);
-        gis.transformations.insert(*it);
-        if (compute_der) rmi.transformations_der.insert(*it);
+        rmi.transformations.insert(it->first);
+        gis.transformations.insert(it->first);
+        if (compute_der) rmi.transformations_der.insert(it->first);
         pga_instruction pgai = new ga_instruction_transformation_call
-          (workspace, rmi.interpolate_infos[*it],
-           workspace.interpolate_transformation(*it), gis.ctx, gis.Normal, m,
+          (workspace, rmi.interpolate_infos[it->first],
+           workspace.interpolate_transformation(it->first), gis.ctx, 
gis.Normal, m,
            compute_der);
         rmi.instructions.push_back(pgai);
+
+        for (std::set<std::string>::iterator itt = it->second.begin();
+             itt != it->second.end(); ++itt) {
+          pgai = new ga_instruction_update_group_info
+            (workspace, gis, rmi.interpolate_infos[it->first],
+             *itt, rmi.interpolate_infos[it->first].groups_info[*itt]);
+          rmi.instructions.push_back(pgai);
+        }
       }
     }
   }
@@ -7979,8 +7978,6 @@
                 const gmm::sub_interval *Ir = 0, *In = 0;
                 if (intn1.size() &&
                     workspace.variable_group_exists(root->name_test1)) {
-                  ensure_update_group_info_instruction(workspace, gis, rmi,
-                                                       intn1,root->name_test1);
                   ga_instruction_set::variable_group_info &vgi = 
                     rmi.interpolate_infos[intn1].groups_info[root->name_test1];
                   Ir = &(vgi.Ir); In = &(vgi.In);
@@ -8030,8 +8027,6 @@
 
               if (intn1.size() &&
                   workspace.variable_group_exists(root->name_test1)) {
-                ensure_update_group_info_instruction(workspace, gis, rmi,
-                                                     intn1,root->name_test1);
                 ga_instruction_set::variable_group_info &vgi = 
                   rmi.interpolate_infos[intn1].groups_info[root->name_test1];
                 Ir1 = &(vgi.Ir); In1 = &(vgi.In);
@@ -8043,8 +8038,6 @@
 
               if (intn2.size() &&
                   workspace.variable_group_exists(root->name_test2)) {
-                ensure_update_group_info_instruction(workspace, gis, rmi,
-                                                     intn2,root->name_test2);
                 ga_instruction_set::variable_group_info &vgi = 
                   rmi.interpolate_infos[intn2].groups_info[root->name_test2];
                 Ir2 = &(vgi.Ir); In2 = &(vgi.In);




reply via email to

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