MPS-Basic
Loading...
Searching...
No Matches
mps_factory.cpp
Go to the documentation of this file.
1#include "mps_factory.hpp"
2
8
10
12 Eigen::Vector3d gravity = Eigen::Vector3d::Zero();
13 if (input.settings.xyzInput) {
14 gravity = input.settings.gravity;
15 } else {
16 double gNorm = input.settings.gNorm;
17 double gAngle = input.settings.gAngle;
18 double theta = gAngle * M_PI / 180.0; // Convert angle to radians
19 gravity << gNorm * sin(theta), -gNorm * cos(theta), 0.0; // Gravity in XY plane
20 }
21
22 RefValues refValuesForNumberDensity(
23 input.settings.dim,
27 );
28
29 std::unique_ptr<SurfaceDetector::Interface> surfaceDetector;
31 surfaceDetector.reset(new SurfaceDetector::Distribution(
32 refValuesForNumberDensity.n0,
36 ));
37 } else {
38 surfaceDetector.reset(new SurfaceDetector::NumberDensity(
40 refValuesForNumberDensity.n0
41 ));
42 }
43
44 std::unique_ptr<DirichletBoundaryConditionGenerator::Interface> DirichletBoundaryConditionGenerator;
46 new DirichletBoundaryConditionGenerator::FreeSurface(std::move(surfaceDetector))
47 );
48
49 std::unique_ptr<PressureCalculator::Interface> pressureCalculator;
50 if (input.settings.pressureCalculationMethod == "Implicit") {
51 pressureCalculator.reset(new PressureCalculator::Implicit(
52 input.settings.dim,
56 input.settings.dt,
60 ));
61 } else if (input.settings.pressureCalculationMethod == "Explicit") {
62 pressureCalculator.reset(new PressureCalculator::Explicit(
63 refValuesForNumberDensity.n0,
64 input.settings.soundSpeed,
65 input.settings.dim,
67 ));
68 } else {
69 std::cerr << "Invalid pressure calculation method: " << input.settings.pressureCalculationMethod << std::endl;
70 std::cerr << "Please select either Implicit or Explicit." << std::endl;
71 std::exit(-1);
72 }
73
74 return MPS(input, gravity, std::move(pressureCalculator), std::move(surfaceDetector));
75}
static MPS create(const Input &input)
MPS simulation class.
Definition mps.hpp:26
Dirichlet Boundary Condition Generator that sets the free surface pressure to 0.
Class for explicit pressure calculation.
Definition explicit.hpp:14
Class for implicit pressure calculation.
Definition implicit.hpp:21
Struct for reference values of MPS method.
Definition refvalues.hpp:9
double n0
reference value of number density for source term of pressure Poisson equation
Definition refvalues.hpp:11
Detects free surface based on number density and assists evaluation by particle distribution.
Detects free surface based on the number density.
Represents the input data for MPS simulation.
Definition input.hpp:12
Settings settings
Settings for the simulation.
Definition input.hpp:13
Eigen::Vector3d gravity
Gravity vector when using xyz input.
Definition settings.hpp:32
double soundSpeed
Speed of sound for Explicit method.
Definition settings.hpp:49
double compressibility
Compressibility of the fluid for Implicit method.
Definition settings.hpp:46
double particleDistance
Initial distance between particles.
Definition settings.hpp:18
int dim
Dimension of the simulation.
Definition settings.hpp:17
double relaxationCoefficientForPressure
Relaxation coefficient for pressure for Implicit method.
Definition settings.hpp:47
double re_forNumberDensity
Effective radius for number density.
Definition settings.hpp:56
double gNorm
Norm of gravity when using norm and angle.
Definition settings.hpp:33
bool surfaceDetection_particleDistribution
flag for free surface detection based on particle distribution
Definition settings.hpp:40
double gAngle
Angle of gravity when using norm and angle.
Definition settings.hpp:34
std::string pressureCalculationMethod
Method for pressure calculation.
Definition settings.hpp:44
double surfaceDetection_particleDistribution_threshold
Definition settings.hpp:41
double surfaceDetection_numberDensity_threshold
threshold ratio of number density for free surface detection
Definition settings.hpp:38
bool xyzInput
Definition settings.hpp:31
double dt
Time step.
Definition settings.hpp:19
double re_forLaplacian
Effective radius for Laplacian.
Definition settings.hpp:58