getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r4688 - in /trunk/getfem/src: ./ getfem/


From: logari81
Subject: [Getfem-commits] r4688 - in /trunk/getfem/src: ./ getfem/
Date: Thu, 19 Jun 2014 07:40:15 -0000

Author: logari81
Date: Thu Jun 19 09:40:14 2014
New Revision: 4688

URL: http://svn.gna.org/viewcvs/getfem?rev=4688&view=rev
Log:
add optional support for frame indifferent relative velocity in large sliding 
contact

Modified:
    trunk/getfem/src/getfem/getfem_contact_and_friction_common.h
    trunk/getfem/src/getfem_contact_and_friction_common.cc
    trunk/getfem/src/getfem_contact_and_friction_integral.cc
    trunk/getfem/src/getfem_contact_and_friction_large_sliding.cc
    trunk/getfem/src/getfem_generic_assembly.cc

Modified: trunk/getfem/src/getfem/getfem_contact_and_friction_common.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_contact_and_friction_common.h?rev=4688&r1=4687&r2=4688&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_contact_and_friction_common.h        
(original)
+++ trunk/getfem/src/getfem/getfem_contact_and_friction_common.h        Thu Jun 
19 09:40:14 2014
@@ -401,6 +401,10 @@
                                   size_type ndof, size_type qdim, size_type N);
 
 
+  void compute_normal(const fem_interpolation_context &ctx, size_type face,
+                      bool in_reference_conf, const model_real_plain_vector 
&coeff,
+                      base_node &n0, base_node &n, base_matrix &grad);
+
   //=========================================================================
   //
   //  Structure which stores the contact boundaries, rigid obstacles and

Modified: trunk/getfem/src/getfem_contact_and_friction_common.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_contact_and_friction_common.cc?rev=4688&r1=4687&r2=4688&view=diff
==============================================================================
--- trunk/getfem/src/getfem_contact_and_friction_common.cc      (original)
+++ trunk/getfem/src/getfem_contact_and_friction_common.cc      Thu Jun 19 
09:40:14 2014
@@ -34,8 +34,8 @@
 
   void compute_normal(const fem_interpolation_context &ctx,
                       size_type face, bool in_reference_conf,
+                      const model_real_plain_vector &coeff,
                       base_node &n0, base_node &n,
-                      model_real_plain_vector &coeff,
                       base_matrix &grad) {
       n0 = bgeot::compute_normal(ctx, face);
       if (in_reference_conf) {
@@ -457,8 +457,7 @@
             }
 
             // unit normal vector computation
-            compute_normal(ctx, v.f(), ref_conf,
-                           n0, n, coeff, grad);
+            compute_normal(ctx, v.f(), ref_conf, coeff, n0, n, grad);
             n /= gmm::vect_norm2(n);
 
             if (on_fem_nodes && dof_already_interpolated[ind]) {
@@ -653,8 +652,7 @@
 
             // computation of unit normal vector if the vertex is on the face
             if (points_on_face[ip]) {
-              compute_normal(ctx, v.f(), ref_conf,
-                             n0, n, coeff, grad);
+              compute_normal(ctx, v.f(), ref_conf, coeff, n0, n, grad);
               n /= gmm::vect_norm2(n);
               n_mean += n;
               ++nb_pt_on_face;
@@ -1230,7 +1228,7 @@
 
         // compute the unit normal vector at y and the signed distance.
         base_small_vector ny0(N);
-        compute_normal(ctx, iff, ref_conf, ny0, ny, coeff, grad);
+        compute_normal(ctx, iff, ref_conf, coeff, ny0, ny, grad);
         // ny /= gmm::vect_norm2(ny); // Useful only if the unit normal is kept
         signed_dist *= gmm::sgn(gmm::vect_sp(x - y, ny));
 

Modified: trunk/getfem/src/getfem_contact_and_friction_integral.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_contact_and_friction_integral.cc?rev=4688&r1=4687&r2=4688&view=diff
==============================================================================
--- trunk/getfem/src/getfem_contact_and_friction_integral.cc    (original)
+++ trunk/getfem/src/getfem_contact_and_friction_integral.cc    Thu Jun 19 
09:40:14 2014
@@ -490,7 +490,7 @@
             zt = (V - un1 * no) * (r * alpha) - zt;          // = zt1 - zt2 , 
with zt = r*alpha*u_T
           }
         }
-        un = un1 - un; // = un1 - unp1
+        un = un1 - un; // = un1 - un2
       }
       break;
 

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=4688&r1=4687&r2=4688&view=diff
==============================================================================
--- trunk/getfem/src/getfem_contact_and_friction_large_sliding.cc       
(original)
+++ trunk/getfem/src/getfem_contact_and_friction_large_sliding.cc       Thu Jun 
19 09:40:14 2014
@@ -246,6 +246,7 @@
   // For the moment, with raytrace detection and integral unsymmetric
   // Alart-Curnier augmented Lagrangian
 
+#undef CONSIDER_FRAME_INDIFFERENCE
 
   struct integral_large_sliding_contact_brick : public virtual_brick {
 
@@ -397,7 +398,7 @@
       GMM_ASSERT1(!isrigid(), "Rigid obstacle master node: no fem defined");
       if (!ctx_uy_init) {
         bgeot::vectors_to_base_matrix(Gy, meshy().points_of_convex(cvy_));
-        ctx_uy_ = fem_interpolation_context(pgty, pf_uy, y_ref(), Gy, cvy_,fy);
+        ctx_uy_ = fem_interpolation_context(pgty, pf_uy, y_ref(), Gy, cvy_, 
fy);
         ctx_uy_init = true;
       }
       return ctx_uy_;
@@ -544,8 +545,8 @@
     }
 
     scalar_type alpha;
-    base_small_vector x0_, y0_, Vs_;
-    bool x0_init, y0_init, Vs_init;
+    base_small_vector x0_, y0_, nx0_, Vs_;
+    bool x0_init, y0_init, nx0_init, Vs_init;
     base_matrix grad_phiy0_;
     bool grad_phiy0_init;
 
@@ -556,7 +557,7 @@
           pfem pf = ctx_ux().pf();
           slice_vector_on_basic_dof_of_element(*mf_ux_, all_x0, cvx_, coeff);
           pf->interpolation(ctx_ux(), coeff, x0_, dim_type(N));
-        }  else gmm::clear(x0_);
+        } else gmm::clear(x0_);
         gmm::add(ctx_ux().xreal(), x0_);
         x0_init = true;
       }
@@ -571,7 +572,7 @@
             pfem pf = ctx_uy().pf();
             slice_vector_on_basic_dof_of_element(*mf_uy_, all_y0, cvy_, coeff);
             pf->interpolation(ctx_uy(), coeff, y0_, dim_type(N));
-          }  else gmm::clear(y0_);
+          } else gmm::clear(y0_);
           gmm::add(ctx_uy().xreal(), y0_);
         } else gmm::copy(y(), y0_);
         y0_init = true;
@@ -579,12 +580,33 @@
       return y0_;
     }
 
+    const base_small_vector &nx0(void) {
+      if (!nx0_init) {
+        const model_real_plain_vector &all_x0 = mcf.disp0_of_boundary(ibx);
+        if (all_x0.size()) {
+          pfem pf = ctx_ux().pf();
+          slice_vector_on_basic_dof_of_element(*mf_ux_, all_x0, cvx_, coeff);
+          base_small_vector nx00_(N);
+          base_matrix grad_phix0_(N,N);
+          compute_normal(ctx_ux(), fx, false, coeff, nx00_, nx0_, grad_phix0_);
+          nx0_ /= gmm::vect_norm2(nx0_);
+        } else gmm::clear(nx0_);
+        nx0_init = true;
+      }
+      return nx0_;
+    }
+
     const base_small_vector &Vs(void) { // relative velocity
       if (!Vs_init) {
         if (alpha != scalar_type(0)) {
+#ifdef CONSIDER_FRAME_INDIFFERENCE
+          gmm::add(y0(), gmm::scaled(x0(), scalar_type(-1)), Vs_);
+          gmm::add(gmm::scaled(nx0(), -g()), Vs_);
+#else
           gmm::add(x(), gmm::scaled(y(), scalar_type(-1)), Vs_);
           gmm::add(gmm::scaled(x0(), scalar_type(-1)), Vs_);
           gmm::add(y0(), Vs_);
+#endif
           gmm::scale(Vs_, alpha);
         } else gmm::clear(Vs_);
         Vs_init = true;
@@ -680,7 +702,7 @@
       lambda_x_(N), lambda_y_(N),
       grad_phix_(N, N), grad_phix_inv_(N, N),
       grad_phiy_(N, N), grad_phiy_inv_(N, N), alpha(alpha_),
-      x0_(N), y0_(N), Vs_(N), grad_phiy0_(N, N), un(N) {}
+      x0_(N), y0_(N), nx0_(N), Vs_(N), grad_phiy0_(N, N), un(N) {}
 
   };
 
@@ -978,7 +1000,7 @@
         // second sub term
         gmm::mult(gpp.I_nxnx(), gmm::scaled(ny, -g), auxN1);
         gmm::mult(gpp.grad_phix_inv(), auxN1, auxN2);
-        gmm::mult_add(graddeltaunx, auxN2, auxUX);
+        gmm::mult_add(graddeltaunx, auxN2, auxUX);    // auxUX -> \delta u(X) 
- g Dn_x
         gmm::rank_one_update(Melem, deltamudgF,  auxUX);
         gmm::scale(Melem, weight*FMULT);
         mat_elem_assembly(M, I_lx, I_ux, Melem, *mf_lx, cvx, *mf_ux, cvx);
@@ -987,7 +1009,7 @@
           // LXUY term
           // third sub term
           gmm::resize(Melem, ndof_lx, ndof_uy); gmm::clear(Melem);
-          gmm::mult(gpp.vbase_uy(), ny, auxUY);
+          gmm::mult(gpp.vbase_uy(), ny, auxUY);       // auxUY -> \delta u(Y)
           gmm::rank_one_update(Melem, deltamudgF, auxUY);
           gmm::scale(Melem, -weight*FMULT);
           mat_elem_assembly(M, I_lx, I_uy, Melem, *mf_lx, cvx, *mf_uy, cvy);
@@ -997,6 +1019,40 @@
           // Term -(1/r) d_Vs F \delta Vs\delta\mu
 
           if (!isrigid) {
+#ifdef CONSIDER_FRAME_INDIFFERENCE
+            base_matrix gphiy0gphiyinv(N, N);
+            gmm::mult(gpp.grad_phiy0(), gpp.grad_phiy_inv(), gphiy0gphiyinv);
+            gmm::mult(gphiy0gphiyinv, gpp.I_nxny(), auxNN1);
+            gmm::rank_one_update(auxNN1, gpp.nx0(),
+                                 
gmm::scaled(gpp.ny(),scalar_type(1)/gpp.nxdotny()));
+            gmm::mult(dVsF, auxNN1, auxNN2);
+            // Caution: auxNN2 re-used in the second sub term
+
+            // LXUX term
+            // first sub term
+            gmm::resize(Melem, ndof_lx, ndof_ux); gmm::clear(Melem);
+            gmm::mult(gpp.vbase_lx(), gmm::transposed(auxNN2), auxLXN1);
+            // Caution: auxLXN1 re-used in the third sub term
+            gmm::mult(auxLXN1, gmm::transposed(gpp.vbase_ux()), Melem);
+
+            // second sub term
+            base_matrix auxLXUX(ndof_lx, ndof_ux);
+            gmm::mult(auxNN2, gpp.I_nxnx(), auxNN1);
+            gmm::mult(auxNN1, gmm::transposed(gpp.grad_phix_inv()), auxNN2);
+            gmm::mult(gpp.vbase_lx(), gmm::transposed(auxNN2), auxLXN2);
+            gmm::mult(auxLXN2, gmm::transposed(graddeltaunx), auxLXUX);
+            gmm::scale(auxLXUX, -g);
+            gmm::add(auxLXUX, Melem);
+            gmm::scale(Melem, -weight*alpha*FMULT/r);
+            mat_elem_assembly(M, I_lx, I_ux, Melem, *mf_lx, cvx, *mf_ux, cvx);
+
+            // LXUY term
+            // third sub term
+            gmm::resize(Melem, ndof_lx, ndof_uy); gmm::clear(Melem);
+            // Caution: auxLXN1 re-used
+            gmm::mult(auxLXN1, gmm::transposed(gpp.vbase_uy()), Melem);
+            gmm::scale(Melem, weight*alpha*FMULT/r);
+#else
             base_matrix I_gphiy0gphiyinv(N, N);
             gmm::mult(gmm::scaled(gpp.grad_phiy0(), scalar_type(-1)),
                       gpp.grad_phiy_inv(), I_gphiy0gphiyinv);
@@ -1027,14 +1083,11 @@
             // LXUY term
             // third sub term
             gmm::resize(Melem, ndof_lx, ndof_uy); gmm::clear(Melem);
-//             gmm::mult(I_gphiy0gphiyinv, gpp.I_nxny(), auxNN1);
-//             for (size_type j = 0; j < N; ++j) auxNN1(j,j) -= scalar_type(1);
-//             gmm::mult(dVsF, auxNN1, auxNN2);
-//             gmm::mult(gpp.vbase_lx(), gmm::transposed(auxNN2), auxLXN2);
             // Caution: auxLXN2 re-used
             gmm::mult(auxLXN2, gmm::transposed(gpp.vbase_uy()), Melem);
             gmm::scale(Melem, -weight*alpha*FMULT/r);
             mat_elem_assembly(M, I_lx, I_uy, Melem, *mf_lx, cvx, *mf_uy, cvy);
+#endif
           } else {
             // LXUX term
             gmm::mult(gpp.vbase_lx(), gmm::transposed(dVsF), auxLXN1);

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=4688&r1=4687&r2=4688&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Thu Jun 19 09:40:14 2014
@@ -335,7 +335,7 @@
       if (test0 && test1 && (test0 == test1 ||
                              test0 >= 3 || test1 >= 3))
         ga_throw_error(expr, pos, "Incompatibility of test functions "
-                        " in product.");
+                        "in product.");
       GMM_ASSERT1(test0 != size_type(-1) && test1 != size_type(-1),
                   "internal error");
 




reply via email to

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