getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r4758 - in /trunk/getfem: interface/src/ src/ src/getfe


From: logari81
Subject: [Getfem-commits] r4758 - in /trunk/getfem: interface/src/ src/ src/getfem/
Date: Wed, 27 Aug 2014 07:21:13 -0000

Author: logari81
Date: Wed Aug 27 09:21:12 2014
New Revision: 4758

URL: http://svn.gna.org/viewcvs/getfem?rev=4758&view=rev
Log:
add frame indifferent sliding velocity option in new large sliding contact 
brick (naive implementation)

Modified:
    trunk/getfem/interface/src/gf_model_set.cc
    trunk/getfem/src/getfem/getfem_contact_and_friction_large_sliding.h
    trunk/getfem/src/getfem_contact_and_friction_large_sliding.cc

Modified: trunk/getfem/interface/src/gf_model_set.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/interface/src/gf_model_set.cc?rev=4758&r1=4757&r2=4758&view=diff
==============================================================================
--- trunk/getfem/interface/src/gf_model_set.cc  (original)
+++ trunk/getfem/interface/src/gf_model_set.cc  Wed Aug 27 09:21:12 2014
@@ -2968,7 +2968,7 @@
       (not fully symmetric even without friction). @*/
 
      sub_command
-       ("add integral large sliding contact brick raytracing", 2, 5, 0, 1,
+       ("add integral large sliding contact brick raytracing", 2, 6, 0, 1,
         
         std::string dataname_r = in.pop().to_string();
         scalar_type d = in.pop().to_scalar();
@@ -2980,10 +2980,13 @@
         if (dataname_alpha.size() == 0) dataname_alpha = "1";
         bool sym_v = false;
         if (in.remaining()) sym_v = (in.pop().to_integer() != 0);
+        bool frame_indifferent = false;
+        if (in.remaining()) frame_indifferent = (in.pop().to_integer() != 0);
 
         size_type  ind
         = getfem::add_integral_large_sliding_contact_brick_raytracing
-        (md->model(), dataname_r, d, dataname_fr, dataname_alpha, sym_v);
+        (md->model(), dataname_r, d, dataname_fr, dataname_alpha, sym_v,
+         frame_indifferent);
         out.pop().from_integer(int(ind + config::base_index()));
         );
 
@@ -3045,7 +3048,7 @@
       (allowing the self-contact). @*/
     sub_command
       ("add master slave contact boundary to large sliding contact brick",
-       4, 5, 0, 0,
+       5, 6, 0, 0,
        size_type ind = in.pop().to_integer() - config::base_index();
        getfemint_mesh_im *gfi_mim = in.pop().to_getfemint_mesh_im();
        size_type region = in.pop().to_integer();

Modified: trunk/getfem/src/getfem/getfem_contact_and_friction_large_sliding.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_contact_and_friction_large_sliding.h?rev=4758&r1=4757&r2=4758&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_contact_and_friction_large_sliding.h 
(original)
+++ trunk/getfem/src/getfem/getfem_contact_and_friction_large_sliding.h Wed Aug 
27 09:21:12 2014
@@ -58,8 +58,9 @@
   */
   size_type add_integral_large_sliding_contact_brick_raytracing
   (model &md, const std::string &augm_param,
-  scalar_type release_distance, const std::string &f_coeff = "0",
-   const std::string &alpha = "1", bool sym_v = false);
+   scalar_type release_distance, const std::string &f_coeff = "0",
+   const std::string &alpha = "1",
+   bool sym_v = false, bool frame_indifferent = false);
 
   /** Adds a contact boundary to an existing large sliding contact
       with friction brick. When a boundary is declared slave, a multiplier

Modified: trunk/getfem/src/getfem_contact_and_friction_large_sliding.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_contact_and_friction_large_sliding.cc?rev=4758&r1=4757&r2=4758&view=diff
==============================================================================
--- trunk/getfem/src/getfem_contact_and_friction_large_sliding.cc       
(original)
+++ trunk/getfem/src/getfem_contact_and_friction_large_sliding.cc       Wed Aug 
27 09:21:12 2014
@@ -1411,8 +1411,7 @@
           (G, mfu.linked_mesh().points_of_convex(cv));
 
         pfem_precomp pfp = fppool(pf_s, &(pgt->geometric_nodes()));
-        fem_interpolation_context ctx(pgt, pfp, size_type(-1), G, cv,
-                                      short_type(-1));
+        fem_interpolation_context ctx(pgt, pfp, size_type(-1), G, cv);
 
         size_type nb_pt_on_face = 0;
         gmm::clear(n_mean);
@@ -2312,7 +2311,7 @@
     model::varnamelist vl, dl;
     model::mimlist ml;
 
-    bool sym_version;
+    bool sym_version, frame_indifferent;
 
     void add_contact_boundary(model &md, const mesh_im &mim, size_type region,
                               bool is_master, bool is_slave,
@@ -2367,34 +2366,44 @@
       cb.is_slave = is_slave;
       cb.mim = &mim;
       if (is_slave) {
+        std::string n, n0, Vs, g, Y;
+        n = "Transformed_unit_vector(Grad_"+u+", Normal)";
+        n0 = "Transformed_unit_vector(Grad_"+w+", Normal)";
+
         // Coulomb_friction_coupled_projection(lambda,
         //    Transformed_unit_vector(Grad_u, Normal),
         //    (u-Interpolate(ug,trans)-(w-Interpolate(wg,trans)))*alpha,
         //    (Interpolate(X,trans)+Interpolate(ug,trans)-X-u).
         //      Transformed_unit_vector(Grad_u, Normal), f, r)
+        Y = "Interpolate(X,"+transformation_name+")";
+        g = 
"("+Y+"+Interpolate("+u_group+","+transformation_name+")-X-"+u+")."+n;
+        Vs = "("+u+"-Interpolate("+u_group+","+transformation_name+")";
+        if (w.size()) {
+          Vs += "-"+w+"+Interpolate("+w_group+","+transformation_name+")";
+          if (frame_indifferent)
+            Vs += "+("+g+")*("+n+"-"+n0+")";
+        }
+        Vs  += ")*"+alpha;
+
         std::string coupled_projection_def =
           "Coulomb_friction_coupled_projection("
-          + lambda+", Transformed_unit_vector(Grad_"+u+", Normal),"
-          + "("+u+"-Interpolate("+u_group+","+transformation_name+")"
-          + (w.size() 
-             ? ("-"+w+"+Interpolate("+w_group+","+transformation_name+")")
-             : "")
-          +")*"+alpha+","
-          + "(Interpolate(X,"+transformation_name+")+Interpolate("+u_group+","
-          + transformation_name+")-X-"+u+").Transformed_unit_vector(Grad_"
-          + u+", Normal),"+friction_coeff+","+augmentation_param+")";
+          + lambda+","+n+","+Vs+","+g+","+friction_coeff+","
+          + augmentation_param+")";
 
         // Coulomb_friction_coupled_projection(lambda,
         //   Transformed_unit_vector(Grad_u, Normal), (u-w)*alpha,
         //   (Interpolate(X,trans)-X-u).Transformed_unit_vector(Grad_u,
         //                                                      Normal), f, r)
+        g = "(Interpolate(X,"+transformation_name+")-X-"+u+")."+n;
+        if (frame_indifferent && w.size())
+          Vs = "("+u+"-"+w+"+"+g+"*("+n+"-"+n0+"))*"+alpha;
+        else
+          Vs = "("+u+(w.size() ? ("-"+w):"")+")*"+alpha;
+
         std::string coupled_projection_rig =
           "Coulomb_friction_coupled_projection("
-          + lambda+", Transformed_unit_vector(Grad_"+u+", Normal),"
-          + "("+u+(w.size() ? ("-"+w):"")+")*"+alpha
-          + ",(Interpolate(X,"+transformation_name+")-X-"+u
-          + ").Transformed_unit_vector(Grad_"+u+", Normal),"
-          + friction_coeff+","+augmentation_param+")";
+          + lambda+","+n+","+Vs+","+g+","+ friction_coeff+","
+          + augmentation_param+")";
 
         cb.expr =
           // -lambda.Test_u for non-symmetric version
@@ -2466,13 +2475,15 @@
     (const std::string &r,
      const std::string &f_coeff,const std::string &ug,
      const std::string &wg, const std::string &tr,
-     const std::string &alpha_ = "1", bool sym_v = false) {
-      sym_version = sym_v;
+     const std::string &alpha_ = "1", bool sym_v = false,
+     bool frame_indiff = false) {
       transformation_name = tr;
       u_group = ug; w_group = wg;
       friction_coeff = f_coeff;
       alpha = alpha_;
       augmentation_param = r;
+      sym_version = sym_v;
+      frame_indifferent = frame_indiff;
       
       set_flags("Integral large sliding contact bick raytracing",
                 false /* is linear*/,
@@ -2588,7 +2599,7 @@
   size_type add_integral_large_sliding_contact_brick_raytracing
   (model &md, const std::string &augm_param,
    scalar_type release_distance, const std::string &f_coeff, 
-   const std::string &alpha, bool sym_v) {
+   const std::string &alpha, bool sym_v, bool frame_indifferent) {
 
     char ugroupname[50], wgroupname[50], transname[50];
     for (int i = 0; i < 10000; ++i) {
@@ -2621,7 +2632,8 @@
     
     intergral_large_sliding_contact_brick_raytracing *p
       = new intergral_large_sliding_contact_brick_raytracing
-      (augm_param, f_coeff, ugroupname, wgroupname, transname, alpha, sym_v);
+      (augm_param, f_coeff, ugroupname, wgroupname, transname, alpha,
+       sym_v, frame_indifferent);
     pbrick pbr = p;
     p->dl = dl;
 




reply via email to

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