59 {
60
61
62 std::string output_dir = "./out/";
63 std::string input_dir = "./inp/";
64 std::filesystem::create_directories(output_dir);
65 std::filesystem::create_directories(input_dir);
66
67
68 const std::vector<double> center = {0.0, 0.0, 0.0};
69 const double R1 = 0.001;
70 const double R2 = 0.001;
71 const double mesh_size = std::min(R1, R2) / 5.0;
72 const double horizon = 3.0 * mesh_size;
73 const double particle_dist = 0.001;
74
75
76 const double poisson1 = 0.25;
77 const double rho1 = 1200.0;
78 const double K1 = 2.16e+7;
81 const double Gc1 = 50.0;
82
83 const double poisson2 = 0.25;
84 const double rho2 = 1200.0;
85 const double K2 = 2.16e+7;
88 const double Gc2 = 50.0;
89
90
91 const double R_contact_factor = 0.95;
92 const double Kn_11 = 18.0 *
util::harmonicMean(K1, K1) / (M_PI * std::pow(horizon, 5));
93 const double Kn_22 = 18.0 *
util::harmonicMean(K2, K2) / (M_PI * std::pow(horizon, 5));
94 const double Kn_12 = 18.0 *
util::harmonicMean(K1, K2) / (M_PI * std::pow(horizon, 5));
95 const double beta_n_eps = 0.9;
96 const double friction_coeff = 0.5;
97 const double beta_n_factor = 100.0;
98
99
100
101
102 std::vector<double> p1_center = center;
103 std::string mesh1_file_name = input_dir + "mesh_cir_1";
104 auto mesh_geom_1 = std::make_shared<geom::Circle>(
105 R1,
util::Point(p1_center[0], p1_center[1], p1_center[2]));
107 nullptr, nullptr, nullptr);
108
109
110 std::vector<double> p2_center = center;
111 std::string mesh2_file_name = input_dir + "mesh_cir_2";
112 auto mesh_geom_2 = std::make_shared<geom::Circle>(
113 R2,
util::Point(p2_center[0], p2_center[1], p2_center[2]));
115 nullptr, nullptr, nullptr);
116
117
118 const double final_time = 0.0001;
119 const size_t num_steps = 1000;
120 const size_t dt_out_n = num_steps / 4;
122 "finite_difference", "central_difference",
123 true, 2, "Multi_Particle", 0);
124
125
127 std::vector<std::string>({"Displacement", "Velocity", "Force", "Damage_Z", "Damage", "Particle_ID"}),
128 dt_out_n, 2, true, "zlib", true, 1, "");
129
130
132
133
135 {0}, {}, "", {}, "", {},
136 {1, 2}, true, "", {});
137
138
139 const double free_fall_dist = particle_dist - horizon;
140 const double free_fall_vel = -std::sqrt(2.0 * std::abs(-10.0) * free_fall_dist);
142 {1}, {}, "", {}, "", {},
143 {}, false, "Constant_Velocity", {0.0, free_fall_vel, 0.0});
144
145
146 auto pDeckJson =
json({});
147
148
149 std::vector<geom::GeomData> pGeomVec(2);
150
151
152 pGeomVec[0].d_geomName = "circle";
153 pGeomVec[0].d_geomParams = {R1, p1_center[0], p1_center[1], p1_center[2]};
154
155
156 pGeomVec[1].d_geomName = "circle";
157 pGeomVec[1].d_geomParams = {R2, p2_center[0], p2_center[1], p2_center[2]};
158
160
161
163 mesh1_file_name + ".msh",
164 mesh2_file_name + ".msh"
165 });
166
167
169
170
172 0, rho1, K1, G1, Gc1, true, 1);
173
174
176 0, rho2, K2, G2, Gc2, true, 1);
177
178 pDeckJson["Material"] = pMatJson;
179
180
182
183
185 true, false, false,
186 Kn_11, beta_n_eps, friction_coeff, 1.0, beta_n_factor, 1.0, 0.0, 0.0);
187
188
189 pContactJson["Set_1_1"] = contact_base;
190 pContactJson["Set_1_1"]["Kn"] = Kn_11;
191
192
193 pContactJson["Set_1_2"] = contact_base;
194 pContactJson["Set_1_2"]["Kn"] = Kn_12;
195
196
197 pContactJson["Set_2_2"] = contact_base;
198 pContactJson["Set_2_2"]["Kn"] = Kn_22;
199
200 pDeckJson["Contact"] = pContactJson;
201
202
204
205
207
208
209 pGenJson["Data"]["N"] = 2;
210
211
212 pGenJson["Data"]["0"] = {
213 {"x", R1}, {"y", R1}, {"z", 0.0},
214 {"theta", 0.0}, {"s", 1.0},
215 {"geom_id", 0}, {"mat_id", 0}, {"contact_id", 0}
216 };
217
218
219 pGenJson["Data"]["1"] = {
220 {"x", R1}, {"y", 2.0 * R1 + R2 + particle_dist}, {"z", 0.0},
221 {"theta", M_PI * 0.5}, {"s", 1.0},
222 {"geom_id", 1}, {"mat_id", 1}, {"contact_id", 1}
223 };
224
225
226 pDeckJson["Particle_Generation"] = pGenJson;
227
228
229 auto inputJson =
json({{
"Model", modelDeckJson},
230 {"Output", outputDeckJson},
231 {"Force_BC", bcDeckJson["Force_BC"]},
232 {"Displacement_BC", bcDeckJson["Displacement_BC"]},
233 {"IC", bcDeckJson["IC"]},
234 {"Particle", pDeckJson["Particle"]},
235 {"Mesh", pDeckJson["Mesh"]},
236 {"Material", pDeckJson["Material"]},
237 {"Contact", pDeckJson["Contact"]},
238 {"Neighbor", pDeckJson["Neighbor"]},
239 {"Particle_Generation", pDeckJson["Particle_Generation"]}});
240
241
242 std::cout << "\n\nPrinting global input deck json:\n";
243 std::cout << inputJson.dump(2) << std::endl;
244
245
246 std::ofstream f(input_dir + "/input.json");
247 f << inputJson.dump(2);
248 f.close();
249
250 return inputJson;
251}
nlohmann::ordered_json json
double toGE(double E, double nu)
Compute shear modulus from Young's modulus E and Poisson's ratio nu.
double toE(double K, double nu)
Compute Young's modulus E from Bulk modulus K and Poisson's ratio nu.
void generateBuiltinParticleMeshGmsh(const std::shared_ptr< geom::GeomObject > &geomObj, double h, const std::string &filenameStem, bool vtk_out, bool write_mesh_file, mesh::Mesh *out_mesh, const inp::MeshDeck *meshDeck, const inp::ModelDeck *modelDeck)
In-process Gmsh mesh from geom::GeomObject (after createGeomObject on deck / Particle data).
double harmonicMean(const double &m1, const double &m2)
Input data for geometrical objects.
static json getExampleJson(std::string type="Foce_BC", bool isRegionActive=false, geom::GeomData regionGeomData=geom::GeomData(), std::vector< size_t > pList=std::vector< size_t >(), std::vector< size_t > pNotList=std::vector< size_t >(), std::string timeFnType="", std::vector< double > timeFnParams=std::vector< double >(), std::string spatialFnType="", std::vector< double > spatialFnParams=std::vector< double >(), std::vector< size_t > direction=std::vector< size_t >(), bool isDisplacementZero=false, std::string icType="", std::vector< double > icVec=std::vector< double >())
Returns example JSON object for ModelDeck configuration.
static json getExampleJson(size_t nForceSets=0, size_t nDispSets=0, size_t nICSets=0, bool gravityActive=false, util::Point gravity=util::Point())
Returns example JSON object for ModelDeck configuration.
static json getExampleJson(std::string materialType="PDState", bool isPlainStrain=false, double horizon=-1., double horizonMeshRatio=-1., double density=1., double K=0., double G=0., double Gc=0., bool computeParamsFromElastic=true, size_t influenceFnType=0, double E=-1.)
Returns example JSON object for ModelDeck configuration.
static json getExampleJson(size_t dim=2, double tFinal=1.0, size_t Nt=10, std::string spatialDiscretization="finite_difference", std::string timeDiscretization="central_difference", bool populateElementNodeConnectivity=true, size_t quadOrder=2, std::string particleSimType="Multi_Particle", int seed=0)
Returns example JSON object for ModelDeck configuration.
static json getExampleJson(std::string outFormat="vtu", std::string path="./", std::vector< std::string > outTags={"Displacement"}, size_t outputInterval=1, size_t debug=2, bool performFEOut=true, std::string compressType="zlib", bool performOut=true, size_t dtTestOut=1, std::string tagPPFile="", bool pvdCollection=false)
Returns example JSON object for ModelDeck configuration.
static json getExampleJson(std::string genMethod="From_File")
Returns example JSON object for ModelDeck configuration.
static json getExampleJson(std::string updateCriteria="simple_all", double sFactor=1., size_t neighUpdateInterval=1, double nearBdNodesTol=0.5)
Returns example JSON object for ModelDeck configuration.
static json getParticleContactExampleJson(size_t nSets=0)
Returns example JSON object for ModelDeck configuration.
static json getParticleGeomExampleJson(std::vector< geom::GeomData > pGeomVec=std::vector< geom::GeomData >())
Returns example JSON object for ModelDeck configuration.
static json getParticleMeshExampleJson(std::vector< std::string > filenameVec=std::vector< std::string >(), std::vector< double > meshSizesVec=std::vector< double >())
Returns example JSON object for ModelDeck configuration.
static json getParticleMaterialExampleJson(size_t nSets=0)
Returns example JSON object for ModelDeck configuration.
A structure to represent 3d vectors.