5 #ifndef VOLUME_COUPLING_H
6 #define VOLUME_COUPLING_H
13 typedef VolumeCoupledElement<OomphProblem::ELEMENT>
VELEMENT;
53 CI->
addForce(CI->getCouplingForce());
69 p->resetCouplingForce();
70 p->resetInvCouplingWeight();
71 p->resetCouplingMass();
76 const auto p = particleHandler.getLastObject();
77 Vec3D f =
p->getMass() * getGravity();
79 if (
a.getLengthSquared() > 1.0e-5 *
f.getLengthSquared())
81 logger(
INFO,
"time %, body force: %, total force: %, position %",
82 getTime(),
f,
a,
p->getPosition());
86 for (
auto p : particleHandler)
89 for (
auto i :
p->getInteractions())
91 if (
i->getI()->getName() ==
"TriangleWall")
n++;
95 logger(
INFO,
"particle % is interacting with % TriangleWalls",
p->getId(),
n);
96 for (
auto i :
p->getInteractions())
98 if (
i->getI()->getName() ==
"TriangleWall")
100 logger(
INFO,
"particle % is interacting with wall %",
p->getId(),
i->getI()->getId());
111 setCGWidth(width * particleHandler.getLargestParticle()->getRadius());
122 double mercury_dt = getTimeStep();
134 double oomph_dt = nstep * mercury_dt;
137 OomphProblem::set_initial_conditions(oomph_dt);
142 while (getTime() < getTimeMax())
147 if (getVtkWriter()->getFileCounter() > nDone)
149 OomphProblem::doc_solution();
150 nDone = getVtkWriter()->getFileCounter();
192 logger(
DEBUG,
"about to call hGridActionsBeforeIntegration()");
193 hGridActionsBeforeIntegration();
196 logger(
DEBUG,
"about to call integrateBeforeForceComputation()");
197 integrateBeforeForceComputation();
199 logger(
DEBUG,
"about to call performGhostParticleUpdate()");
200 performGhostParticleUpdate();
206 logger(
DEBUG,
"about to call checkInteractionWithBoundaries()");
207 checkInteractionWithBoundaries();
209 logger(
DEBUG,
"about to call hGridActionsAfterIntegration()");
210 hGridActionsAfterIntegration();
217 b->checkBoundaryBeforeTimeStep(
this);
220 logger(
DEBUG,
"about to call actionsBeforeTimeStep()");
221 actionsBeforeTimeStep();
223 logger(
DEBUG,
"about to call checkAndDuplicatePeriodicParticles()");
224 checkAndDuplicatePeriodicParticles();
226 logger(
DEBUG,
"about to call hGridActionsBeforeTimeStep()");
227 hGridActionsBeforeTimeStep();
239 logger(
DEBUG,
"about to call removeDuplicatePeriodicParticles()");
240 removeDuplicatePeriodicParticles();
243 logger(
DEBUG,
"about to call integrateAfterForceComputation()");
244 integrateAfterForceComputation();
246 logger(
DEBUG,
"about to call actionsAfterTimeStep()");
250 logger(
DEBUG,
"about to call interactionHandler.eraseOldInteractions(getNumberOfTimeSteps())");
251 interactionHandler.eraseOldInteractions(getNumberOfTimeSteps());
252 logger(
DEBUG,
"about to call interactionHandler.actionsAfterTimeStep()");
253 interactionHandler.actionsAfterTimeStep();
254 particleHandler.actionsAfterTimeStep();
264 unsigned n_element = OomphProblem::solid_mesh_pt()->nelement();
267 for (
unsigned e = 0;
e < n_element;
e++)
270 auto bulk_elem_pt =
dynamic_cast<VELEMENT*
>(OomphProblem::solid_mesh_pt()->element_pt(
e));
273 const unsigned nnode = bulk_elem_pt->nnode();
279 Vector<double> listOfCoordX;
280 Vector<double> listOfCoordY;
281 Vector<double> listOfCoordZ;
284 for (
unsigned n = 0;
n < nnode;
n++)
293 min.X = *min_element(listOfCoordX.begin(), listOfCoordX.end());
294 min.Y = *min_element(listOfCoordY.begin(), listOfCoordY.end());
295 min.Z = *min_element(listOfCoordZ.begin(), listOfCoordZ.end());
297 max.X = *max_element(listOfCoordX.begin(), listOfCoordX.end());
298 max.Y = *max_element(listOfCoordY.begin(), listOfCoordY.end());
299 max.Z = *max_element(listOfCoordZ.begin(), listOfCoordZ.end());
302 min -=
Vec3D(1.0, 1.0, 1.0) * (
getCGWidth() - 2 * particleHandler.getLargestParticle()->getRadius() );
303 max +=
Vec3D(1.0, 1.0, 1.0) * (
getCGWidth() - 2 * particleHandler.getLargestParticle()->getRadius() );
306 Vector<BaseParticle*> pList;
307 getParticlesInCell(
min,
max, pList);
308 if (pList.size() != 0)
315 for (
auto it = pList.begin(); it != pList.end(); it++)
317 Vector<double>
s(3, 0.0),
x(3, 0.0);
318 GeomObject* geom_obj_pt = 0;
320 Vec3D xp = ( *it )->getPosition();
326 bulk_elem_pt->locate_zeta(
x, geom_obj_pt,
s);
328 if (geom_obj_pt ==
nullptr)
329 { pList.erase(it--); }
335 bulk_elem_pt->shape(
s, psi);
336 Vector<double> shapes;
337 for (
unsigned l = 0; l < nnode; l++) shapes.push_back(psi(l));
343 if (pList.size() != 0)
360 Vector<CoupledSolidNode*> listOfSolidNodes;
364 const unsigned nnode = coupled_elem.bulk_elem_pt->nnode();
365 for (
unsigned n = 0;
n < nnode;
n++)
367 CoupledSolidNode* node_pt =
dynamic_cast<CoupledSolidNode*
>(coupled_elem.bulk_elem_pt->node_pt(
n));
369 if (!node_pt->is_on_boundary())
371 listOfSolidNodes.push_back(node_pt);
375 { node_pt->set_coupling_weight(0.5); }
379 for (CoupledSolidNode* node_pt : listOfSolidNodes)
381 unsigned n = count(listOfSolidNodes.begin(), listOfSolidNodes.end(), node_pt);
382 if (
n ==
pow(2, getSystemDimensions()))
383 { node_pt->set_coupling_weight(0.5); }
385 { node_pt->set_coupling_weight(0.5); }
396 unsigned direction = 1;
398 Vector<double> listOfPos;
402 const unsigned nnode = coupled_elem.bulk_elem_pt->nnode();
403 for (
unsigned n = 0;
n < nnode;
n++)
405 CoupledSolidNode* node_pt =
dynamic_cast<CoupledSolidNode*
>(coupled_elem.bulk_elem_pt->node_pt(
n));
406 listOfPos.push_back(node_pt->x(direction));
410 auto posMin = *min_element(listOfPos.begin(), listOfPos.end());
411 auto posMax = *max_element(listOfPos.begin(), listOfPos.end());
421 const unsigned nnode = coupled_elem.bulk_elem_pt->nnode();
422 for (
unsigned n = 0;
n < nnode;
n++)
424 CoupledSolidNode* node_pt =
dynamic_cast<CoupledSolidNode*
>(coupled_elem.bulk_elem_pt->node_pt(
n));
427 + ( weightMax -
weightMin_ ) / ( posMax - posMin ) * ( node_pt->x(direction) - posMin );
432 node_pt->set_coupling_weight(weight);
440 Vector<Vector<double>>& couplingMatrix,
Vector<Vector<double>>& nodalDisplDPM)
443 Vector<BaseParticle*> particles;
451 const unsigned nnode = coupled_elem.
bulk_elem_pt->nnode();
455 Vector<Vector<double>> particleDispl(
nParticles, Vector<double>(dim, 0));
462 particleDispl[
m][0] = displ.
getX();
463 particleDispl[
m][1] = displ.
getY();
464 particleDispl[
m][2] = displ.
getZ();
467 for (
unsigned i = 0;
i < nnode;
i++)
469 for (
unsigned k = 0;
k < dim;
k++)
473 nodalDisplDPM[
i][
k] += couplingMatrix[
i][
j] * particleDispl[
j][
k];
482 const unsigned nParticles = couplingMatrix[0].size();
484 const unsigned nnode = couplingMatrix.size();
490 for (
unsigned l = 0; l < nnode; l++)
500 couplingMatrix[l][
m] =
shape;
508 { couplingMatrix[l][
m] /= sum; }
517 Vector<double>
s(dim),
x(dim);
521 const unsigned n_intpt = el_pt->integral_pt()->nweight();
523 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
526 double w = el_pt->integral_pt()->weight(ipt);
528 el_pt->shape_at_knot(ipt, psi);
530 for (
unsigned i = 0;
i < dim;
i++)
531 {
s[
i] = el_pt->integral_pt()->knot(ipt,
i); }
533 el_pt->interpolated_x(
s,
x);
535 for (
unsigned l = 0; l < nnode; l++)
548 double shape =
w * phi * psi(l);
552 couplingMatrix[l][
m] +=
shape;
557 for (
unsigned l = 0; l < nnode; l++)
561 { sum += couplingMatrix[l][
m]; }
566 { couplingMatrix[l][
m] /= sum; }
578 VELEMENT* elem_pt = coupled_elem.bulk_elem_pt;
580 Vector<BaseParticle*> particles;
582 { particles = coupled_elem.listOfCoupledParticles; }
584 { particles = coupled_elem.listOfCoupledParticlesExt; }
587 const unsigned nnode = coupled_elem.bulk_elem_pt->nnode();
589 Vector<Vector<double>> couplingMatrix(nnode, Vector<double>(
nParticles, 0.0));
591 const unsigned dim = elem_pt->dim();
592 Vector<Vector<double>> nodalDisplDPM(nnode, Vector<double>(dim, 0.0));
596 Vector<Vector<double>> nodalCouplingForces(nnode, Vector<double>(dim, 0.0));
599 Vector<Vector<double>> particleCouplingForces(
nParticles, Vector<double>(dim, 0.0));
602 for (
unsigned k = 0;
k < dim;
k++)
604 for (
unsigned j = 0;
j < nnode;
j++)
608 particleCouplingForces[
i][
k] += couplingMatrix[
j][
i] * nodalCouplingForces[
j][
k];
612 auto p = particles[
i];
614 particleCouplingForces[
i][1],
615 particleCouplingForces[
i][2]);
619 p->setCouplingForce(cForce * Global_Physical_Variables::forceScale());
624 p->addCouplingForce(cForce * Global_Physical_Variables::forceScale());
628 elem_pt->set_nodal_coupling_residual(nodalCouplingForces);
638 VELEMENT* elem_pt = coupled_elem.bulk_elem_pt;
641 Vector<BaseParticle*> particles;
643 { particles = coupled_elem.listOfCoupledParticles; }
645 { particles = coupled_elem.listOfCoupledParticlesExt; }
649 const unsigned nnode = coupled_elem.bulk_elem_pt->nnode();
650 const unsigned dim = elem_pt->dim();
653 Vector<Vector<double>> couplingMatrix(nnode, Vector<double>(
nParticles, 0.0));
658 Vector<Vector<double>> bulkStiffness(nnode, Vector<double>(nnode, 0.0));
662 Vector<Vector<double>> couplingStiffness(
nParticles, Vector<double>(nnode, 0.0));
665 for (
unsigned j = 0;
j < nnode;
j++)
667 for (
unsigned i = 0;
i < nnode;
i++)
669 couplingStiffness[
m][
j] += couplingMatrix[
i][
m] * bulkStiffness[
i][
j];
673 elem_pt->setCouplingStiffness(couplingStiffness);
676 Vector<Vector<double>> nodalResidualDPM(nnode, Vector<double>(dim, 0.0));
682 for (
unsigned l = 0; l < nnode; l++)
684 for (
unsigned ll = 0; ll < nnode; ll++)
689 cForce += couplingMatrix[l][
m] * bulkStiffness[l][ll] *
690 Global_Physical_Variables::stiffScale() * couplingMatrix[ll][mm] *
691 (particles[mm]->getPosition() - particles[mm]->getPreviousPosition());
696 particles[
m]->addCouplingForce(-cForce);
699 for (
unsigned i = 0;
i < nnode;
i++)
701 for (
unsigned j = 0;
j < nnode;
j++)
706 double particleStiffness = bulkStiffness[
i][
j] * couplingMatrix[
j][
m];
707 nodalResidualDPM[
i][0] -= particleStiffness * displ.
getX();
708 nodalResidualDPM[
i][1] -= particleStiffness * displ.
getY();
709 nodalResidualDPM[
i][2] -= particleStiffness * displ.
getZ();
714 elem_pt->set_nodal_coupling_residual(nodalResidualDPM);
717 elem_pt->set_nodal_coupling_jacobian(bulkStiffness);
727 VELEMENT* elem_pt = coupled_elem.bulk_elem_pt;
730 Vector<BaseParticle*> particles;
732 { particles = coupled_elem.listOfCoupledParticles; }
734 { particles = coupled_elem.listOfCoupledParticlesExt; }
738 const unsigned nnode = coupled_elem.bulk_elem_pt->nnode();
739 const unsigned dim = elem_pt->dim();
746 for (
unsigned l = 0; l < nnode; l++)
748 double coupling = elem_pt->getCouplingStiffness(
m, l);
750 Vec3D force = coupling *
Vec3D(elem_pt->nodal_position(0, l, 0) - elem_pt->nodal_position(1, l, 0),
751 elem_pt->nodal_position(0, l, 1) - elem_pt->nodal_position(1, l, 1),
752 elem_pt->nodal_position(0, l, 2) - elem_pt->nodal_position(1, l, 2));
757 particles[
m]->addCouplingForce(cForce * Global_Physical_Variables::forceScale());
763 const Vector<Vector<double>>& nodalDisplDPM,
764 Vector<Vector<double>>& nodalCouplingForces)
767 Vector<Vector<double>> nodalDisplDiff(nnode, Vector<double>(dim, 0));
768 for (
unsigned l = 0; l < nnode; l++)
770 for (
unsigned i = 0;
i < dim;
i++)
772 double displFEM = elem_pt->nodal_position(0, l,
i) - elem_pt->nodal_position(1, l,
i);
773 double displDPM = nodalDisplDPM[l][
i];
774 nodalDisplDiff[l][
i] = displDPM - displFEM;
779 DShape dpsidxi(nnode, dim);
780 const unsigned n_intpt = elem_pt->integral_pt()->nweight();
782 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
785 double w = elem_pt->integral_pt()->weight(ipt);
787 double J = elem_pt->dshape_lagrangian_at_knot(ipt, psi, dpsidxi);
789 for (
unsigned l = 0; l < nnode; l++)
792 for (
unsigned ll = 0; ll < nnode; ll++)
794 double vol = Global_Physical_Variables::penalty * psi(ll) * psi(l) *
w *
J;
801 for (
unsigned i = 0;
i < dim;
i++)
803 nodalCouplingForces[l][
i] += -vol * nodalDisplDiff[l][
i];
814 const unsigned nnode = elem_pt->nnode();
816 const unsigned dim = elem_pt->dim();
819 DShape dpsidxi(nnode, dim);
820 const unsigned n_intpt = elem_pt->integral_pt()->nweight();
822 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
825 double w = elem_pt->integral_pt()->weight(ipt);
827 double J = elem_pt->dshape_lagrangian_at_knot(ipt, psi, dpsidxi);
829 for (
unsigned l = 0; l < nnode; l++)
832 for (
unsigned ll = 0; ll < nnode; ll++)
834 bulkStiffness[l][ll] += Global_Physical_Variables::penalty * psi(l) * psi(ll) *
w *
J;
841 const Vector<Vector<double>>& bulkStiffness, Vector<double>& invCMassPerTime)
844 const unsigned nnode = bulkStiffness.size();
846 const unsigned nParticles = invCMassPerTime.size();
848 Vector<BaseParticle*> particles;
857 double particleMass = particles[
m]->getMass() / particles[
m]->getInvCouplingWeight();
859 double cMassPerTimeSquared = 0.0;
861 for (
unsigned l = 0; l < nnode; l++)
864 for (
unsigned ll = 0; ll < nnode; ll++)
867 cMassPerTimeSquared += couplingMatrix[l][
m] * bulkStiffness[l][ll] * couplingMatrix[ll][
m];
870 cMassPerTimeSquared *= 0.5;
872 double cMass = cMassPerTimeSquared * Global_Physical_Variables::stiffScale() *
pow(getTimeStep(), 2);
873 particles[
m]->setCouplingMass(cMass);
876 double oomph_dt = time_pt()->dt(0);
877 invCMassPerTime[
m] = 1.0 / ( particleMass / getTimeStep() / scale + cMassPerTimeSquared * oomph_dt );
890 VELEMENT* elem_pt = coupled_elem.bulk_elem_pt;
892 const unsigned n_node = elem_pt->nnode();
896 for (
unsigned i = 0;
i < coupled_elem.listOfCoupledParticles.size();
i++)
898 auto shapes = coupled_elem.listOfShapesAtParticleCenters[
i];
900 double weightAtCenter = 0;
901 for (
unsigned l = 0; l < n_node; l++)
903 CoupledSolidNode* node_pt =
dynamic_cast<CoupledSolidNode*
>(elem_pt->node_pt(l));
904 weightAtCenter += shapes[l] * node_pt->get_coupling_weight();
906 double invWeightAtCenter = 1.0 / weightAtCenter;
909 auto p = coupled_elem.listOfCoupledParticles[
i];
910 p->setInvCouplingWeight(invWeightAtCenter);
913 if (
p->getInteractions().size() == 0)
continue;
918 for (
auto inter :
p->getInteractions())
921 if (inter->isCoupled())
926 Vector<double>
s(3, 0.0),
x(3, 0.0);
927 GeomObject* geom_obj_pt = 0;
929 Vec3D xc = inter->getContactPoint();
935 elem_pt->locate_zeta(
x, geom_obj_pt,
s);
937 if (geom_obj_pt !=
nullptr)
940 elem_pt->shape(
s, psi);
941 double weightAtContactPoint = 0;
942 for (
unsigned l = 0; l < n_node; l++)
944 CoupledSolidNode* node_pt =
dynamic_cast<CoupledSolidNode*
>(elem_pt->node_pt(l));
945 weightAtContactPoint += node_pt->get_coupling_weight() * psi(l);
947 inter->setCouplingWeight(weightAtContactPoint);
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
RowVector3d w
Definition: Matrix_resize_int.cpp:3
float * p
Definition: Tutorial_Map_using.cpp:9
Scalar * b
Definition: benchVecAdd.cpp:17
Definition: BaseBoundary.h:28
Definition: BaseCoupling.h:27
void solveOomph(int max_adapt=0)
Definition: BaseCoupling.h:120
bool useCGMapping()
Definition: BaseCoupling.h:180
double getCGWidth()
Definition: BaseCoupling.h:175
CGFunctions::LucyXYZ getCGFunction()
Definition: BaseCoupling.h:183
void setCGWidth(const double &width)
Definition: BaseCoupling.h:157
void solveMercury(unsigned long nt)
Definition: BaseCoupling.h:149
void addForce(const Vec3D &addForce)
Adds an amount to the force on this BaseInteractable.
Definition: BaseInteractable.cc:94
Definition: BaseParticle.h:33
bool isFixed() const override
Is fixed Particle function. It returns whether a Particle is fixed or not, by checking its inverse Ma...
Definition: BaseParticle.h:72
Mdouble getMass() const
Returns the particle's mass.
Definition: BaseParticle.h:305
Defines the position of the CGPoint, in the non-averaged directions, i.e. all directions on which spa...
Definition: XYZ.h:59
void setXYZ(Vec3D p)
Returns the position of the current CGPoint, in the non-averaged directions.
Definition: XYZ.cc:64
Mdouble evaluateCGFunction(const Vec3D &position, const Coordinates &r)
Evaluates the coarse-graining function.
Definition: Kernel/Math/Vector.h:30
Mdouble getZ() const
Definition: Kernel/Math/Vector.h:437
Mdouble getX() const
Definition: Kernel/Math/Vector.h:431
Mdouble getY() const
Definition: Kernel/Math/Vector.h:434
Definition: VCoupling.h:11
void computeOneTimeStepForVCoupling(const unsigned &nstep)
Definition: VCoupling.h:158
void setNodalWeightByDistance()
Definition: VCoupling.h:394
void computeCouplingForce()
Definition: VCoupling.h:572
VolumeCoupling(const double &wMin, const bool &flag)
Definition: VCoupling.h:35
void actionsAfterTimeStep() override
Definition: VCoupling.h:61
void computeCouplingOnDPM()
Definition: VCoupling.h:721
void solveFirstHalfTimeStep()
Definition: VCoupling.h:185
void computeNodalCouplingForces(VELEMENT *&elem_pt, const unsigned &nnode, const unsigned &dim, const Vector< Vector< double >> &nodalDisplDPM, Vector< Vector< double >> &nodalCouplingForces)
Definition: VCoupling.h:762
void checkParticlesInFiniteElems()
Definition: VCoupling.h:261
void getProjectionMatrix(const DPMVCoupledElement &coupled_elem, Vector< Vector< double >> &couplingMatrix)
Definition: VCoupling.h:479
bool explicit_
Definition: VCoupling.h:966
void solveVolumeCoupling()
Definition: VCoupling.h:117
void computeCouplingOnFEM()
Definition: VCoupling.h:632
VolumeCoupledElement< OomphProblem::ELEMENT > VELEMENT
Definition: VCoupling.h:13
void setExplicit(const bool &flag)
Definition: VCoupling.h:957
void solveVolumeCoupling(const double &width)
Definition: VCoupling.h:108
void computeExternalForces(BaseParticle *CI) override
Definition: VCoupling.h:44
void getBulkStiffness(VELEMENT *&elem_pt, Vector< Vector< double >> &bulkStiffness)
Definition: VCoupling.h:811
double weightMin_
Definition: VCoupling.h:964
void getInvCoupledMassPerTime(const DPMVCoupledElement &elem, const Vector< Vector< double >> &couplingMatrix, const Vector< Vector< double >> &bulkStiffness, Vector< double > &invCMassPerTime)
Definition: VCoupling.h:840
void solveSecondHalfTimeStep()
Definition: VCoupling.h:233
void getProjectionAndProjected(const DPMVCoupledElement &coupled_elem, Vector< Vector< double >> &couplingMatrix, Vector< Vector< double >> &nodalDisplDPM)
Definition: VCoupling.h:439
Vector< DPMVCoupledElement > listOfDPMVCoupledElements_
Definition: VCoupling.h:962
void setNodalWeightOnCubicMesh()
Definition: VCoupling.h:357
void computeWeightOnParticles()
Definition: VCoupling.h:884
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
Matrix< Type, Size, 1 > Vector
\cpp11 SizeĆ1 vector of type Type.
Definition: Eigen/Eigen/src/Core/Matrix.h:515
RealScalar s
Definition: level1_cplx_impl.h:130
const Scalar * a
Definition: level2_cplx_impl.h:32
int * m
Definition: level2_cplx_impl.h:294
char char char int int * k
Definition: level2_impl.h:374
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:625
double lenScale
Length scale.
Definition: VCoupledElement.h:10
double timeScale
Time scale.
Definition: VCoupledElement.h:13
list nParticles
Definition: MergeRestartFiles.py:46
xc
Definition: MultiOpt.py:46
void shape(const double &s, double *Psi)
Definition: shape.h:564
list x
Definition: plotDoE.py:28
Update the problem specs before solve
Definition: steady_axisym_advection_diffusion.cc:353
Definition: VCoupling.h:19
Vector< BaseParticle * > listOfCoupledParticlesExt
Definition: VCoupling.h:24
Vector< Vector< double > > listOfParticleCentersLoc
Definition: VCoupling.h:26
VELEMENT * bulk_elem_pt
Definition: VCoupling.h:21
Vector< BaseParticle * > listOfCoupledParticles
Definition: VCoupling.h:23
Vector< Vector< double > > listOfShapesAtParticleCenters
Definition: VCoupling.h:28
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2