Skip to content

Commit 98707e1

Browse files
committed
all compiled
1 parent c33682b commit 98707e1

File tree

39 files changed

+610
-589
lines changed

39 files changed

+610
-589
lines changed

modules/structural_simulation/structural_simulation_class.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ void StructuralSimulation::initializeConstrainSolidBody()
503503
for (size_t i = 0; i < body_indices_fixed_constraint_.size(); i++)
504504
{
505505
int body_index = body_indices_fixed_constraint_[i];
506-
fixed_constraint_body_.emplace_back(makeShared<SimpleDynamics<solid_dynamics::FixBodyConstraint>>(*solid_body_list_[body_index]->getSolidBodyFromMesh()));
506+
fixed_constraint_body_.emplace_back(makeShared<SimpleDynamics<FixBodyConstraint>>(*solid_body_list_[body_index]->getSolidBodyFromMesh()));
507507
}
508508
}
509509

@@ -527,7 +527,7 @@ void StructuralSimulation::initializeConstrainSolidBodyRegion()
527527
// create the triangle mesh of the box
528528
BodyPartFromMesh *bp = body_part_tri_mesh_ptr_keeper_.createPtr<BodyPartFromMesh>(
529529
*solid_body_list_[body_index]->getSolidBodyFromMesh(), makeShared<TriangleMeshShapeBrick>(halfsize_bbox, resolution, center, imported_stl_list_[body_index]));
530-
fixed_constraint_region_.emplace_back(makeShared<SimpleDynamics<solid_dynamics::FixBodyPartConstraint>>(*bp));
530+
fixed_constraint_region_.emplace_back(makeShared<SimpleDynamics<FixBodyPartConstraint>>(*bp));
531531
}
532532
}
533533

modules/structural_simulation/structural_simulation_class.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,10 @@ class StructuralSimulation
228228
StdVec<SharedPtr<SimpleDynamics<solid_dynamics::SpringNormalOnSurfaceParticles>>> surface_spring_;
229229
StdVec<SurfaceSpringTuple> surface_spring_tuple_;
230230
// for ConstrainSolidBody
231-
StdVec<SharedPtr<SimpleDynamics<solid_dynamics::FixBodyConstraint>>> fixed_constraint_body_;
231+
StdVec<SharedPtr<SimpleDynamics<FixBodyConstraint>>> fixed_constraint_body_;
232232
StdVec<int> body_indices_fixed_constraint_;
233233
// for ConstrainSolidBodyRegion
234-
StdVec<SharedPtr<SimpleDynamics<solid_dynamics::FixBodyPartConstraint>>> fixed_constraint_region_;
234+
StdVec<SharedPtr<SimpleDynamics<FixBodyPartConstraint>>> fixed_constraint_region_;
235235
StdVec<ConstrainedRegionPair> body_indices_fixed_constraint_region_;
236236
// for PositionSolidBody
237237
StdVec<SharedPtr<SimpleDynamics<solid_dynamics::PositionSolidBody>>> position_solid_body_;

src/shared/particle_dynamics/continuum_dynamics/continuum_integration.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
/**
2424
* @file continuum_integration.h
2525
* @brief Here, we define the algorithm classes for continuum dynamics within the body.
26-
* @details We consider here weakly compressible assumption to model elastic and
26+
* @details We consider here weakly compressible assumption to model elastic and
2727
* plastic materials with the updated Lagrangian framework.
2828
* @author Shuaihao Zhang and Xiangyu Hu
2929
*/
@@ -99,10 +99,6 @@ class ShearStressRelaxation : public fluid_dynamics::BaseIntegration<ContinuumDa
9999
StdLargeVec<Matd> &B_;
100100
};
101101

102-
using FixBodyPartConstraint = solid_dynamics::FixConstraint<BodyPartByParticle, ContinuumDataSimple>;
103-
using FixedInAxisDirection = solid_dynamics::BaseFixedInAxisDirection<ContinuumDataSimple>;
104-
using ConstrainSolidBodyMassCenter = solid_dynamics::BaseConstrainSolidBodyMassCenter<ContinuumDataSimple>;
105-
106102
template <class DataDelegationType>
107103
class BasePlasticIntegration : public fluid_dynamics::BaseIntegration<DataDelegationType>
108104
{

src/shared/particle_dynamics/general_dynamics/general_constraint.h

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,76 @@ class ShapeSurfaceBounding : public BaseLocalDynamics<BodyPartByCell>,
5555
LevelSetShape *level_set_shape_;
5656
Real constrained_distance_;
5757
};
58+
59+
/**
60+
* @class MotionConstraint
61+
* @brief Base class for constraining with prescribed motion.
62+
* Exact motion function will be defined in derive class.
63+
* Note that, we do not impose acceleration, so that this constraint
64+
* must be imposed after updating particle velocity by forces
65+
* and before updating particle position.
66+
*/
67+
template <class DynamicsIdentifier>
68+
class MotionConstraint : public BaseLocalDynamics<DynamicsIdentifier>, public GeneralDataDelegateSimple
69+
{
70+
public:
71+
explicit MotionConstraint(DynamicsIdentifier &identifier)
72+
: BaseLocalDynamics<DynamicsIdentifier>(identifier),
73+
GeneralDataDelegateSimple(identifier.getSPHBody()),
74+
pos_(this->particles_->pos_),
75+
pos0_(*this->particles_->registerSharedVariable<Vecd>(
76+
"InitialPosition", [&](size_t index_i)
77+
{ return pos_[index_i]; })),
78+
vel_(this->particles_->vel_){};
79+
80+
virtual ~MotionConstraint(){};
81+
82+
protected:
83+
StdLargeVec<Vecd> &pos_, &pos0_, &vel_;
84+
};
85+
using BodyPartMotionConstraint = MotionConstraint<BodyPartByParticle>;
86+
87+
/**@class FixConstraint
88+
* @brief Constraint with zero velocity.
89+
*/
90+
template <class DynamicsIdentifier>
91+
class FixConstraint : public MotionConstraint<DynamicsIdentifier>
92+
{
93+
public:
94+
explicit FixConstraint(DynamicsIdentifier &identifier)
95+
: MotionConstraint<DynamicsIdentifier>(identifier){};
96+
virtual ~FixConstraint(){};
97+
98+
void update(size_t index_i, Real dt = 0.0)
99+
{
100+
this->pos_[index_i] = this->pos0_[index_i];
101+
this->vel_[index_i] = Vecd::Zero();
102+
};
103+
};
104+
using FixBodyConstraint = FixConstraint<SPHBody>;
105+
using FixBodyPartConstraint = FixConstraint<BodyPartByParticle>;
106+
107+
/**
108+
* @class FixedInAxisDirection
109+
* @brief Constrain the velocity of a solid body part.
110+
*/
111+
class FixedInAxisDirection : public MotionConstraint<BodyPartByParticle>
112+
{
113+
public:
114+
explicit FixedInAxisDirection(BodyPartByParticle &body_part, Vecd constrained_axises = Vecd::Zero())
115+
: MotionConstraint<BodyPartByParticle>(body_part), constrain_matrix_(Matd::Identity())
116+
{
117+
for (int k = 0; k != Dimensions; ++k)
118+
constrain_matrix_(k, k) = constrained_axises[k];
119+
};
120+
virtual ~FixedInAxisDirection(){};
121+
void update(size_t index_i, Real dt = 0.0)
122+
{
123+
this->vel_[index_i] = constrain_matrix_ * this->vel_[index_i];
124+
};
125+
126+
protected:
127+
Matd constrain_matrix_;
128+
};
58129
} // namespace SPH
59130
#endif // GENERAL_CONSTRAINT_H

src/shared/particle_dynamics/solid_dynamics/constraint_dynamics.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ namespace solid_dynamics
77
{
88
//=================================================================================================//
99
SpringConstrain::SpringConstrain(BodyPartByParticle &body_part, Real stiffness)
10-
: BaseMotionConstraint<BodyPartByParticle, SolidDataSimple>(body_part),
11-
stiffness_(stiffness * Vecd::Ones()) {}
10+
: MotionConstraint<BodyPartByParticle>(body_part),
11+
stiffness_(stiffness * Vecd::Ones()),
12+
mass_(*particles_->getVariableByName<Real>("Mass")) {}
1213
//=================================================================================================//
1314
Vecd SpringConstrain::getAcceleration(Vecd &disp, Real mass)
1415
{
@@ -28,7 +29,7 @@ void SpringConstrain::update(size_t index_i, Real dt)
2829
//=================================================================================================//
2930
PositionSolidBody::
3031
PositionSolidBody(SPHBody &sph_body, Real start_time, Real end_time, Vecd pos_end_center)
31-
: BaseMotionConstraint<SPHBody, SolidDataSimple>(sph_body),
32+
: MotionConstraint<SPHBody>(sph_body),
3233
start_time_(start_time), end_time_(end_time), pos_end_center_(pos_end_center)
3334
{
3435
BoundingBox bounds = sph_body.getSPHBodyBounds();
@@ -56,7 +57,7 @@ void PositionSolidBody::update(size_t index_i, Real dt)
5657
//=================================================================================================//
5758
PositionScaleSolidBody::
5859
PositionScaleSolidBody(SPHBody &sph_body, Real start_time, Real end_time, Real end_scale)
59-
: BaseMotionConstraint<SPHBody, SolidDataSimple>(sph_body),
60+
: MotionConstraint<SPHBody>(sph_body),
6061
start_time_(start_time), end_time_(end_time), end_scale_(end_scale)
6162
{
6263
BoundingBox bounds = sph_body.getSPHBodyBounds();

src/shared/particle_dynamics/solid_dynamics/constraint_dynamics.h

Lines changed: 20 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
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
4949
typedef DataDelegateSimple<SolidParticles> SolidDataSimple;
5050
typedef 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
*/
163118
template <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
192147
using TranslateSolidBody = PositionTranslate<SPHBody>;
193148
using 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
*/
264193
template <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
};

src/shared/particles/base_particles.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,8 @@ class BaseParticles
130130
template <typename DataType, class InitializationFunction>
131131
void registerVariable(StdLargeVec<DataType> &variable_addrs, const std::string &variable_name,
132132
const InitializationFunction &initialization);
133-
template <typename DataType>
134-
StdLargeVec<DataType> *registerSharedVariable(
135-
const std::string &variable_name, const DataType &default_value = ZeroData<DataType>::value);
133+
template <typename DataType, typename... Args>
134+
StdLargeVec<DataType> *registerSharedVariable(const std::string &variable_name, Args &&...args);
136135
template <typename DataType>
137136
StdLargeVec<DataType> *getVariableByName(const std::string &variable_name);
138137
ParticleVariables &AllDiscreteVariables() { return all_discrete_variables_; };

0 commit comments

Comments
 (0)