3030#ifndef CONSTRAINT_DYNAMICS_H
3131#define CONSTRAINT_DYNAMICS_H
3232
33- #include " all_body_relations.h"
3433#include " all_particle_dynamics.h"
3534#include " all_simbody.h"
3635#include " base_kernel.h"
3736#include " elastic_solid.h"
37+ #include " general_constraint.h"
3838#include " general_reduce.h"
3939#include " solid_body.h"
4040#include " solid_particles.h"
@@ -49,57 +49,11 @@ namespace solid_dynamics
4949typedef DataDelegateSimple<SolidParticles> SolidDataSimple;
5050typedef DataDelegateInner<SolidParticles> SolidDataInner;
5151
52- /* *
53- * @class BaseMotionConstraint
54- * @brief Base class for constraining with prescribed motion.
55- * Exact motion function will be defined in derive class.
56- * Note that, we do not impose acceleration, so that this constraint
57- * must be imposed after updating particle velocity by forces
58- * and before updating particle position.
59- * TODO: to clarify the treatment of particle position,
60- * how to achieve consistency between velocity and position constraints.
61- */
62- template <class DynamicsIdentifier , class DataDelegationType >
63- class BaseMotionConstraint : public BaseLocalDynamics <DynamicsIdentifier>, public DataDelegationType
64- {
65- public:
66- explicit BaseMotionConstraint (DynamicsIdentifier &identifier)
67- : BaseLocalDynamics<DynamicsIdentifier>(identifier), DataDelegationType(identifier.getSPHBody()),
68- pos_(this ->particles_->pos_), pos0_(this ->particles_->pos0_),
69- n_(this ->particles_->n_), n0_(this ->particles_->n0_),
70- vel_(this ->particles_->vel_), force_(this ->particles_->force_), mass_(this ->particles_->mass_){};
71-
72- virtual ~BaseMotionConstraint (){};
73-
74- protected:
75- StdLargeVec<Vecd> &pos_, &pos0_;
76- StdLargeVec<Vecd> &n_, &n0_;
77- StdLargeVec<Vecd> &vel_, &force_;
78- StdLargeVec<Real> &mass_;
79- };
80- using MotionConstraint = BaseMotionConstraint<BodyPartByParticle, SolidDataSimple>;
81-
82- /* *@class FixConstraint
83- * @brief Constraint with zero velocity.
84- */
85- template <class DynamicsIdentifier , class DataDelegationType >
86- class FixConstraint : public BaseMotionConstraint <DynamicsIdentifier, DataDelegationType>
87- {
88- public:
89- explicit FixConstraint (DynamicsIdentifier &identifier)
90- : BaseMotionConstraint<DynamicsIdentifier, DataDelegationType>(identifier){};
91- virtual ~FixConstraint (){};
92-
93- void update (size_t index_i, Real dt = 0.0 ) { this ->vel_ [index_i] = Vecd::Zero (); };
94- };
95- using FixBodyConstraint = FixConstraint<SPHBody, SolidDataSimple>;
96- using FixBodyPartConstraint = FixConstraint<BodyPartByParticle, SolidDataSimple>;
97-
9852/* *@class SpringConstrain
9953 * @brief Constrain with a spring for each constrained particles to its original position.
10054 * //TODO: a test case is required for this class.
10155 */
102- class SpringConstrain : public BaseMotionConstraint <BodyPartByParticle, SolidDataSimple >
56+ class SpringConstrain : public MotionConstraint <BodyPartByParticle>
10357{
10458 public:
10559 SpringConstrain (BodyPartByParticle &body_part, Real stiffness);
@@ -109,6 +63,7 @@ class SpringConstrain : public BaseMotionConstraint<BodyPartByParticle, SolidDat
10963
11064 protected:
11165 Vecd stiffness_;
66+ StdLargeVec<Real> &mass_;
11267 virtual Vecd getAcceleration (Vecd &disp, Real mass);
11368};
11469
@@ -118,7 +73,7 @@ class SpringConstrain : public BaseMotionConstraint<BodyPartByParticle, SolidDat
11873 * can be considered as a quasi-static position driven boundary condition.
11974 * Note that, this constraint is not for a elastic solid body.
12075 */
121- class PositionSolidBody : public BaseMotionConstraint <SPHBody, SolidDataSimple >
76+ class PositionSolidBody : public MotionConstraint <SPHBody>
12277{
12378 public:
12479 PositionSolidBody (SPHBody &sph_body, Real start_time, Real end_time, Vecd pos_end_center);
@@ -139,7 +94,7 @@ class PositionSolidBody : public BaseMotionConstraint<SPHBody, SolidDataSimple>
13994 * can be considered as a quasi-static position driven boundary condition.
14095 * Note that, this constraint is not for a elastic solid body.
14196 */
142- class PositionScaleSolidBody : public BaseMotionConstraint <SPHBody, SolidDataSimple >
97+ class PositionScaleSolidBody : public MotionConstraint <SPHBody>
14398{
14499 public:
145100 PositionScaleSolidBody (SPHBody &sph_body, Real start_time, Real end_time, Real end_scale);
@@ -161,11 +116,11 @@ class PositionScaleSolidBody : public BaseMotionConstraint<SPHBody, SolidDataSim
161116 * Note that, this constraint is not for a elastic solid body.
162117 */
163118template <class DynamicsIdentifier >
164- class PositionTranslate : public BaseMotionConstraint <DynamicsIdentifier, SolidDataSimple >
119+ class PositionTranslate : public MotionConstraint <DynamicsIdentifier>
165120{
166121 public:
167122 PositionTranslate (DynamicsIdentifier &identifier, Real start_time, Real end_time, Vecd translation)
168- : BaseMotionConstraint <DynamicsIdentifier, SolidDataSimple >(identifier),
123+ : MotionConstraint <DynamicsIdentifier>(identifier),
169124 start_time_ (start_time), end_time_(end_time), translation_(translation){};
170125 virtual ~PositionTranslate (){};
171126 void update (size_t index_i, Real dt = 0.0 )
@@ -192,37 +147,11 @@ class PositionTranslate : public BaseMotionConstraint<DynamicsIdentifier, SolidD
192147using TranslateSolidBody = PositionTranslate<SPHBody>;
193148using TranslateSolidBodyPart = PositionTranslate<BodyPartByParticle>;
194149
195- /* *
196- * @class FixedInAxisDirection
197- * @brief Constrain the velocity of a solid body part.
198- */
199- template <class DataDelegationType >
200- class BaseFixedInAxisDirection : public BaseMotionConstraint <BodyPartByParticle, DataDelegationType>
201- {
202- public:
203- explicit BaseFixedInAxisDirection (BodyPartByParticle &body_part, Vecd constrained_axises = Vecd::Zero())
204- : BaseMotionConstraint<BodyPartByParticle, DataDelegationType>(body_part), constrain_matrix_(Matd::Identity())
205- {
206- for (int k = 0 ; k != Dimensions; ++k)
207- constrain_matrix_ (k, k) = constrained_axises[k];
208- };
209- virtual ~BaseFixedInAxisDirection (){};
210- void update (size_t index_i, Real dt = 0.0 )
211- {
212- this ->vel_ [index_i] = constrain_matrix_ * this ->vel_ [index_i];
213- };
214-
215- protected:
216- Matd constrain_matrix_;
217- };
218- using FixedInAxisDirection = BaseFixedInAxisDirection<SolidDataSimple>;
219-
220150/* *
221151 * @class ConstrainSolidBodyMassCenter
222152 * @brief Constrain the mass center of a solid body.
223153 */
224- template <class DataDelegationType >
225- class BaseConstrainSolidBodyMassCenter : public LocalDynamics , public DataDelegationType
154+ class ConstrainSolidBodyMassCenter : public MotionConstraint <SPHBody>
226155{
227156 private:
228157 Real total_mass_;
@@ -239,8 +168,8 @@ class BaseConstrainSolidBodyMassCenter : public LocalDynamics, public DataDelega
239168 }
240169
241170 public:
242- explicit BaseConstrainSolidBodyMassCenter (SPHBody &sph_body, Vecd constrain_direction = Vecd::Ones())
243- : LocalDynamics(sph_body), DataDelegationType (sph_body),
171+ explicit ConstrainSolidBodyMassCenter (SPHBody &sph_body, Vecd constrain_direction = Vecd::Ones())
172+ : MotionConstraint<SPHBody> (sph_body),
244173 correction_matrix_(Matd::Identity()), vel_(this ->particles_->vel_),
245174 compute_total_momentum_(sph_body, " Velocity" )
246175 {
@@ -249,28 +178,30 @@ class BaseConstrainSolidBodyMassCenter : public LocalDynamics, public DataDelega
249178 ReduceDynamics<QuantitySummation<Real>> compute_total_mass_ (sph_body, " Mass" );
250179 total_mass_ = compute_total_mass_.exec ();
251180 }
252- virtual ~BaseConstrainSolidBodyMassCenter (){};
181+ virtual ~ConstrainSolidBodyMassCenter (){};
253182
254183 void update (size_t index_i, Real dt = 0.0 )
255184 {
256185 this ->vel_ [index_i] -= velocity_correction_;
257186 }
258187};
259- using ConstrainSolidBodyMassCenter = BaseConstrainSolidBodyMassCenter<SolidDataSimple>;
188+
260189/* *
261190 * @class ConstraintBySimBody
262191 * @brief Constrain by the motion computed from Simbody.
263192 */
264193template <class DynamicsIdentifier >
265- class ConstraintBySimBody : public BaseMotionConstraint <DynamicsIdentifier, SolidDataSimple >
194+ class ConstraintBySimBody : public MotionConstraint <DynamicsIdentifier>
266195{
267196 public:
268197 ConstraintBySimBody (DynamicsIdentifier &identifier,
269198 SimTK::MultibodySystem &MBsystem,
270199 SimTK::MobilizedBody &mobod,
271200 SimTK::RungeKuttaMersonIntegrator &integ)
272- : BaseMotionConstraint<DynamicsIdentifier, SolidDataSimple>(identifier),
273- MBsystem_ (MBsystem), mobod_(mobod), integ_(integ)
201+ : MotionConstraint<DynamicsIdentifier>(identifier),
202+ MBsystem_ (MBsystem), mobod_(mobod), integ_(integ),
203+ n_ (*this ->particles_->template getVariableByName<Vecd>(" NormalDirection" )),
204+ n0_ (*this ->particles_->template getVariableByName<Vecd>(" InitialNormalDirection" ))
274205 {
275206 simbody_state_ = &integ_.getState ();
276207 MBsystem_.realize (*simbody_state_, SimTK::Stage::Acceleration);
@@ -298,14 +229,15 @@ class ConstraintBySimBody : public BaseMotionConstraint<DynamicsIdentifier, Soli
298229 this ->pos_ [index_i] = degradeToVecd (SimTKToEigen (pos));
299230 this ->vel_ [index_i] = degradeToVecd (SimTKToEigen (vel));
300231
301- SimTKVec3 n = (mobod_.getBodyRotation (*simbody_state_) * EigenToSimTK (upgradeToVec3d (this -> n0_ [index_i])));
302- this -> n_ [index_i] = degradeToVecd (SimTKToEigen (n));
232+ SimTKVec3 n = (mobod_.getBodyRotation (*simbody_state_) * EigenToSimTK (upgradeToVec3d (n0_[index_i])));
233+ n_[index_i] = degradeToVecd (SimTKToEigen (n));
303234 };
304235
305236 protected:
306237 SimTK::MultibodySystem &MBsystem_;
307238 SimTK::MobilizedBody &mobod_;
308239 SimTK::RungeKuttaMersonIntegrator &integ_;
240+ StdLargeVec<Vecd> &n_, &n0_;
309241 const SimTK::State *simbody_state_;
310242 SimTKVec3 initial_mobod_origin_location_;
311243};
0 commit comments