getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r4706 - in /trunk/getfem: interface/src/gf_model_get.cc


From: logari81
Subject: [Getfem-commits] r4706 - in /trunk/getfem: interface/src/gf_model_get.cc src/getfem/getfem_generic_assembly.h src/getfem_generic_assembly.cc
Date: Wed, 09 Jul 2014 14:20:13 -0000

Author: logari81
Date: Wed Jul  9 16:20:13 2014
New Revision: 4706

URL: http://svn.gna.org/viewcvs/getfem?rev=4706&view=rev
Log:
improve interface for interpolation of generic assembly expressions onto a set 
of points

Modified:
    trunk/getfem/interface/src/gf_model_get.cc
    trunk/getfem/src/getfem/getfem_generic_assembly.h
    trunk/getfem/src/getfem_generic_assembly.cc

Modified: trunk/getfem/interface/src/gf_model_get.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/interface/src/gf_model_get.cc?rev=4706&r1=4705&r2=4706&view=diff
==============================================================================
--- trunk/getfem/interface/src/gf_model_get.cc  (original)
+++ trunk/getfem/interface/src/gf_model_get.cc  Wed Jul  9 16:20:13 2014
@@ -197,21 +197,47 @@
        );
 
 
-    /address@hidden V = ('interpolation', @str expr, @tmf mf[, @int region])
-      Interpolate a certain expression relatively to the mesh_fem `mf`.
-      The expression have to be a valid expression in the sense of the
-      high-level generic assembly with authorised references to the variables
-      and data of the model. @*/
-    sub_command
-      ("interpolation", 2, 3, 0, 1, // should be extended to complex models ...
+    /address@hidden V = ('interpolation', @str expr, address@hidden mf | @vec 
pts,  @tmesh m}[, @int region[, @int extrapolation[, @int rg_source]]])
+      Interpolate a certain expression with respect to the mesh_fem `mf`
+      or the set of points `pts` on mesh `m`.
+      The expression has to be valid according to the high-level generic
+      assembly language possibly including references to the variables
+      and data of the model.
+  
+      The options `extrapolation` and `rg_source` are specific to
+      interpolations with respect to a set of points `pts`. @*/
+    sub_command
+      ("interpolation", 2, 6, 0, 1, // should be extended to complex models ...
        std::string expr = in.pop().to_string();
-       getfemint_mesh_fem *gfi_mf = in.pop().to_getfemint_mesh_fem();
-       
-       size_type rg = size_type(-1);
-       if (in.remaining()) rg = in.pop().to_integer();
        getfem::base_vector result;
-       getfem::ga_interpolation_Lagrange_fem(md->model(), expr,
-                                             gfi_mf->mesh_fem(), result, rg);
+       if (in.front().is_mesh_fem()) {
+         getfemint_mesh_fem *gfi_mf = in.pop().to_getfemint_mesh_fem();
+
+         size_type rg = in.remaining() ? in.pop().to_integer()
+                                       : size_type(-1);
+         getfem::ga_interpolation_Lagrange_fem(md->model(), expr,
+                                               gfi_mf->mesh_fem(), result, rg);
+       } else {
+         darray st = in.pop().to_darray();
+         std::vector<double> PTS(st.begin(), st.end());
+         const getfem::mesh *m = in.pop().to_const_mesh();
+         size_type N = m->dim();
+         size_type nbpoints = gmm::vect_size(PTS) / N;
+         getfem::base_node p(N);
+         getfem::mesh_trans_inv mti(*m);
+         for (size_type i = 0; i < nbpoints; ++i) {
+           gmm::copy(gmm::sub_vector(PTS, gmm::sub_interval(i*N, N)), p);
+           mti.add_point(p);
+         }
+         size_type rg = in.remaining() ? in.pop().to_integer()
+                                       : size_type(-1);
+         int extrapolation = in.remaining() ? in.pop().to_integer()
+                                            : size_type(0);
+         size_type rg_source = in.remaining() ? in.pop().to_integer()
+                                              : size_type(-1);
+         getfem::ga_interpolation_mti(md->model(), expr, mti,
+                                      result, rg, extrapolation, rg_source);
+       }
        out.pop().from_dcvector(result);
        );
     

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=4706&r1=4705&r2=4706&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_generic_assembly.h   (original)
+++ trunk/getfem/src/getfem/getfem_generic_assembly.h   Wed Jul  9 16:20:13 2014
@@ -548,8 +548,8 @@
   // Not tested
   void ga_interpolation_mti
   (const getfem::model &md, const std::string &expr, mesh_trans_inv &mti,
-   base_vector &result, int extrapolation = 0,
-   const mesh_region &rg=mesh_region::all_convexes(),
+   base_vector &result, const mesh_region &rg=mesh_region::all_convexes(),
+   int extrapolation = 0, const mesh_region 
&rg_source=mesh_region::all_convexes(),
    size_type nbdof_ = size_type(-1));
 
   // Not tested

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=4706&r1=4705&r2=4706&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Wed Jul  9 16:20:13 2014
@@ -8464,10 +8464,11 @@
     virtual const mesh &linked_mesh(void) { return mti.linked_mesh(); }
 
     ga_interpolation_context_mti(mesh_trans_inv &mti_, base_vector &r,
-                                 int extrapolation, const mesh_region &rg,
+                                 int extrapolation,
+                                 const mesh_region &rg_source,
                                  size_type nbdof_ = size_type(-1))
       : result(r), mti(mti_), initialized(false), nbdof(nbdof_) {
-      mti.distribute(extrapolation, rg);
+      mti.distribute(extrapolation, rg_source);
       if (nbdof == size_type(-1)) nbdof = mti.nb_points();
     }
   };
@@ -8476,13 +8477,13 @@
   // To be parallelized ...
   void ga_interpolation_mti
   (const getfem::model &md, const std::string &expr, mesh_trans_inv &mti,
-   base_vector &result, int extrapolation, const mesh_region &rg,
-   size_type nbdof) {
+   base_vector &result, const mesh_region &rg, int extrapolation,
+   const mesh_region &rg_source, size_type nbdof) {
 
     ga_workspace workspace(md);
     workspace.add_interpolation_expression(expr, mti.linked_mesh(), rg);
     
-    ga_interpolation_context_mti gic(mti, result, extrapolation, rg, nbdof);
+    ga_interpolation_context_mti gic(mti, result, extrapolation, rg_source, 
nbdof);
     ga_interpolation(workspace, gic);
   }
 




reply via email to

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