getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] (no subject)


From: Yves Renard
Subject: [Getfem-commits] (no subject)
Date: Wed, 2 May 2018 14:30:23 -0400 (EDT)

branch: devel-yves-generic-assembly-modifs
commit 039ca29a53cf7ebcb4d04c2d416b04510351cc20
Author: Yves Renard <address@hidden>
Date:   Wed May 2 20:29:31 2018 +0200

    Grad operator, work in progress
---
 src/getfem/getfem_generic_assembly.h         |   1 +
 src/getfem_generic_assembly_interpolation.cc |  11 +-
 src/getfem_generic_assembly_semantic.cc      | 188 ++++++++++++++-------------
 3 files changed, 108 insertions(+), 92 deletions(-)

diff --git a/src/getfem/getfem_generic_assembly.h 
b/src/getfem/getfem_generic_assembly.h
index 991bd58..6bde7da 100644
--- a/src/getfem/getfem_generic_assembly.h
+++ b/src/getfem/getfem_generic_assembly.h
@@ -108,6 +108,7 @@ namespace getfem {
      std::map<var_trans_pair, base_tensor> &derivatives,
      bool compute_derivatives) const = 0;
     virtual void finalize() const = 0;
+    virtual std::string expression(void) const { return std::string(); }
 
     virtual ~virtual_interpolate_transformation() {}
   };
diff --git a/src/getfem_generic_assembly_interpolation.cc 
b/src/getfem_generic_assembly_interpolation.cc
index 1006f56..4a088a9 100644
--- a/src/getfem_generic_assembly_interpolation.cc
+++ b/src/getfem_generic_assembly_interpolation.cc
@@ -620,6 +620,7 @@ namespace getfem {
       local_gis = ga_instruction_set();
     }
 
+    std::string expression(void) const { return expr; }
 
     int transform(const ga_workspace &/*workspace*/, const mesh &m,
                   fem_interpolation_context &ctx_x,
@@ -748,6 +749,8 @@ namespace getfem {
                            const std::string &/* interpolate_name */) const {}
     void init(const ga_workspace &/* workspace */) const {}
     void finalize() const {}
+    
+    std::string expression(void) const { return "Id(meshdim)"; }
 
     int transform(const ga_workspace &/*workspace*/, const mesh &m_x,
                   fem_interpolation_context &ctx_x,
@@ -789,11 +792,8 @@ namespace getfem {
   };
 
 
-  pinterpolate_transformation interpolate_transformation_neighbour_instance()
-  {
-    pinterpolate_transformation
-      p = std::make_shared<interpolate_transformation_neighbour>();
-    return p;
+  pinterpolate_transformation interpolate_transformation_neighbour_instance() {
+    return (std::make_shared<interpolate_transformation_neighbour>());
   }
 
   //=========================================================================
@@ -814,6 +814,7 @@ namespace getfem {
                            const std::string &/* interpolate_name */) const {}
     void init(const ga_workspace &/* workspace */) const {}
     void finalize() const {}
+    std::string expression(void) const { return "Id(meshdim)"; }
 
     int transform(const ga_workspace &/*workspace*/, const mesh &m_x,
                   fem_interpolation_context &ctx_x,
diff --git a/src/getfem_generic_assembly_semantic.cc 
b/src/getfem_generic_assembly_semantic.cc
index 610c685..d5a0731 100644
--- a/src/getfem_generic_assembly_semantic.cc
+++ b/src/getfem_generic_assembly_semantic.cc
@@ -3205,100 +3205,117 @@ namespace getfem {
       child1->node_type = GA_NODE_CONSTANT;
       break;
 
-  #ifdef continue_here
 
+    case GA_NODE_INTERPOLATE_HESS_TEST:
+    case GA_NODE_INTERPOLATE_HESS:
+      GMM_ASSERT1(false, "Sorry, cannot derive a hessian once more");
+      break;
+      
     case GA_NODE_INTERPOLATE_VAL:
     case GA_NODE_INTERPOLATE_GRAD:
-    case GA_NODE_INTERPOLATE_HESS:
     case GA_NODE_INTERPOLATE_DIVERG:
       {
         bool is_val(pnode->node_type == GA_NODE_INTERPOLATE_VAL);
         bool is_grad(pnode->node_type == GA_NODE_INTERPOLATE_GRAD);
-        bool is_hess(pnode->node_type == GA_NODE_INTERPOLATE_HESS);
         bool is_diverg(pnode->node_type == GA_NODE_INTERPOLATE_DIVERG);
-
-        bool ivar = (pnode->name.compare(varname) == 0 &&
-                     pnode->interpolate_name.compare(interpolatename) == 0);
-        bool itrans = !ivar;
-        if (!itrans) {
-          std::set<var_trans_pair> vars;
-          workspace.interpolate_transformation(pnode->interpolate_name)
-            ->extract_variables(workspace, vars, true, m,
-                                pnode->interpolate_name);
-          for (const var_trans_pair &var : vars) {
-            if (var.varname.compare(varname) == 0 &&
-                var.transname.compare(interpolatename) == 0)
-              itrans = true;
-          }
-        }
-
-        pga_tree_node pnode_trans = pnode;
-        if (is_hess) {
-          GMM_ASSERT1(!itrans, "Sorry, cannot derive a hessian once more");
-        } else if (itrans && ivar) {
-          tree.duplicate_with_addition(pnode);
-          pnode_trans = pnode->parent->children[1];
-        }
-
-        if (ivar) {
-          mi.resize(1); mi[0] = 2;
-          for (size_type i = 0; i < pnode->tensor_order(); ++i)
-            mi.push_back(pnode->tensor_proper_size(i));
-          pnode->t.adjust_sizes(mi);
-          if (is_val) // --> t(Qmult*ndof,Qmult*target_dim)
-            pnode->node_type = GA_NODE_INTERPOLATE_VAL_TEST;
-          else if (is_grad) // --> t(Qmult*ndof,Qmult*target_dim,N)
-            pnode->node_type = GA_NODE_INTERPOLATE_GRAD_TEST;
-          else if (is_hess) // --> t(Qmult*ndof,Qmult*target_dim,N,N)
-            pnode->node_type = GA_NODE_INTERPOLATE_HESS_TEST;
-          else if (is_diverg) // --> t(Qmult*ndof)
-            pnode->node_type = GA_NODE_INTERPOLATE_DIVERG_TEST;
-          pnode->test_function_type = order;
-        }
-
-        if (itrans) {
-          const mesh_fem *mf = workspace.associated_mf(pnode_trans->name);
-          size_type q = workspace.qdim(pnode_trans->name);
-          size_type n = mf->linked_mesh().dim();
-          bgeot::multi_index mii = workspace.qdims(pnode_trans->name);
-
-          if (is_val)  // --> t(target_dim*Qmult,N)
-            pnode_trans->node_type = GA_NODE_INTERPOLATE_GRAD;
-          else if (is_grad || is_diverg)  // --> t(target_dim*Qmult,N,N)
-            pnode_trans->node_type = GA_NODE_INTERPOLATE_HESS;
-
-          if (n > 1) {
-            if (q == 1 && mii.size() <= 1) { mii.resize(1); mii[0] = n; }
-            else mii.push_back(n);
-
-            if (is_grad || is_diverg) mii.push_back(n);
-          }
-          pnode_trans->t.adjust_sizes(mii);
-          tree.duplicate_with_operation(pnode_trans,
-                                        (n > 1) ? GA_DOT : GA_MULT);
-          pga_tree_node pnode_der = pnode_trans->parent->children[1];
-          pnode_der->node_type = GA_NODE_INTERPOLATE_DERIVATIVE;
-          if (n == 1)
-            pnode_der->init_vector_tensor(2);
-          else
-            pnode_der->init_matrix_tensor(2, n);
-          pnode_der->test_function_type = order;
-          pnode_der->name = varname;
-          pnode_der->interpolate_name_der = pnode_der->interpolate_name;
-          pnode_der->interpolate_name = interpolatename;
-
-          if (is_diverg) { // --> t(Qmult*ndof)
-            tree.insert_node(pnode_trans->parent, GA_NODE_OP);
-            pga_tree_node pnode_tr = pnode_trans->parent->parent;
-            pnode_tr->op_type = GA_TRACE;
-            pnode_tr->init_vector_tensor(2);
-//            pnode_tr->test_function_type = order;
-//            pnode_tr->name_test1 = pnode_trans->name_test1;
-//            pnode_tr->name_test2 = pnode_trans->name_test2;
-          }
-        }
+       
+       std::string &tname = pnode->interpolate_name;
+       std::string expr_trans = 
+         workspace.interpolate_transformation(tname)->expression();
+       if (expr_trans.size() == 0)
+         GMM_ASSERT1(false, "Sorry, the gradient of tranformation "
+                     << tname << " cannot be calculated. "
+                     "The gradient computation is available only for "
+                     "transformations having an explicit expression");
+
+
+       // bool ivar = (pnode->name.compare(varname) == 0 &&
+        //              pnode->interpolate_name.compare(interpolatename) == 0);
+        // bool itrans = !ivar;
+        // if (!itrans) {
+        //   std::set<var_trans_pair> vars;
+        //   workspace.interpolate_transformation(pnode->interpolate_name)
+        //     ->extract_variables(workspace, vars, true, m,
+        //                         pnode->interpolate_name);
+        //   for (const var_trans_pair &var : vars) {
+        //     if (var.varname.compare(varname) == 0 &&
+        //         var.transname.compare(interpolatename) == 0)
+        //       itrans = true;
+        //   }
+        // }
+       
+       pga_tree_node pnode_trans = pnode;
+       tree.duplicate_with_operation(pnode_trans, GA_MULT);
+       pga_tree_node pnode_grad_trans = pnode_trans->parent->children[1];
+       
+       if (is_val) pnode_trans->node_type = GA_NODE_INTERPOLATE_GRAD;
+       if (is_grad) pnode_trans->node_type = GA_NODE_INTERPOLATE_HESS;
+       // if (is_diverg) ??;
+         
+       // Pour le Hessien, il s'agit vraiment d'une multiplication ? ou d'un 
"." ?
+
+       // Calcul et insertion du gradient de la transformation
+       
+//         if (ivar) {
+//           mi.resize(1); mi[0] = 2;
+//           for (size_type i = 0; i < pnode->tensor_order(); ++i)
+//             mi.push_back(pnode->tensor_proper_size(i));
+//           pnode->t.adjust_sizes(mi);
+//           if (is_val) // --> t(Qmult*ndof,Qmult*target_dim)
+//             pnode->node_type = GA_NODE_INTERPOLATE_VAL_TEST;
+//           else if (is_grad) // --> t(Qmult*ndof,Qmult*target_dim,N)
+//             pnode->node_type = GA_NODE_INTERPOLATE_GRAD_TEST;
+//           else if (is_hess) // --> t(Qmult*ndof,Qmult*target_dim,N,N)
+//             pnode->node_type = GA_NODE_INTERPOLATE_HESS_TEST;
+//           else if (is_diverg) // --> t(Qmult*ndof)
+//             pnode->node_type = GA_NODE_INTERPOLATE_DIVERG_TEST;
+//           pnode->test_function_type = order;
+//         }
+
+//         if (itrans) {
+//           const mesh_fem *mf = workspace.associated_mf(pnode_trans->name);
+//           size_type q = workspace.qdim(pnode_trans->name);
+//           size_type n = mf->linked_mesh().dim();
+//           bgeot::multi_index mii = workspace.qdims(pnode_trans->name);
+
+//           if (is_val)  // --> t(target_dim*Qmult,N)
+//             pnode_trans->node_type = GA_NODE_INTERPOLATE_GRAD;
+//           else if (is_grad || is_diverg)  // --> t(target_dim*Qmult,N,N)
+//             pnode_trans->node_type = GA_NODE_INTERPOLATE_HESS;
+
+//           if (n > 1) {
+//             if (q == 1 && mii.size() <= 1) { mii.resize(1); mii[0] = n; }
+//             else mii.push_back(n);
+
+//             if (is_grad || is_diverg) mii.push_back(n);
+//           }
+//           pnode_trans->t.adjust_sizes(mii);
+//           tree.duplicate_with_operation(pnode_trans,
+//                                         (n > 1) ? GA_DOT : GA_MULT);
+//           pga_tree_node pnode_der = pnode_trans->parent->children[1];
+//           pnode_der->node_type = GA_NODE_INTERPOLATE_DERIVATIVE;
+//           if (n == 1)
+//             pnode_der->init_vector_tensor(2);
+//           else
+//             pnode_der->init_matrix_tensor(2, n);
+//           pnode_der->test_function_type = order;
+//           pnode_der->name = varname;
+//           pnode_der->interpolate_name_der = pnode_der->interpolate_name;
+//           pnode_der->interpolate_name = interpolatename;
+
+//           if (is_diverg) { // --> t(Qmult*ndof)
+//             tree.insert_node(pnode_trans->parent, GA_NODE_OP);
+//             pga_tree_node pnode_tr = pnode_trans->parent->parent;
+//             pnode_tr->op_type = GA_TRACE;
+//             pnode_tr->init_vector_tensor(2);
+// //            pnode_tr->test_function_type = order;
+// //            pnode_tr->name_test1 = pnode_trans->name_test1;
+// //            pnode_tr->name_test2 = pnode_trans->name_test2;
+//           }
+//        }
       }
       break;
+  #ifdef continue_here
 
     case GA_NODE_INTERPOLATE_VAL_TEST:
     case GA_NODE_INTERPOLATE_GRAD_TEST:
@@ -3352,9 +3369,6 @@ namespace getfem {
       }
       break;
 
-    case GA_NODE_INTERPOLATE_HESS_TEST:
-      GMM_ASSERT1(false, "Sorry, cannot derive a hessian once more");
-      break;
 
     case GA_NODE_INTERPOLATE_X:
       {



reply via email to

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