PeriDEM 0.3.0
PeriDEM -- Peridynamics-based high-fidelity model for granular media
Loading...
Searching...
No Matches
baseParticle.h
Go to the documentation of this file.
1/*
2 * -------------------------------------------
3 * Copyright (c) 2021 - 2026 Prashant K. Jha
4 * -------------------------------------------
5 * PeriDEM https://github.com/prashjha/PeriDEM
6 *
7 * Distributed under the Boost Software License, Version 1.0. (See accompanying
8 * file LICENSE)
9 */
10
11#ifndef PARTICLE_BASEPARTICLE_H
12#define PARTICLE_BASEPARTICLE_H
13
14#include "refParticle.h"
16#include "data/modelData.h"
18
19#include <cstdint> // uint8_t type
20#include <cstring> // string and size_t type
21#include <vector>
22
24namespace particle {
25
33
34public:
40 BaseParticle(size_t id = 0);
41
62 BaseParticle(size_t id,
63 bool isWall,
64 size_t dim,
65 std::map<std::string, size_t> groups,
66 bool are_all_dofs_constrained,
67 size_t num_nodes,
68 double h,
69 std::shared_ptr<data::ModelData> model_data,
70 std::shared_ptr<particle::RefParticle> ref_particle,
71 std::shared_ptr<geom::GeomObject> geom,
72 geom::ParticleTransform &transform,
73 std::shared_ptr<mesh::Mesh> mesh,
74 inp::MaterialDeck &material_deck,
75 bool populate_data = true);
76
86 size_t getId() const { return d_id; };
87
92 bool isWall() const { return d_isWall; };
93
99 size_t getGroupId(const std::string &key) const { return d_groups.at(key); };
100
105 size_t getDimension() const { return d_dim; };
106
111 std::shared_ptr<mesh::Mesh> &getMeshP() { return d_mesh_p; };
112
114 const std::shared_ptr<mesh::Mesh> &getMeshP() const { return d_mesh_p; };
115
120 mesh::Mesh &getMesh() { return *d_mesh_p; };
121
123 const mesh::Mesh &getMesh() const { return *d_mesh_p; };
124
129 double getMeshSize() const { return d_h; };
130
135 double getDensity() const { return d_density; };
136
141 double getHorizon() const { return d_horizon; };
142
148 const material::Material * getMaterial() const { return d_material_p.get(); };
149
154 size_t getNumNodes() const { return d_numNodes; };
155
161 size_t getNodeId(size_t i_loc) const { return i_loc + d_globStart; };
162
173 util::Point &getXRef(size_t i) { return d_modelData_p->getXRef(i); };
174 const util::Point &getXRef(size_t i) const { return d_modelData_p->getXRef(i); };
175
181 void setXRef(size_t i, const util::Point &x) { d_modelData_p->setXRef(i, x); };
182
188 void addXRef(size_t i, const util::Point &x) { d_modelData_p->addXRef(i, x); };
189
196 void setXRef(size_t i, int dof, double x) {
197 d_modelData_p->setXRef(i, dof, x);
198 };
199
206 void addXRef(size_t i, int dof, double x) {
207 d_modelData_p->addXRef(i, dof, x);
208 };
209
215 util::Point &getXRefLocal(size_t i) { return d_modelData_p->getXRef(i+d_globStart); };
216 const util::Point &getXRefLocal(size_t i) const { return d_modelData_p->getXRef(i+d_globStart); };
217
223 void setXRefLocal(size_t i, const util::Point &x) { d_modelData_p->setXRef(i+d_globStart, x); };
224
230 void addXRefLocal(size_t i, const util::Point &x) { d_modelData_p->addXRef(i+d_globStart, x); };
231
238 void setXRefLocal(size_t i, int dof, double x) { d_modelData_p->setXRef
239 (i+d_globStart, dof, x); };
240
248 void addXRefLocal(size_t i, int dof, double x) { d_modelData_p->addXRef
249 (i+d_globStart, dof, x); };
250
263 util::Point &getX(size_t i) { return d_modelData_p->getX(i); };
264 const util::Point &getX(size_t i) const { return d_modelData_p->getX(i); };
265
271 void setX(size_t i, const util::Point &x) { d_modelData_p->setX(i, x); };
272
278 void addX(size_t i, const util::Point &x) { d_modelData_p->addX(i, x); };
279
286 void setX(size_t i, int dof, double x) { d_modelData_p->setX(i, dof, x); };
287
294 void addX(size_t i, int dof, double x) { d_modelData_p->addX(i, dof, x); };
295
301 util::Point &getXLocal(size_t i) { return d_modelData_p->getX(i+d_globStart); };
302 const util::Point &getXLocal(size_t i) const { return d_modelData_p->getX(i+d_globStart); };
303
309 void setXLocal(size_t i, const util::Point &x) { d_modelData_p->setX(i+d_globStart, x); };
310
316 void addXLocal(size_t i, const util::Point &x) { d_modelData_p->addX(i+d_globStart, x); };
317
324 void setXLocal(size_t i, int dof, double x) { d_modelData_p->setX
325 (i+d_globStart, dof, x); };
326
333 void addXLocal(size_t i, int dof, double x) { d_modelData_p->addX
334 (i+d_globStart, dof, x); };
335
348 util::Point &getU(size_t i) { return d_modelData_p->getU(i); };
349 const util::Point &getU(size_t i) const { return d_modelData_p->getU(i); };
350
356 void setU(size_t i, const util::Point &u) { d_modelData_p->setU(i, u); };
357
363 void addU(size_t i, const util::Point &u) { d_modelData_p->addU(i, u); };
364
371 void setU(size_t i, int dof, double u) { d_modelData_p->setU(i, dof, u); };
372
379 void addU(size_t i, int dof, double u) { d_modelData_p->addU(i, dof, u); };
380
386 util::Point &getULocal(size_t i) { return d_modelData_p->getU(i+d_globStart); };
387
389 const util::Point &getULocal(size_t i) const { return d_modelData_p->getU(i+d_globStart); };
390
396 void setULocal(size_t i, const util::Point &u) { d_modelData_p->setU(i+d_globStart, u); };
397
403 void addULocal(size_t i, const util::Point &u) { d_modelData_p->addU(i+d_globStart, u); };
404
411 void setULocal(size_t i, int dof, double u) { d_modelData_p->setU
412 (i+d_globStart, dof, u); };
413
420 void addULocal(size_t i, int dof, double u) { d_modelData_p->addU
421 (i+d_globStart, dof, u); };
422
435 util::Point &getV(size_t i) { return d_modelData_p->getV(i); };
436 const util::Point &getV(size_t i) const { return d_modelData_p->getV(i); };
437
443 void setV(size_t i, const util::Point &v) { d_modelData_p->setV(i, v); };
444
450 void addV(size_t i, const util::Point &v) { d_modelData_p->addV(i, v); };
451
458 void setV(size_t i, int dof, double v) { d_modelData_p->setV(i, dof, v); };
459
466 void addV(size_t i, int dof, double v) { d_modelData_p->addV(i, dof, v); };
467
473 util::Point &getVLocal(size_t i) { return d_modelData_p->getV(i+d_globStart); };
474 const util::Point &getVLocal(size_t i) const { return d_modelData_p->getV(i+d_globStart); };
475
481 void setVLocal(size_t i, const util::Point &v) { d_modelData_p->setV(i+d_globStart, v); };
482
488 void addVLocal(size_t i, const util::Point &v) { d_modelData_p->addV(i+d_globStart, v); };
489
496 void setVLocal(size_t i, int dof, double v) { d_modelData_p->setV
497 (i+d_globStart, dof, v); };
498
505 void addVLocal(size_t i, int dof, double v) { d_modelData_p->addV
506 (i+d_globStart, dof, v); };
507
520 util::Point &getF(size_t i) { return d_modelData_p->getF(i); };
521 const util::Point &getF(size_t i) const { return d_modelData_p->getF(i); };
522
528 void setF(size_t i, const util::Point &f) { d_modelData_p->setF(i, f); };
529
535 void addF(size_t i, const util::Point &f) { d_modelData_p->addF(i, f); };
536
543 void setF(size_t i, int dof, double f) { d_modelData_p->setF(i, dof, f); };
544
551 void addF(size_t i, int dof, double f) { d_modelData_p->addF(i, dof, f); };
552
558 util::Point &getFLocal(size_t i) { return d_modelData_p->getF(i+d_globStart); };
559 const util::Point &getFLocal(size_t i) const { return d_modelData_p->getF(i+d_globStart); };
560
566 void setFLocal(size_t i, const util::Point &f) { d_modelData_p->setF(i+d_globStart, f); };
567
573 void addFLocal(size_t i, const util::Point &f) { d_modelData_p->addF(i+d_globStart, f); };
574
581 void setFLocal(size_t i, int dof, double f) { d_modelData_p->setF
582 (i+d_globStart, dof, f); };
583
590 void addFLocal(size_t i, int dof, double f) { d_modelData_p->addF
591 (i+d_globStart, dof, f); };
592
605 double &getVol(size_t i) { return d_modelData_p->getVol(i); };
606 const double &getVol(size_t i) const { return d_modelData_p->getVol(i); };
607
613 void setVol(size_t i, const double &vol) { d_modelData_p->setVol(i, vol); };
614
620 void addVol(size_t i, const double &vol) { d_modelData_p->addVol(i, vol); };
621
627 double &getVolLocal(size_t i) { return d_modelData_p->getVol(i+d_globStart); };
628 const double &getVolLocal(size_t i) const { return d_modelData_p->getVol(i+d_globStart); };
629
635 void setVolLocal(size_t i, const double &vol) { d_modelData_p->setVol(i+d_globStart, vol); };
636
642 void addVolLocal(size_t i, const double &vol) { d_modelData_p->addVol(i+d_globStart, vol); };
643
656 uint8_t &getFix(size_t i) { return d_modelData_p->getFix(i); };
657 const uint8_t &getFix(size_t i) const { return d_modelData_p->getFix(i); };
658
665 void setFix(size_t i, const unsigned int &dof, const bool &flag) {
666 d_modelData_p->setFix(i, dof, flag);
667 };
668
674 uint8_t &getFixLocal(size_t i) { return d_modelData_p->getFix(i+d_globStart); };
675 const uint8_t &getFixLocal(size_t i) const { return d_modelData_p->getFix(i+d_globStart); };
676
683 void setFixLocal(size_t i, const unsigned int &dof, const bool &flag) {
684 d_modelData_p->setFix(i+d_globStart, dof, flag);
685 };
686
699 double &getMx(size_t i) { return d_modelData_p->getMx(i); };
700 const double &getMx(size_t i) const { return d_modelData_p->getMx(i); };
701
707 void setMx(size_t i, const double &mx) { d_modelData_p->setMx(i, mx); };
708
714 void addMx(size_t i, const double &mx) { d_modelData_p->addMx(i, mx); };
715
721 double &getMxLocal(size_t i) { return d_modelData_p->getMx(i+d_globStart); };
722 const double &getMxLocal(size_t i) const { return d_modelData_p->getMx(i+d_globStart); };
723
729 void setMxLocal(size_t i, const double &mx) { d_modelData_p->setMx(i+d_globStart, mx); };
730
736 void addMxLocal(size_t i, const double &mx) { d_modelData_p->addMx(i+d_globStart, mx); };
737
750 double &getThetax(size_t i) { return d_modelData_p->getThetax(i); };
751 const double &getThetax(size_t i) const { return d_modelData_p->getThetax(i)
752 ; };
753
759 void setThetax(size_t i, const double &thetax) { d_modelData_p->setThetax
760 (i, thetax); };
761
767 void addThetax(size_t i, const double &thetax) { d_modelData_p->addThetax
768 (i, thetax); };
769
775 double &getThetaxLocal(size_t i) { return d_modelData_p->getThetax(i+d_globStart); };
776 const double &getThetaxLocal(size_t i) const { return d_modelData_p->getThetax(i+d_globStart)
777 ; };
778
784 void setThetaxLocal(size_t i, const double &thetax) { d_modelData_p->setThetax
785 (i+d_globStart, thetax); };
786
792 void addThetaxLocal(size_t i, const double &thetax) { d_modelData_p->addThetax
793 (i+d_globStart, thetax); };
794
806 size_t getCenterNodeId() const { return d_rp_p->getCenterNodeId(); };
807
812 double getParticleRadius() const { return d_pRadius; };
813
819 return d_modelData_p->getX(d_globStart + d_rp_p->getCenterNodeId());
820 };
821
823 const util::Point &getXCenter() const {
824 return d_modelData_p->getX(d_globStart + d_rp_p->getCenterNodeId());
825 };
826
832 return d_modelData_p->getU(d_globStart + d_rp_p->getCenterNodeId());
833 };
834
836 const util::Point &getUCenter() const {
837 return d_modelData_p->getU(d_globStart + d_rp_p->getCenterNodeId());
838 };
839
845 return d_modelData_p->getV(d_globStart + d_rp_p->getCenterNodeId());
846 };
847
849 const util::Point &getVCenter() const {
850 return d_modelData_p->getV(d_globStart + d_rp_p->getCenterNodeId());
851 };
861 std::string printStr(int nt = 0, int lvl = 0) const;
862
869 void print(int nt = 0, int lvl = 0) const { std::cout << printStr(nt, lvl); }
870
871public:
874
876 size_t d_id;
877
879 std::map<std::string, size_t> d_groups;
880
882 size_t d_dim;
883
886
888 double d_pRadius;
889
891 double d_h;
892
898
901
907
909 double d_horizon;
910
912 double d_density;
913
915 std::unique_ptr<material::Material> d_material_p;
916
918 double d_Rc;
919
921 double d_Kn;
922
925
927 size_t d_globEnd;
928
932
936
938 std::shared_ptr<data::ModelData> d_modelData_p;
939
941 std::shared_ptr<particle::RefParticle> d_rp_p;
942
944 std::shared_ptr<geom::GeomObject> d_geom_p;
945
948
950 std::shared_ptr<mesh::Mesh> d_mesh_p;
951};
952
953} // namespace particle
954
955#endif // PARTICLE_BASEPARTICLE_H
Collection of methods and database related to peridynamic material.
Definition material.h:98
A class for mesh data.
Definition mesh.h:53
A class to store particle geometry, nodal discretization, and methods.
void setX(size_t i, int dof, double x)
Set specific current coordinate of the node.
void addMx(size_t i, const double &mx)
Add to weighted-volume (mx) of the node.
const util::Point & getXRef(size_t i) const
Get reference coordinate of the node.
void addU(size_t i, int dof, double u)
Add to displacement of the node.
void setFixLocal(size_t i, const unsigned int &dof, const bool &flag)
Set fixity of the node given node's local id.
void setThetax(size_t i, const double &thetax)
Set volumetric deformation (thetax) of the node.
double getHorizon() const
Get horizon.
const util::Point & getXRefLocal(size_t i) const
Get reference coordinate of the node.
double & getMxLocal(size_t i)
Get weighted-volume (mx) of the node given node's local id.
util::Point & getXRef(size_t i)
Get reference coordinate of the node.
double getMeshSize() const
Get mesh size.
double d_Rc
Contact radius for contact between internal nodes of particle.
const double & getThetax(size_t i) const
Get volumetric deformation (thetax) of the node.
geom::ParticleTransform d_tform
Transformation related data.
void addF(size_t i, int dof, double f)
Add to force of the node.
void addULocal(size_t i, const util::Point &u)
Add to displacement of the node given node's local id.
void setVol(size_t i, const double &vol)
Set volume of the node.
util::Point & getVLocal(size_t i)
Get velocity of the node given node's local id.
void addFLocal(size_t i, const util::Point &f)
Add to force of the node given node's local id.
void addMxLocal(size_t i, const double &mx)
Add to weighted-volume (mx) of the node given node's local id.
const double & getThetaxLocal(size_t i) const
Get volumetric deformation (thetax) of the node.
const util::Point & getUCenter() const
Get displacement of center node.
bool d_allDofsConstrained
Specify if all dofs are constrained so we do not update displacement, velocity, and force data.
bool d_computeForce
Specify if we compute force.
double getParticleRadius() const
Get radius of reference particle.
void setVLocal(size_t i, const util::Point &v)
Set velocity of the node given node's local id.
double & getThetaxLocal(size_t i)
Get volumetric deformation (thetax) of the node given node's local id.
size_t d_globQuadEnd
Id of last node of this object in global quadrature data list, e.g., strain in elements at quadrature...
util::Point & getVCenter()
Get velocity of center node.
double d_horizon
horizon
void addThetax(size_t i, const double &thetax)
Add to volumetric deformation (thetax) of the node.
void addXRefLocal(size_t i, int dof, double x)
Add to specific reference coordinate of the node given node's local id.
void setXRef(size_t i, const util::Point &x)
Set reference coordinate of the node.
const util::Point & getU(size_t i) const
Get displacement of the node.
void setFLocal(size_t i, int dof, double f)
Set force of the node given node's local id.
size_t getId() const
Get id.
size_t getGroupId(const std::string &key) const
Get group id for given key.
void addVol(size_t i, const double &vol)
Add to volume of the node.
double d_pRadius
Particle radius.
void addThetaxLocal(size_t i, const double &thetax)
Add to volumetric deformation (thetax) of the node given node's local id.
double & getThetax(size_t i)
Get volumetric deformation (thetax) of the node.
void setFLocal(size_t i, const util::Point &f)
Set force of the node given node's local id.
double & getVol(size_t i)
Get volume of the node.
void setF(size_t i, int dof, double f)
Set force of the node.
size_t getNumNodes() const
Get the number of nodes.
void setXRefLocal(size_t i, int dof, double x)
Set specific reference coordinate of the node given node's local id.
void setMxLocal(size_t i, const double &mx)
Set weighted-volume (mx) of the node given node's local id.
void setF(size_t i, const util::Point &f)
Set force of the node.
void addULocal(size_t i, int dof, double u)
Add to displacement of the node given node's local id.
void setMx(size_t i, const double &mx)
Set weighted-volume (mx) of the node.
double d_h
mesh size
double getDensity() const
Get density.
util::Point & getU(size_t i)
Get displacement of the node.
size_t d_numNodes
Number of nodes in this particle.
const util::Point & getX(size_t i) const
Get current coordinate of the node.
void addX(size_t i, int dof, double x)
Add to specific current coordinate of the node.
const util::Point & getF(size_t i) const
Get force of the node.
void print(int nt=0, int lvl=0) const
Prints the information about the object.
void addXRefLocal(size_t i, const util::Point &x)
Add to reference coordinate of the node given node's local id.
const util::Point & getVCenter() const
Get velocity of center node.
size_t d_globStart
Id of first node of this object in global node list.
const mesh::Mesh & getMesh() const
Get reference to mesh object.
double d_density
density
const std::shared_ptr< mesh::Mesh > & getMeshP() const
Get pointer to mesh object.
void addVLocal(size_t i, const util::Point &v)
Add to velocity of the node given node's local id.
util::Point & getULocal(size_t i)
Get displacement of the node given node's local id.
void addXLocal(size_t i, int dof, double x)
Add to specific current coordinate of the node given node's local id.
const double & getMx(size_t i) const
Get weighted-volume (mx) of the node.
double & getMx(size_t i)
Get weighted-volume (mx) of the node.
size_t getCenterNodeId() const
Get id of center node of particle.
const util::Point & getFLocal(size_t i) const
Get force of the node.
uint8_t & getFix(size_t i)
Get fixity of the node.
void setX(size_t i, const util::Point &x)
Set current coordinate of the node.
void setXLocal(size_t i, const util::Point &x)
Set current coordinate of the node given node's local id.
void addF(size_t i, const util::Point &f)
Add to force of the node.
void setULocal(size_t i, const util::Point &u)
Set displacement of the node given node's local id.
void setXLocal(size_t i, int dof, double x)
Set specific current coordinate of the node given node's local id.
const double & getVolLocal(size_t i) const
Get volume of the node.
void setVolLocal(size_t i, const double &vol)
Set volume of the node given node's local id.
void addFLocal(size_t i, int dof, double f)
Add to force of the node given node's local id.
std::shared_ptr< mesh::Mesh > & getMeshP()
Get pointer to mesh object.
size_t d_globQuadStart
Id of first node of this object in global quadrature data list, e.g., strain in elements at quadratur...
void setULocal(size_t i, int dof, double u)
Set displacement of the node given node's local id.
void addV(size_t i, int dof, double v)
Add to velocity of the node.
void setU(size_t i, int dof, double u)
Set displacement of the node.
size_t getNodeId(size_t i_loc) const
Get global id of node given the local id of node in this object.
const material::Material * getMaterial() const
Get id.
util::Point & getX(size_t i)
Get current coordinate of the node.
size_t d_id
Id of this particle in all particles list.
util::Point & getF(size_t i)
Get force of the node.
std::shared_ptr< geom::GeomObject > d_geom_p
Geometrical object defining this particle.
double & getVolLocal(size_t i)
Get volume of the node given node's local id.
int d_mpiOwner
MPI owner rank for this grain (-1 = wall / all ranks). Used by particle-parallel (T09); ignored when ...
bool isWall() const
Is this particle a wall?
util::Point & getUCenter()
Get displacement of center node.
void setV(size_t i, int dof, double v)
Set velocity of the node.
const util::Point & getV(size_t i) const
Get velocity of the node.
util::Point & getXCenter()
Get current coordinate of center node.
material::Material * getMaterial()
Get pointer to material object.
const util::Point & getXCenter() const
Get current coordinate of center node.
size_t d_dim
Dimension of this particle.
void setFix(size_t i, const unsigned int &dof, const bool &flag)
Set fixity of the node.
const util::Point & getULocal(size_t i) const
Get displacement of the node given node's local id.
void setThetaxLocal(size_t i, const double &thetax)
Set volumetric deformation (thetax) of the node given node's local id.
void addXLocal(size_t i, const util::Point &x)
Add to current coordinate of the node given node's local id.
std::map< std::string, size_t > d_groups
Map that provides different groups of this particle.
const uint8_t & getFixLocal(size_t i) const
Get fixity of the node.
void setV(size_t i, const util::Point &v)
Set velocity of the node.
void addXRef(size_t i, const util::Point &x)
Add reference coordinate of the node.
void addVolLocal(size_t i, const double &vol)
Add to volume of the node given node's local id.
util::Point & getV(size_t i)
Get velocity of the node.
std::shared_ptr< mesh::Mesh > d_mesh_p
Pointer to mesh on reference particle.
void addX(size_t i, const util::Point &x)
Add current coordinate of the node.
util::Point & getXLocal(size_t i)
Get current coordinate of the node given node's local id.
size_t getDimension() const
Get the dimension of the domain.
util::Point & getXRefLocal(size_t i)
Get reference coordinate of the node given node's local id.
const util::Point & getXLocal(size_t i) const
Get current coordinate of the node.
uint8_t & getFixLocal(size_t i)
Get fixity of the node given node's local id.
void setXRef(size_t i, int dof, double x)
Set specific reference coordinate of the node.
void setU(size_t i, const util::Point &u)
Set displacement of the node.
void addVLocal(size_t i, int dof, double v)
Add to velocity of the node given node's local id.
void setVLocal(size_t i, int dof, double v)
Set velocity of the node given node's local id.
util::Point & getFLocal(size_t i)
Get force of the node given node's local id.
const double & getMxLocal(size_t i) const
Get weighted-volume (mx) of the node.
mesh::Mesh & getMesh()
Get reference to mesh object.
void addXRef(size_t i, int dof, double x)
Add specific reference coordinate of the node.
const uint8_t & getFix(size_t i) const
Get fixity of the node.
void addV(size_t i, const util::Point &v)
Add to velocity of the node.
size_t d_globEnd
Id of last node of this object in global node list.
const util::Point & getVLocal(size_t i) const
Get velocity of the node.
void setXRefLocal(size_t i, const util::Point &x)
Set reference coordinate of the node given node's local id.
void addU(size_t i, const util::Point &u)
Add to displacement of the node.
std::string printStr(int nt=0, int lvl=0) const
Returns the string containing printable information about the object.
std::unique_ptr< material::Material > d_material_p
Pointer to peridynamic material object.
double d_Kn
Normal contact coefficient for internal contact.
const double & getVol(size_t i) const
Get volume of the node.
std::shared_ptr< particle::RefParticle > d_rp_p
Pointer to reference particle.
std::shared_ptr< data::ModelData > d_modelData_p
Reference to model class.
Collection of methods and data related to finite element and mesh.
Definition mesh.cpp:29
Collection of methods and data related to particle object.
Definition modelData.h:36
A struct that stores transformation parameters and provides method to transform the particle....
Structure to read and store material related data.
A structure to represent 3d vectors.
Definition point.h:30