Thanks to visit codestin.com
Credit goes to mps-basic.github.io

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,
26 );
27
28 std::unique_ptr<SurfaceDetector::Interface> surfaceDetector;
30 surfaceDetector.reset(new SurfaceDetector::Distribution(
31 refValuesForNumberDensity.n0,
35 ));
36 } else {
37 surfaceDetector.reset(new SurfaceDetector::NumberDensity(
39 refValuesForNumberDensity.n0
40 ));
41 }
42
43 std::unique_ptr<DirichletBoundaryConditionGenerator::Interface> DirichletBoundaryConditionGenerator;
45 new DirichletBoundaryConditionGenerator::FreeSurface(std::move(surfaceDetector))
46 );
47
48 std::unique_ptr<PressureCalculator::Interface> pressureCalculator;
49 if (input.settings.pressureCalculationMethod == "Implicit") {
50 pressureCalculator.reset(new PressureCalculator::Implicit(
51 input.settings.dim,
55 input.settings.dt,
59 ));
60 } else if (input.settings.pressureCalculationMethod == "Explicit") {
61 pressureCalculator.reset(new PressureCalculator::Explicit(
63 input.settings.soundSpeed,
64 input.settings.dim,
66 ));
67 } else {
68 std::cerr << "Invalid pressure calculation method: " << input.settings.pressureCalculationMethod << std::endl;
69 std::cerr << "Please select either Implicit or Explicit." << std::endl;
70 std::exit(-1);
71 }
72
73 return MPS(input, gravity, std::move(pressureCalculator), std::move(surfaceDetector));
74}
static MPS create(const Input &input)
MPS simulation class.
Definition mps.hpp:25
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:8
double n0
reference value of number density for source term of pressure Poisson equation
Definition refvalues.hpp:10
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:33
double soundSpeed
Speed of sound for Explicit method.
Definition settings.hpp:50
double compressibility
Compressibility of the fluid for Implicit method.
Definition settings.hpp:47
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:48
double re_forNumberDensity
Effective radius for number density.
Definition settings.hpp:57
double gNorm
Norm of gravity when using norm and angle.
Definition settings.hpp:34
bool surfaceDetection_particleDistribution
flag for free surface detection based on particle distribution
Definition settings.hpp:41
double gAngle
Angle of gravity when using norm and angle.
Definition settings.hpp:35
std::string pressureCalculationMethod
Method for pressure calculation.
Definition settings.hpp:45
double surfaceDetection_particleDistribution_threshold
Definition settings.hpp:42
double surfaceDetection_numberDensity_threshold
threshold ratio of number density for free surface detection
Definition settings.hpp:39
bool xyzInput
Definition settings.hpp:32
double dt
Time step.
Definition settings.hpp:19
double re_forLaplacian
Effective radius for Laplacian.
Definition settings.hpp:59