Unilateral constraints
  Description
Collaboration diagram for Unilateral constraints:

| Classes | |
| class | chrono::ChConstraintBilateral | 
| Bilateral (joint) constraints.  More... | |
| class | chrono::ChConstraintRigidRigid | 
| Unilateral (contact) constraints.  More... | |
| Macros | |
| #define | NORMAL_J | 
| #define | SLIDING_J | 
| #define | Loop_Over_Rigid_Neighbors(X) | 
| #define | Loop_Over_Fluid_Neighbors(X) | 
| Functions | |
| CH_PARALLEL_API void | chrono::Orthogonalize (real3 &Vx, real3 &Vy, real3 &Vz) | 
| CH_PARALLEL_API void | chrono::Compute_Jacobian (const quaternion &quat, const real3 &U, const real3 &V, const real3 &W, const real3 &point, real3 &T1, real3 &T2, real3 &T3) | 
| CH_PARALLEL_API void | chrono::Compute_Jacobian_Rolling (const quaternion &quat, const real3 &U, const real3 &V, const real3 &W, real3 &T1, real3 &T2, real3 &T3) | 
| CH_PARALLEL_API bool | chrono::Cone_generalized_rigid (real &gamma_n, real &gamma_u, real &gamma_v, real mu) | 
| CH_PARALLEL_API bool | chrono::Cone_single_rigid (real &gamma_n, real &gamma_s, real mu) | 
| CH_PARALLEL_API void | chrono::AppendRigidFluidBoundary (const real contact_mu, const uint num_fluid_bodies, const uint body_offset, const uint start_boundary, ChParallelDataManager *data_manager) | 
| CH_PARALLEL_API void | chrono::ProjectRigidFluidBoundary (const real contact_mu, const real contact_cohesion, const uint num_fluid_bodies, const uint start_boundary, real *gamma, ChParallelDataManager *data_manager) | 
| CH_PARALLEL_API void | chrono::ComplianceRigidFluidBoundary (const real contact_mu, const real contact_compliance, const real alpha, const uint start_boundary, ChParallelDataManager *data_manager) | 
| CH_PARALLEL_API void | chrono::CorrectionRigidFluidBoundary (const real contact_mu, const real contact_cohesion, const real alpha, const real contact_recovery_speed, const uint num_fluid_bodies, const uint start_boundary, ChParallelDataManager *data_manager) | 
| CH_PARALLEL_API void | chrono::BuildRigidFluidBoundary (const real contact_mu, const uint num_fluid_bodies, const uint body_offset, const uint start_boundary, ChParallelDataManager *data_manager) | 
Macro Definition Documentation
◆ Loop_Over_Fluid_Neighbors
| #define Loop_Over_Fluid_Neighbors | ( | X | ) | 
Value:
for (int body_a = 0; body_a < (signed)num_fluid_bodies; body_a++) {                          \
        real3 pos_p = sorted_pos[body_a];                                                        \
        for (int i = 0; i < data_manager->host_data.c_counts_3dof_3dof[body_a]; i++) {           \
            int body_b = data_manager->host_data.neighbor_3dof_3dof[body_a * max_neighbors + i]; \
            if (body_a == body_b) {                                                              \
                continue;                                                                        \
            }                                                                                    \
            if (body_a > body_b) {                                                               \
                continue;                                                                        \
            }                                                                                    \
            real3 xij = pos_p - sorted_pos[body_b];                                              \
            X;                                                                                   \
            index++;                                                                             \
        }                                                                                        \
    }
◆ Loop_Over_Rigid_Neighbors
| #define Loop_Over_Rigid_Neighbors | ( | X | ) | 
Value:
for (int p = 0; p < (signed)num_fluid_bodies; p++) { \
        int start = contact_counts[p];                   \
        int end = contact_counts[p + 1];                 \
        for (int index = start; index < end; index++) {  \
            int i = index - start;                       \
            X                                            \
        }                                                \
    }
◆ NORMAL_J
| #define NORMAL_J | 
Value:
real3 U_A = Rotate(U, q_a); \
    T3 = Cross(U_A, sbar_a.v);  \
    real3 U_B = Rotate(U, q_b); \
    T6 = Cross(U_B, sbar_b.v);
◆ SLIDING_J
| #define SLIDING_J | 
Value:
real3 V_A = Rotate(V, q_a); \
    real3 W_A = Rotate(W, q_a); \
    T4 = Cross(V_A, sbar_a.v);  \
    T5 = Cross(W_A, sbar_a.v);  \
                                \
    real3 V_B = Rotate(V, q_b); \
    real3 W_B = Rotate(W, q_b); \
    T7 = Cross(V_B, sbar_b.v);  \
    T8 = Cross(W_B, sbar_b.v);
