54 for (
size_t s = 0; s < d_bcData.size(); s++) {
57 const auto &bc = d_bcData[s];
60 if (bc.d_isDisplacementZero)
68 auto reg_box = bc.d_regionGeomData.d_geom_p ==
nullptr ? std::pair<util::Point, util::Point>(
util::Point(),
util::Point()) : bc.d_regionGeomData.d_geom_p->box();
70 for (
size_t i = 0; i <
particle->getNumNodes(); i++) {
72 const auto x =
particle->getXRefLocal(i);
74 double umax = bc.d_timeFnParams[0];
79 if (!bc.d_isRegionActive) {
87 if (bc.d_spatialFnType ==
"hat_x") {
88 umax = bc.d_spatialFnParams[0] *
91 }
else if (bc.d_spatialFnType ==
"hat_y") {
92 umax = bc.d_spatialFnParams[0] *
95 }
else if (bc.d_spatialFnType ==
"sin_x") {
96 double a = M_PI * bc.d_spatialFnParams[0];
97 umax = umax * std::sin(a * x.d_x);
98 }
else if (bc.d_spatialFnType ==
"sin_y") {
99 double a = M_PI * bc.d_spatialFnParams[0];
100 umax = umax * std::sin(a * x.d_y);
101 }
else if (bc.d_spatialFnType ==
"linear_x") {
102 double a = bc.d_spatialFnParams[0];
103 umax = umax * a * x.d_x;
104 }
else if (bc.d_spatialFnType ==
"linear_y") {
105 double a = bc.d_spatialFnParams[0];
106 umax = umax * a * x.d_y;
110 if (bc.d_timeFnType ==
"constant")
112 else if (bc.d_timeFnType ==
"linear") {
115 }
else if (bc.d_timeFnType ==
"quadratic") {
116 du = umax * time + bc.d_timeFnParams[1] * time * time;
117 dv = umax + bc.d_timeFnParams[1] * time;
118 }
else if (bc.d_timeFnType ==
"sin") {
119 double a = M_PI * bc.d_timeFnParams[1];
120 du = umax * std::sin(a * time);
121 dv = umax * a * std::cos(a * time);
126 for (
auto d : bc.d_direction) {
131 if (bc.d_timeFnType ==
"rotation") {
132 auto x0 =
util::Point(bc.d_timeFnParams[1], bc.d_timeFnParams[2],
133 bc.d_timeFnParams[3]);
136 dx, bc.d_timeFnParams[0] * time);
138 dx, bc.d_timeFnParams[0] * time);
141 v_i += bc.d_timeFnParams[0] * dr_x;
144 for (
auto d : bc.d_direction) {
145 particle->setULocal(i, d-1, u_i[d-1]);
146 particle->setVLocal(i, d-1, v_i[d-1]);
147 auto xref =
particle->getXRefLocal(i)[d-1];
148 particle->setXLocal(i, d-1, u_i[d-1] + xref);
std::vector< inp::BCBaseDeck > d_bcData
List of displacement bcs.
void apply(const double &time, particle::BaseParticle *particle)
Applies displacement boundary condition.
ParticleULoading(std::vector< inp::BCBaseDeck > &bc_data)
Constructor.
void setFixity(particle::BaseParticle *particle)
Sets fixity mask.
std::vector< bool > d_pZeroDisplacementApplied
Flag to indicate whether particles are fixed.
A class to store particle geometry, nodal discretization, and methods.
bool needToComputeDof(const util::Point &x, size_t id, const inp::BCBaseDeck &bc)
Function that checks if we need to do computation at a given point x within a particle with id = id.
Collection of methods and data related to particle object.