Karamelo  714599e9
Parallel Material Point Method Simulator
solid.h
1 /* -*- c++ -*- ----------------------------------------------------------
2  *
3  * *** Karamelo ***
4  * Parallel Material Point Method Simulator
5  *
6  * Copyright (2019) Alban de Vaucorbeil, alban.devaucorbeil@monash.edu
7  * Materials Science and Engineering, Monash University
8  * Clayton VIC 3800, Australia
9 
10  * This software is distributed under the GNU General Public License.
11  *
12  * ----------------------------------------------------------------------- */
13 
14 #ifndef MPM_SOLID_H
15 #define MPM_SOLID_H
16 
17 #include "pointers.h"
18 #include "material.h"
19 #include "grid.h"
20 #include <vector>
21 #include <Eigen/Eigen>
22 
23 
24 using namespace Eigen;
25 
36 class Solid : protected Pointers {
37  public:
38  string id;
39  bigint np;
40  int np_local;
41  int comm_n;
42  double vtot;
43  double mtot;
44 
45  vector<tagint> ptag;
46 
47  double solidlo[3], solidhi[3];
48  double solidsublo[3], solidsubhi[3];
49 
50  vector<Eigen::Vector3d> x;
51  vector<Eigen::Vector3d> x0;
52 
53 
54  vector<Eigen::Vector3d> rp;
55  vector<Eigen::Vector3d> rp0;
56  vector<Eigen::Vector3d> xpc;
57  vector<Eigen::Vector3d> xpc0;
58  int nc;
59 
60  vector<Eigen::Vector3d> v;
61  vector<Eigen::Vector3d> v_update;
62 
63  vector<Eigen::Vector3d> a;
64 
65  vector<Eigen::Vector3d> mbp;
66  vector<Eigen::Vector3d> f;
67 
68  vector<Eigen::Matrix3d> sigma;
69  vector<Eigen::Matrix3d> strain_el;
70  vector<Eigen::Matrix3d> vol0PK1;
71  vector<Eigen::Matrix3d> L;
72  vector<Eigen::Matrix3d> F;
73  vector<Eigen::Matrix3d> R;
74  vector<Eigen::Matrix3d> D;
75  vector<Eigen::Matrix3d> Finv;
76  vector<Eigen::Matrix3d> Fdot;
77  vector<Eigen::Matrix3d> Di;
78 
79  vector<double> J;
80  vector<double> vol0;
81  vector<double> vol;
82  vector<double> rho0;
83  vector<double> rho;
84  vector<double> mass;
85  vector<double> eff_plastic_strain;
86  vector<double> eff_plastic_strain_rate;
87  vector<double> damage;
88  vector<double> damage_init;
89  vector<double> T;
90  vector<double> ienergy;
91  vector<double> pH_regu;
92  vector<int> mask;
93  vector<bool> check;
94 
96  double dtCFL;
97 
98  vector<int> numneigh_pn;
99  vector<int> numneigh_np;
100  vector<vector<int>> neigh_pn;
101  vector<vector<int>> neigh_np;
102 
103  vector<vector< double >> wf_pn;
104  vector<vector< double >> wf_np;
105  vector<vector< double >> wf_pn_corners;
106 
107  vector<vector< Eigen::Vector3d >> wfd_pn;
108  vector<vector< Eigen::Vector3d >> wfd_np;
109 
110 
111  struct Mat *mat;
112 
113  class Grid *grid;
114 
115  string method_type;
116 
117  Solid(class MPM *, vector<string>);
118  virtual ~Solid();
119 
120  void init();
121  void options(vector<string> *, vector<string>::iterator);
122  void grow(int);
123 
124  void compute_mass_nodes(bool);
125  void compute_velocity_nodes(bool);
126  void compute_velocity_nodes_APIC(bool);
127  void compute_external_forces_nodes(bool);
128  void compute_internal_forces_nodes_TL();
129  void compute_internal_forces_nodes_UL(bool);
130  void compute_particle_velocities_and_positions();
131  void compute_particle_acceleration();
132  void update_particle_velocities(double);
133  void compute_rate_deformation_gradient_TL();
136  void compute_rate_deformation_gradient_TL_APIC();
137  void compute_rate_deformation_gradient_UL_USL();
138  void compute_rate_deformation_gradient_UL_MUSL();
139  void compute_rate_deformation_gradient_UL_APIC();
140  void update_deformation_gradient();
141  void update_stress();
142  void compute_inertia_tensor(string);
143  void compute_deformation_gradient();
144  void update_particle_domain();
145 
146  void copy_particle(int, int);
147  void pack_particle(int, vector<double> &);
150  void unpack_particle(int &, vector<int>, double[]);
151 
152 private:
153  void populate(vector<string>);
154  void read_mesh(string);
155  void read_file(string);
156 
157  const map<string, string> usage ={
158  {"region", "Usage: solid(solid-ID, \033[1;32mregion\033[0m, region-ID, N_ppc1D, material-ID, cell-size, T0)\n"},
159  {"mesh", "Usage: solid(solid-ID, \033[1;32mmesh\033[0m, meshfile, material-ID, h, T0)\n"},
160  {"file", "Usage: solid(solid-ID, \033[1;32mfile\033[0m, filename, material-ID, h, T0)\n"}
161  };
162  const map<string, int> Nargs = {
163  {"region", 7},
164  {"mesh", 6},
165  {"file", 6}
166  };
167 
168  double T0;
169  bool is_TL, apic;
170 };
171 
172 #endif
173 
vector< double > damage_init
Particles&#39; damage initiation variable.
Definition: solid.h:88
vector< vector< Eigen::Vector3d > > wfd_np
Array of arrays (matrix) of the derivative of the weight functions effectively the transpose of wfd_...
Definition: solid.h:108
vector< Eigen::Matrix3d > vol0PK1
Transpose of the 1st Piola-Kirchhoff matrix times vol0.
Definition: solid.h:70
vector< double > T
Particles&#39; temperature.
Definition: solid.h:89
vector< Eigen::Matrix3d > sigma
Stress matrix.
Definition: solid.h:68
string method_type
Either tlmpm, tlcpdi, tlcpdi2, ulmpm, ulcpdi, or ulcpdi2 (all kinds of MPM supported) ...
Definition: solid.h:115
vector< Eigen::Vector3d > v
Particles&#39; current velocity.
Definition: solid.h:60
void init(double *, double *)
Create the array of nodes. Give them their position, tag, and type.
Definition: grid.cpp:79
vector< vector< double > > wf_pn
Array of arrays (matrix) of the weight functions .
Definition: solid.h:103
vector< vector< int > > neigh_pn
List of the nodes neighbouring a given particle.
Definition: solid.h:100
vector< vector< Eigen::Vector3d > > wfd_pn
Array of arrays (matrix) of the derivative of the weight functions .
Definition: solid.h:107
vector< double > eff_plastic_strain_rate
Particles&#39; effective plastic strain rate.
Definition: solid.h:86
Definition: mpm.h:29
Definition: grid.h:54
vector< vector< double > > wf_np
Array of arrays (matrix) of the weight functions effectively the transpose of wf_pn.
Definition: solid.h:104
vector< double > J
Determinant of the deformation matrix.
Definition: solid.h:79
vector< Eigen::Vector3d > a
Particles&#39; acceleration.
Definition: solid.h:63
vector< Eigen::Vector3d > f
Particles&#39; internal forces.
Definition: solid.h:66
vector< Eigen::Matrix3d > Fdot
Rate of deformation gradient matrix.
Definition: solid.h:76
vector< Eigen::Matrix3d > L
Velocity gradient matrix.
Definition: solid.h:71
vector< Eigen::Vector3d > x
Particles&#39; current position.
Definition: solid.h:50
vector< Eigen::Matrix3d > F
Deformation gradient matrix.
Definition: solid.h:72
vector< double > vol
Particles&#39; current volume.
Definition: solid.h:81
vector< tagint > ptag
Unique identifier for particles in the system.
Definition: solid.h:45
string id
Solid id.
Definition: solid.h:38
vector< double > rho0
Particles&#39; reference density.
Definition: solid.h:82
vector< Eigen::Matrix3d > D
Symmetric part of L.
Definition: solid.h:74
bigint np
Total number of particles in the domain.
Definition: solid.h:39
double mtot
Total mass.
Definition: solid.h:43
vector< Eigen::Vector3d > rp0
Reference domain vector (CPDI1)
Definition: solid.h:55
double vtot
Total volume.
Definition: solid.h:42
vector< int > numneigh_np
Number of nodes neighbouring a given node.
Definition: solid.h:99
int comm_n
Number of double to pack for particle exchange between CPU.
Definition: solid.h:41
vector< double > rho
Particles&#39; current density.
Definition: solid.h:83
vector< double > damage
Particles&#39; damage variable.
Definition: solid.h:87
int nc
Number of corners per particles: .
Definition: solid.h:58
vector< Eigen::Matrix3d > R
Rotation matrix.
Definition: solid.h:73
Definition: solid.h:36
vector< double > mass
Particles&#39; current mass.
Definition: solid.h:84
vector< int > mask
Particles&#39; group mask.
Definition: solid.h:92
vector< Eigen::Vector3d > v_update
Particles&#39; velocity at time t+dt.
Definition: solid.h:61
vector< double > pH_regu
Particles&#39; regularized hydrostatic pressure.
Definition: solid.h:91
vector< double > eff_plastic_strain
Particles&#39; effective plastic strain.
Definition: solid.h:85
vector< Eigen::Vector3d > rp
Current domain vector (CPDI1)
Definition: solid.h:54
vector< int > numneigh_pn
Number of nodes neighbouring a given particle.
Definition: solid.h:98
vector< Eigen::Vector3d > x0
Particles&#39; reference position.
Definition: solid.h:51
vector< Eigen::Matrix3d > Finv
Inverse of the deformation gradient matrix.
Definition: solid.h:75
class Grid * grid
Pointer to the background grid.
Definition: solid.h:113
vector< vector< double > > wf_pn_corners
Array of arrays (matrix) of the weight functions evaluated at the corners of the particle&#39;s domain (...
Definition: solid.h:105
Definition: material.h:45
vector< Eigen::Vector3d > xpc
Current position of the corners of the particles&#39; domain (CPDI2o)
Definition: solid.h:56
vector< Eigen::Matrix3d > strain_el
Elastic strain matrix.
Definition: solid.h:69
vector< Eigen::Vector3d > xpc0
Reference position of the corners of the particles&#39; domain (CPDI2)
Definition: solid.h:57
Definition: pointers.h:29
vector< Eigen::Vector3d > mbp
Particles&#39; external forces times mass.
Definition: solid.h:65
vector< vector< int > > neigh_np
List of the particles neighbouring a given node.
Definition: solid.h:101
int np_local
Number of local particles (in this CPU)
Definition: solid.h:40
double max_p_wave_speed
Maximum of the particle wave speed.
Definition: solid.h:95
struct Mat * mat
Pointer to the material.
Definition: solid.h:111
void grow(int)
Allocate memory for the vectors used for local nodes or resize them.
Definition: grid.cpp:460
vector< Eigen::Matrix3d > Di
Inertia tensor.
Definition: solid.h:77
vector< double > ienergy
Particles&#39; internal energy.
Definition: solid.h:90
vector< double > vol0
Particles&#39; reference volume.
Definition: solid.h:80