From 61f5288e18b828407e2d2919bc61e47466e653ad Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Thu, 20 Apr 2023 11:15:58 +0430 Subject: [PATCH 1/5] Update RDB ReadMe Some misspellings were corrected. --- tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md index d39e076e..8815cb83 100644 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md @@ -1,5 +1,5 @@ # Problem Definition -The problem is to simulate a rotating drum with the diameter **0.24 m**, the length **0.1 m** and **6** Baffles, rotating at **15 rpm**. This drum is filled with **20000** Particles.The timestep for integration is **0.00001 s**. There are 2 types of Particles in this drum each are beining inserted during simulation to fill the drum. +The problem is to simulate a rotating drum with the diameter **0.24 m**, the length **0.1 m** and **6** Baffles, rotating at **15 rpm**. This drum is filled with **20000** Particles.The timestep for integration is **0.00001 s**. There are 2 types of Particles in this drum each are being inserted during simulation to fill the drum. * **12500** Particles with **4 mm** diameter, at the rate of 12500 particles/s for 1 sec. * **7500** Particles with **5mm** diameter, at the rate of 7500 particles/s for 1 sec. From 1771704270033d7445ed8f048014427b7655881b Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Thu, 20 Apr 2023 11:35:38 +0430 Subject: [PATCH 2/5] Update Tote Blender ReadMe # Tote Blender ReadMe * ASCII file format explanation. * Code blocks were fixed. * Particles number were changed from 20000 to 24000. --- .../sphereGranFlow/toteblender/ReadMe.md | 298 +++++++++++------- 1 file changed, 188 insertions(+), 110 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/ReadMe.md b/tutorials/sphereGranFlow/toteblender/ReadMe.md index 5a6d13b5..203f7ae0 100644 --- a/tutorials/sphereGranFlow/toteblender/ReadMe.md +++ b/tutorials/sphereGranFlow/toteblender/ReadMe.md @@ -1,6 +1,6 @@ # Problem Definition -The problem is to simulate a double pedestal tote blender with the diameter **0.03 m** and **0.1 m** respectively, the length **0.3 m**, rotating at **28 rpm**. This blender is filled with **20000** Particles. The timestep for integration is **0.00001 s**. There is one type of Particle in this blender that are being inserted during simulation to fill the blender. -* **20000** particles with **4 mm** diameter, at the rate of 20000 particles/s for 1 sec. َAfter settling particles, this blender starts to rotate at t=**1s**. +The problem is to simulate a double pedestal tote blender with the diameter **0.03 m** and **0.1 m** respectively, the length **0.3 m**, rotating at **28 rpm**. This blender is filled with **24000** Particles. The timestep for integration is **0.00001 s**. There is one type of Particle in this blender that are being inserted during simulation to fill the blender. +* **24000** particles with **5 mm** diameter, at the rate of 24000 particles/s for 1 sec. َAfter settling particles, this blender starts to rotate at t=**1s**. For better and faster performace in simulations where the number of particles is very large, the format of the files is saved as **ASCII**. @@ -19,12 +19,14 @@ As it has been explained in the previous cases, the simulation case setup is bas ## Defining particles Then in the `caseSetup/sphereShape` the diameter and the material name of the particles are defined. ```C++ -// names of shapes +// name of shapes names (sphere1); + // diameter of shapes (m) -diameters (0.004); -// material names for shapes -materials (prop1); +diameters (0.005); + +// material name for shapes +materials (solidProperty); ``` ## Particle Insertion In this case we have a region for ordering particles. These particles are placed in this blender. For example the script for the inserted particles is shown below. @@ -37,38 +39,46 @@ in caseSetup/particleInsertion file // positions particles positionParticles { -// ordered positioning - method positionOrdered; -// maximum number of particles in the simulation - maxNumberOfParticles 40000; -// perform initial sorting based on morton code? - mortonSorting Yes; -// cylinder for positioning particles + // ordered positioning + method positionOrdered; + + // maximum number of particles in the simulation + maxNumberOfParticles 25001; + + // perform initial sorting based on morton code? + mortonSorting Yes; + + // cylinder for positioning particles cylinder { -// Coordinates of top cylinderRegion (m,m,m) - p1 (0.05 0.0 0.12); - p2 (0.05 0.0 0.22); -// radius of cylinder - radius 0.066; + // Coordinates of top cylinderRegion (m,m,m) + p1 (0.0 0.0 0.09); + + p2 (0.0 0.0 0.21); + + // radius of cylinder + radius 0.09; } positionOrderedInfo { -// minimum space between centers of particles - diameter 0.003; -// number of particles in the simulation - numPoints 20000; -// axis order for filling the space with particles - axisOrder (z y x); + // minimum space between centers of particles + diameter 0.005; + + // number of particles in the simulation + numPoints 24000; + + // axis order for filling the space with particles + axisOrder (x y z); } } ``` ## Interaction between particles - In `caseSetup/interaction` file, material names and properties and interaction parameters are defined: interaction between the particles of rotating drum. Since we are defining 1 material for simulation, the interaction matrix is 1x1 (interactions are symetric). + In `caseSetup/interaction` file, material names and properties and interaction parameters are defined: interaction between the particles of Tote Blender. Since we are defining 1 material for simulation, the interaction matrix is 1x1 (interactions are symetric). ```C++ // a list of materials names -materials (prop1); +materials (solidProperty); + // density of materials [kg/m3] densities (1000.0); @@ -76,164 +86,229 @@ contactListType sortedContactList; model { - contactForceModel nonLinearNonLimited; - rollingFrictionModel normal; + contactForceModel nonLinearNonLimited; + + rollingFrictionModel normal; + /* - Property (prop1-prop1); + Property (solidProperty-solidProperty); */ -// Young modulus [Pa] + + // Young modulus [Pa] Yeff (1.0e6); -// Shear modulus [Pa] + + // Shear modulus [Pa] Geff (0.8e6); -// Poisson's ratio [-] + + // Poisson's ratio [-] nu (0.25); -// coefficient of normal restitution + + // coefficient of normal restitution en (0.7); -// coefficient of tangential restitution + + // coefficient of tangential restitution et (1.0); -// dynamic friction + + // dynamic friction mu (0.3); -// rolling friction - mur (0.1); - + + // rolling friction + mur (0.1); } ``` ## Settings ### Geometry -In the `settings/geometryDict` file, the geometry and axis of rotation is defined for the drum. The geometry is composed of a cylinder inlet and outlet, cone shell top and down, a cylinder shell and enter and exit Gate. +In the `settings/geometryDict` file, the geometry and axis of rotation is defined for the blender. The geometry is composed of a cylinder inlet and outlet, cone shell top and down, a cylinder shell and enter and exit Gate. ```C++ surfaces { - topGate + topGate { - // type of wall + // type of wall type cylinderWall; - // begin point of cylinder axis - p1 (0.0 0.0 0.299); - // end point of cylinder axis - p2 (0.0 0.0 0.3); - // radius at p1 + + // begin point of cylinder axis + p1 (0.0 0.0 0.3); + + // end point of cylinder axis + p2 (0.0 0.0 0.301); + + // radius at p1 radius1 0.03; - // radius at p2 + + // radius at p2 radius2 0.0001; - // material of wall + + // material of wall material solidProperty; - // motion component name + + // motion component name motion axisOfRotation; } topCylinder { - // type of the wall + // type of the wall type cylinderWall; - // begin point of cylinder axis + + // begin point of cylinder axis p1 (0.0 0.0 0.28); - // end point of cylinder axis + + // end point of cylinder axis p2 (0.0 0.0 0.3); - // radius at p1 + + // radius at p1 radius1 0.03; - // radius at p2 + + // radius at p2 radius2 0.03; - // number of divisions + + // number of divisions resolution 36; - // material name of this wall - material prop1; - // motion component name + + // material name of this wall + material solidProperty; + + // motion component name motion axisOfRotation; } coneShelltop - { - // type of the wall + { + // type of the wall type cylinderWall; - // begin point of cylinder axis + + // begin point of cylinder axis p1 (0.0 0.0 0.2); - // end point of cylinder axis + + // end point of cylinder axis p2 (0.0 0.0 0.28); - // radius at p1 + + // radius at p1 radius1 0.1; - // radius at p2 + + // radius at p2 radius2 0.03; - // number of divisions + + // number of divisions resolution 36; - // material name of this wall - material prop1; - // motion component name + + // material name of this wall + material solidProperty; + + // motion component name motion axisOfRotation; } cylinderShell { - // type of the wall + // type of the wall type cylinderWall; - // begin point of cylinder axis + + // begin point of cylinder axis p1 (0.0 0.0 0.1); - // end point of cylinder axis + + // end point of cylinder axis p2 (0.0 0.0 0.2); - // radius at p1 + + // radius at p1 radius1 0.1; - // radius at p2 + + // radius at p2 radius2 0.1; - // number of divisions + + // number of divisions resolution 36; - // material name of this wall - material prop1; - // motion component name + + // material name of this wall + material solidProperty; + + // motion component name motion axisOfRotation; } coneShelldown { - // type of the wall + + // type of the wall type cylinderWall; - // begin point of cylinder axis + + // begin point of cylinder axis p1 (0.0 0.0 0.02); - // end point of cylinder axis + + // end point of cylinder axis p2 (0.0 0.0 0.1); - // radius at p1 + + // radius at p1 radius1 0.03; - // radius at p2 + + // radius at p2 radius2 0.1; - // number of divisions + + // number of divisions resolution 36; - // material name of this wall - material prop1; - // motion component name + + // material name of this wall + material solidProperty; + + // motion component name motion axisOfRotation; } - /* - This is a plane wall at the exit of silo - */ - bottomCylinder + bottomCylinder { - // type of the wall + // type of the wall type cylinderWall; - // begin point of cylinder axis + + // begin point of cylinder axis p1 (0.0 0.0 0.0); - // end point of cylinder axis + + // end point of cylinder axis p2 (0.0 0.0 0.02); - // radius at p1 + + // radius at p1 radius1 0.03; - // radius at p2 + + // radius at p2 radius2 0.03; - // number of divisions + + // number of divisions resolution 36; - // material name of this wall - material prop1; - // motion component name + + // material name of this wall + material solidProperty; + + // motion component name motion axisOfRotation; } + exitGate { - type planeWall; - p1 (-0.05 -0.05 0); - p2 (-0.05 0.05 0); - p3 ( 0.05 0.05 0); - p4 (0.05 -0.05 0); - material prop1; - motion axisOfRotation; + + // type of the wall + type cylinderWall; + + // begin point of cylinder axis + p1 (0.0 0.0 -0.001); + + // end point of cylinder axis + p2 (0.0 0.0 0.0); + + // radius at p1 + radius1 0.03; + + // radius at p2 + radius2 0.0001; + + // number of divisions + resolution 36; + + // material name of this wall + material solidProperty; + + // motion component name + motion axisOfRotation; } } @@ -247,11 +322,14 @@ rotatingAxisMotionInfo axisOfRotation { p1 (-0.1 0.0 0.15); // first point for the axis of rotation - p2 (0.1 0.0 0.15); // second point for the axis of rotation + p2 ( 0.1 0.0 0.15); // second point for the axis of rotation + omega 1.5708; // rotation speed ==> 15 rad/s - // Start time of Geometry Rotating (s) - startTime 1; - // End time of Geometry Rotating (s) + + // Start time of Geometry Rotating (s) + startTime 0.5; + + // End time of Geometry Rotating (s) endTime 9.5; } } From 3cadb45e0ca69b1a5b014c8d31a9afe29d5f2503 Mon Sep 17 00:00:00 2001 From: Hamidreza Norouzi Date: Thu, 20 Apr 2023 04:59:42 -0700 Subject: [PATCH 3/5] Cmaklist --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c45ef0b..f9740a90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,7 +77,7 @@ add_subdirectory(solvers) add_subdirectory(utilities) add_subdirectory(DEMSystems) -#add_subdirectory(test_newFeatures) +#add_subdirectory(testIO) install(FILES "${PROJECT_BINARY_DIR}/phasicFlowConfig.H" From 5d67ae270c5807f6b9fd0da6e6225698d8f4830a Mon Sep 17 00:00:00 2001 From: PhasicFlow <113092888+PhasicFlow@users.noreply.github.com> Date: Thu, 20 Apr 2023 16:10:23 +0330 Subject: [PATCH 4/5] Update ReadMe.md --- .../sphereGranFlow/toteblender/ReadMe.md | 233 +++++++++--------- 1 file changed, 123 insertions(+), 110 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/ReadMe.md b/tutorials/sphereGranFlow/toteblender/ReadMe.md index 203f7ae0..7b13e340 100644 --- a/tutorials/sphereGranFlow/toteblender/ReadMe.md +++ b/tutorials/sphereGranFlow/toteblender/ReadMe.md @@ -1,6 +1,6 @@ # Problem Definition -The problem is to simulate a double pedestal tote blender with the diameter **0.03 m** and **0.1 m** respectively, the length **0.3 m**, rotating at **28 rpm**. This blender is filled with **24000** Particles. The timestep for integration is **0.00001 s**. There is one type of Particle in this blender that are being inserted during simulation to fill the blender. -* **24000** particles with **5 mm** diameter, at the rate of 24000 particles/s for 1 sec. َAfter settling particles, this blender starts to rotate at t=**1s**. For better and faster performace in simulations where the number of particles is very large, the format of the files is saved as **ASCII**. +The problem is to simulate a double pedestal tote blender (mixer) with the diameter **0.03 m** and **0.1 m** respectively, the length **0.3 m**, rotating at **28 rpm**. This blender is filled with **24000** particles. The timestep for integration is **0.00001 s**. There is one type of particle in this blender. Particles are positioned before start of simulation to fill the blender. +* **24000** particles with **5 mm** diameter are positioned, in order, and let to be settled under gravity. After settling particles, this blender starts to rotate at t=**1s**. @@ -8,117 +8,46 @@ The problem is to simulate a double pedestal tote blender with the diameter **0. a view of the tote-blender while rotating
- +
+
+ particles are colored according to their velocity +
# Setting up the Case -As it has been explained in the previous cases, the simulation case setup is based on text-based scripts. Here, the simulation case setup are sotred in two folders: `caseSetup`, `setting`. (see the above folders). Unlike the previous cases, this case does not have the `stl` file. and the geometry is described in the `geometryDict` file. +As it has been explained in the previous cases, the simulation case setup is based on text-based scripts. Here, the simulation case setup files are stored into two folders: `caseSetup`, `setting` (see the above folders). Unlike the previous cases, this case does not have the `stl` file and the surfaces are defined based on the built-in utilities in phasicFlow. See next the section for more information on how we can setup the geometry and its rotation. -## Defining particles -Then in the `caseSetup/sphereShape` the diameter and the material name of the particles are defined. -```C++ -// name of shapes -names (sphere1); +## Geometry -// diameter of shapes (m) -diameters (0.005); - -// material name for shapes -materials (solidProperty); -``` -## Particle Insertion -In this case we have a region for ordering particles. These particles are placed in this blender. For example the script for the inserted particles is shown below. - -
-in caseSetup/particleInsertion file -
+### Defining rotation axis +In file `settings/geometryDict` the information of rotating axis and speed of rotation are defined. The rotation of this blender starts at time=**0.5 s** and ends at time=**9.5 s**. ```C++ -// positions particles -positionParticles +// information for rotatingAxisMotion motion model +rotatingAxisMotionInfo { - // ordered positioning - method positionOrdered; - - // maximum number of particles in the simulation - maxNumberOfParticles 25001; - - // perform initial sorting based on morton code? - mortonSorting Yes; - - // cylinder for positioning particles - cylinder + axisOfRotation { - // Coordinates of top cylinderRegion (m,m,m) - p1 (0.0 0.0 0.09); + p1 (-0.1 0.0 0.15); // first point for the axis of rotation + p2 ( 0.1 0.0 0.15); // second point for the axis of rotation - p2 (0.0 0.0 0.21); + omega 1.5708; // rotation speed ==> 15 rad/s - // radius of cylinder - radius 0.09; - } - - positionOrderedInfo - { - // minimum space between centers of particles - diameter 0.005; + // Start time of Geometry Rotating (s) + startTime 0.5; - // number of particles in the simulation - numPoints 24000; - - // axis order for filling the space with particles - axisOrder (x y z); + // End time of Geometry Rotating (s) + endTime 9.5; } } ``` - ## Interaction between particles - In `caseSetup/interaction` file, material names and properties and interaction parameters are defined: interaction between the particles of Tote Blender. Since we are defining 1 material for simulation, the interaction matrix is 1x1 (interactions are symetric). -```C++ - // a list of materials names -materials (solidProperty); -// density of materials [kg/m3] -densities (1000.0); -contactListType sortedContactList; +### Surfaces +In `settings/geometryDict` file, the surfaces and motion component of each surface are defined to form a rotating tote-blender. The geometry is composed of top and bottom cylinders, top and bottom cones, a cylindrical shell and top and bottom Gates. -model -{ - contactForceModel nonLinearNonLimited; - - rollingFrictionModel normal; - - /* - Property (solidProperty-solidProperty); - */ - - // Young modulus [Pa] - Yeff (1.0e6); - - // Shear modulus [Pa] - Geff (0.8e6); - - // Poisson's ratio [-] - nu (0.25); - - // coefficient of normal restitution - en (0.7); - - // coefficient of tangential restitution - et (1.0); - - // dynamic friction - mu (0.3); - - // rolling friction - mur (0.1); -} -``` -## Settings -### Geometry -In the `settings/geometryDict` file, the geometry and axis of rotation is defined for the blender. The geometry is composed of a cylinder inlet and outlet, cone shell top and down, a cylinder shell and enter and exit Gate. ```C++ surfaces { @@ -313,31 +242,115 @@ surfaces } ``` -### Rotating Axis Info -In this part of `geometryDict` the information of rotating axis and speed of rotation are defined. Unlike the previous cases, the rotation of this blender starts at time=**0 s**. + +## Defining particles +### Diameter and material of spheres +In the `caseSetup/sphereShape` the diameter and the material name of the particles are defined. + +
+in caseSetup/sphereShape file +
+ ```C++ -// information for rotatingAxisMotion motion model -rotatingAxisMotionInfo +// name of shapes +names (sphere1); + +// diameter of shapes (m) +diameters (0.005); + +// material name for shapes +materials (solidProperty); +``` +### Particle positioning before start of simulation +Particles are positioned before the start of simulation. The positioning can be ordered or random. Here we use ordered positioning. 24000 particles are positioned in a cylinderical region inside the tote-blender. + +
+in settings/particlesDict file +
+ +```C++ +// positions particles +positionParticles { - axisOfRotation + // ordered positioning + method positionOrdered; + + // maximum number of particles in the simulation + maxNumberOfParticles 25001; + + // perform initial sorting based on morton code? + mortonSorting Yes; + + // cylinderical region for positioning particles + cylinder { - p1 (-0.1 0.0 0.15); // first point for the axis of rotation - p2 ( 0.1 0.0 0.15); // second point for the axis of rotation + p1 (0.0 0.0 0.09); + p2 (0.0 0.0 0.21); + radius 0.09; + } + + positionOrderedInfo + { + // minimum space between centers of particles + diameter 0.005; - omega 1.5708; // rotation speed ==> 15 rad/s - - // Start time of Geometry Rotating (s) - startTime 0.5; - - // End time of Geometry Rotating (s) - endTime 9.5; + // number of particles in the simulation + numPoints 24000; + + // axis order for filling the space with particles + axisOrder (x y z); } } ``` -## Performing Simulation + + ## Interaction between particles + In `caseSetup/interaction` file, material names and properties and interaction parameters are defined. Since we are defining 1 material type in the simulation, the interaction matrix is 1x1 (interactions are symmetric). +```C++ + // a list of materials names +materials (solidProperty); + +// density of materials [kg/m3] +densities (1000.0); + +contactListType sortedContactList; + +model +{ + contactForceModel nonLinearNonLimited; + + rollingFrictionModel normal; + + /* + Property (solidProperty-solidProperty); + */ + + // Young modulus [Pa] + Yeff (1.0e6); + + // Shear modulus [Pa] + Geff (0.8e6); + + // Poisson's ratio [-] + nu (0.25); + + // coefficient of normal restitution + en (0.7); + + // coefficient of tangential restitution + et (1.0); + + // dynamic friction + mu (0.3); + + // rolling friction + mur (0.1); +} +``` + +# Performing Simulation and previewing the results To perform simulations, enter the following commands one after another in the terminal. Enter `$ particlesPhasicFlow` command to create the initial fields for particles. -Enter `$ geometryPhasicFlow` command to create the Geometry. +Enter `$ geometryPhasicFlow` command to create the geometry. At last, enter `$ sphereGranFlow` command to start the simulation. -After finishing the simulation, you can use `$ pFlowtoVTK` to convert the results into vtk format storred in ./VTK folder. \ No newline at end of file +After finishing the simulation, you can use `$ pFlowtoVTK` to convert the results into vtk format stored in ./VTK folder. From 06a431f6893be0443afeac41dd8c1cf5f8848da7 Mon Sep 17 00:00:00 2001 From: Hamidreza Norouzi Date: Sun, 23 Apr 2023 12:47:12 -0700 Subject: [PATCH 5/5] doc for integration --- doc/header.html | 2 +- .../AdamsBashforth2/AdamsBashforth2.hpp | 58 ++++++-- .../AdamsBashforth3/AdamsBashforth3.cpp | 20 +-- .../AdamsBashforth3/AdamsBashforth3.hpp | 50 ++++--- .../AdamsBashforth4/AdamsBashforth4.cpp | 2 +- .../AdamsBashforth4/AdamsBashforth4.hpp | 56 ++++--- .../AdamsBashforth5/AdamsBashforth5.cpp | 2 +- .../AdamsBashforth5/AdamsBashforth5.hpp | 50 ++++--- .../AdamsMoulton3/AdamsMoulton3.hpp | 76 +++++++--- .../AdamsMoulton4/AdamsMoulton4.hpp | 73 ++++++--- .../AdamsMoulton5/AdamsMoulton5.hpp | 70 +++++++-- src/Integration/integration/integration.hpp | 95 +++++++++--- src/Integration/integration/integrations.hpp | 28 ---- .../dynamicPointStructure.hpp | 13 +- src/demComponent/demComponent.hpp | 138 +++++++++++++----- 15 files changed, 481 insertions(+), 252 deletions(-) delete mode 100644 src/Integration/integration/integrations.hpp diff --git a/doc/header.html b/doc/header.html index 776a3e13..8642c69a 100644 --- a/doc/header.html +++ b/doc/header.html @@ -4,7 +4,7 @@ - + $projectname: $title diff --git a/src/Integration/AdamsBashforth2/AdamsBashforth2.hpp b/src/Integration/AdamsBashforth2/AdamsBashforth2.hpp index 43fb9500..6e2a8892 100644 --- a/src/Integration/AdamsBashforth2/AdamsBashforth2.hpp +++ b/src/Integration/AdamsBashforth2/AdamsBashforth2.hpp @@ -28,45 +28,68 @@ Licence: namespace pFlow { - +/** + * Second order Adams-Bashforth integration method for solving ODE + * + * This is a one-step integration method and does not have prediction step. + * + */ class AdamsBashforth2 : public integration { protected: + /// dy at t-dt realx3PointField_D& dy1_; + /// Range policy for integration kernel (alias) using rpIntegration = Kokkos::RangePolicy< DefaultExecutionSpace, Kokkos::Schedule, Kokkos::IndexType >; + public: - // type info + /// Type info TypeInfo("AdamsBashforth2"); - //// - Constructors + // - Constructors + + /// Construct from components AdamsBashforth2( const word& baseName, repository& owner, const pointStructure& pStruct, const word& method); + uniquePtr clone()const override + { + return makeUnique(*this); + } + + /// Destructor virtual ~AdamsBashforth2()=default; - // - add a virtual constructor + /// Add this to the virtual constructor table add_vCtor( integration, AdamsBashforth2, word); - //// - Methods - bool predict(real UNUSED(dt), realx3Vector_D& UNUSED(y), realx3Vector_D& UNUSED(dy)) override; + // - Methods - bool correct(real dt, realx3Vector_D& y, realx3Vector_D& dy) override; + bool predict( + real UNUSED(dt), + realx3Vector_D& UNUSED(y), + realx3Vector_D& UNUSED(dy)) override; + + bool correct( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy) override; bool setInitialVals( const int32IndexContainer& newIndices, @@ -76,16 +99,21 @@ public: { return false; } + + /// Integrate on all points in the active range + bool intAll( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + range activeRng); - uniquePtr clone()const override - { - return makeUnique(*this); - } - - bool intAll(real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); - + /// Integrate on active points in the active range template - bool intRange(real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP ); + bool intRange( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + activeFunctor activeP ); }; diff --git a/src/Integration/AdamsBashforth3/AdamsBashforth3.cpp b/src/Integration/AdamsBashforth3/AdamsBashforth3.cpp index e120941a..040a9e40 100644 --- a/src/Integration/AdamsBashforth3/AdamsBashforth3.cpp +++ b/src/Integration/AdamsBashforth3/AdamsBashforth3.cpp @@ -31,26 +31,8 @@ pFlow::AdamsBashforth3::AdamsBashforth3 ) : integration(baseName, owner, pStruct, method), - /*dy1_( - owner.emplaceObject( - objectFile( - groupNames(baseName,"dy1"), - "", - objectFile::READ_IF_PRESENT, - objectFile::WRITE_ALWAYS), - pStruct, - zero3)), - dy2_( - owner.emplaceObject( - objectFile( - groupNames(baseName,"dy2"), - "", - objectFile::READ_IF_PRESENT, - objectFile::WRITE_ALWAYS), - pStruct, - zero3))*/ history_( - owner.emplaceObject( + owner.emplaceObject>( objectFile( groupNames(baseName,"AB3History"), "", diff --git a/src/Integration/AdamsBashforth3/AdamsBashforth3.hpp b/src/Integration/AdamsBashforth3/AdamsBashforth3.hpp index 11c93d5c..6bd47b11 100644 --- a/src/Integration/AdamsBashforth3/AdamsBashforth3.hpp +++ b/src/Integration/AdamsBashforth3/AdamsBashforth3.hpp @@ -30,10 +30,10 @@ namespace pFlow struct AB3History { + TypeInfoNV("AB3History"); + realx3 dy1_={0,0,0}; realx3 dy2_={0,0,0}; - - TypeInfoNV("AB3History"); }; @@ -65,21 +65,21 @@ iOstream& operator<<(iOstream& str, const AB3History& ab3) return str; } - +/** + * Third order Adams-Bashforth integration method for solving ODE + * + * This is a one-step integration method and does not have prediction step. + */ class AdamsBashforth3 : public integration { protected: + + /// Integration history + pointField& history_; - using HistoryFieldType = pointField; - //realx3PointField_D& dy1_; - - //realx3PointField_D& dy2_; - - // this is a device - HistoryFieldType& history_; - + /// Range policy for integration kernel using rpIntegration = Kokkos::RangePolicy< DefaultExecutionSpace, Kokkos::Schedule, @@ -91,23 +91,32 @@ public: // type info TypeInfo("AdamsBashforth3"); - //// - Constructors + // - Constructors + + /// Construct from components AdamsBashforth3( const word& baseName, repository& owner, const pointStructure& pStruct, const word& method); + + uniquePtr clone()const override + { + return makeUnique(*this); + } + /// Destructor virtual ~AdamsBashforth3()=default; - // - add a virtual constructor + /// Add this to the virtual constructor table add_vCtor( integration, AdamsBashforth3, word); - //// - Methods + // - Methods + bool predict( real UNUSED(dt), realx3Vector_D & UNUSED(y), @@ -126,18 +135,17 @@ public: return false; } - uniquePtr clone()const override - { - return makeUnique(*this); - } - - bool intAll(real dt, + /// Integrate on all points in the active range + bool intAll( + real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Integrate on active points in the active range template - bool intRange(real dt, + bool intRange( + real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP ); diff --git a/src/Integration/AdamsBashforth4/AdamsBashforth4.cpp b/src/Integration/AdamsBashforth4/AdamsBashforth4.cpp index 0a713ffb..547de93f 100644 --- a/src/Integration/AdamsBashforth4/AdamsBashforth4.cpp +++ b/src/Integration/AdamsBashforth4/AdamsBashforth4.cpp @@ -32,7 +32,7 @@ pFlow::AdamsBashforth4::AdamsBashforth4 : integration(baseName, owner, pStruct, method), history_( - owner.emplaceObject( + owner.emplaceObject>( objectFile( groupNames(baseName,"AB4History"), "", diff --git a/src/Integration/AdamsBashforth4/AdamsBashforth4.hpp b/src/Integration/AdamsBashforth4/AdamsBashforth4.hpp index 909d93ba..4f4a2914 100644 --- a/src/Integration/AdamsBashforth4/AdamsBashforth4.hpp +++ b/src/Integration/AdamsBashforth4/AdamsBashforth4.hpp @@ -30,11 +30,12 @@ namespace pFlow struct AB4History { + TypeInfoNV("AB4History"); + realx3 dy1_={0,0,0}; realx3 dy2_={0,0,0}; realx3 dy3_={0,0,0}; - - TypeInfoNV("AB4History"); + }; @@ -68,23 +69,21 @@ iOstream& operator<<(iOstream& str, const AB4History& ab4) return str; } - +/** + * Fourth order Adams-Bashforth integration method for solving ODE + * + * This is a one-step integration method and does not have prediction step. + */ class AdamsBashforth4 : public integration { protected: - using HistoryFieldType = pointField; - //realx3PointField_D& dy1_; - - //realx3PointField_D& dy2_; - - - - // this is a device - HistoryFieldType& history_; + /// Integration history + pointField& history_; + /// Range policy for integration kernel using rpIntegration = Kokkos::RangePolicy< DefaultExecutionSpace, Kokkos::Schedule, @@ -93,32 +92,42 @@ protected: public: - // type info + /// Type info TypeInfo("AdamsBashforth4"); - //// - Constructors + // - Constructors + + /// Construct from components AdamsBashforth4( const word& baseName, repository& owner, const pointStructure& pStruct, const word& method); + + uniquePtr clone()const override + { + return makeUnique(*this); + } + /// Destructor virtual ~AdamsBashforth4()=default; - // - add a virtual constructor + /// Add a this to the virtual constructor table add_vCtor( integration, AdamsBashforth4, word); - //// - Methods + // - Methods + bool predict( real UNUSED(dt), realx3Vector_D & UNUSED(y), realx3Vector_D& UNUSED(dy)) override; - bool correct(real dt, + bool correct( + real dt, realx3Vector_D & y, realx3Vector_D& dy) override; @@ -131,18 +140,17 @@ public: return false; } - uniquePtr clone()const override - { - return makeUnique(*this); - } - - bool intAll(real dt, + /// Integrate on all points in the active range + bool intAll( + real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Integrate on active points in the active range template - bool intRange(real dt, + bool intRange( + real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP ); diff --git a/src/Integration/AdamsBashforth5/AdamsBashforth5.cpp b/src/Integration/AdamsBashforth5/AdamsBashforth5.cpp index 327b5f2b..580f0c06 100644 --- a/src/Integration/AdamsBashforth5/AdamsBashforth5.cpp +++ b/src/Integration/AdamsBashforth5/AdamsBashforth5.cpp @@ -32,7 +32,7 @@ pFlow::AdamsBashforth5::AdamsBashforth5 : integration(baseName, owner, pStruct, method), history_( - owner.emplaceObject( + owner.emplaceObject>( objectFile( groupNames(baseName,"AB5History"), "", diff --git a/src/Integration/AdamsBashforth5/AdamsBashforth5.hpp b/src/Integration/AdamsBashforth5/AdamsBashforth5.hpp index ce8a5d19..99261588 100644 --- a/src/Integration/AdamsBashforth5/AdamsBashforth5.hpp +++ b/src/Integration/AdamsBashforth5/AdamsBashforth5.hpp @@ -30,12 +30,12 @@ namespace pFlow struct AB5History { + TypeInfoNV("AB5History"); + realx3 dy1_={0,0,0}; realx3 dy2_={0,0,0}; realx3 dy3_={0,0,0}; realx3 dy4_={0,0,0}; - - TypeInfoNV("AB5History"); }; @@ -71,18 +71,21 @@ iOstream& operator<<(iOstream& str, const AB5History& ab5) return str; } - +/** + * Fifth order Adams-Bashforth integration method for solving ODE + * + * This is a one-step integration method and does not have prediction step. + */ class AdamsBashforth5 : public integration { protected: - using HistoryFieldType = pointField; - - // this is a device - HistoryFieldType& history_; + /// Integration history + pointField& history_; + /// Range policy for integration kernel using rpIntegration = Kokkos::RangePolicy< DefaultExecutionSpace, Kokkos::Schedule, @@ -91,32 +94,40 @@ protected: public: - // type info + /// Type info TypeInfo("AdamsBashforth5"); - //// - Constructors + // - Constructors + AdamsBashforth5( const word& baseName, repository& owner, const pointStructure& pStruct, const word& method); + uniquePtr clone()const override + { + return makeUnique(*this); + } + virtual ~AdamsBashforth5()=default; - // - add a virtual constructor + /// Add this to the virtual constructor table add_vCtor( integration, AdamsBashforth5, word); - //// - Methods + // - Methods + bool predict( real UNUSED(dt), realx3Vector_D & UNUSED(y), realx3Vector_D& UNUSED(dy)) override; - bool correct(real dt, + bool correct( + real dt, realx3Vector_D & y, realx3Vector_D& dy) override; @@ -129,18 +140,17 @@ public: return false; } - uniquePtr clone()const override - { - return makeUnique(*this); - } - - bool intAll(real dt, + /// Integrate on all points in the active range + bool intAll( + real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Integrate on active points in the active range template - bool intRange(real dt, + bool intRange( + real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP ); @@ -184,4 +194,4 @@ bool pFlow::AdamsBashforth5::intRange( } // pFlow -#endif //__integration_hpp__ +#endif // diff --git a/src/Integration/AdamsMoulton3/AdamsMoulton3.hpp b/src/Integration/AdamsMoulton3/AdamsMoulton3.hpp index 2e33ae11..349d62b2 100644 --- a/src/Integration/AdamsMoulton3/AdamsMoulton3.hpp +++ b/src/Integration/AdamsMoulton3/AdamsMoulton3.hpp @@ -28,19 +28,27 @@ Licence: namespace pFlow { - +/** + * Third order Adams-Moulton integration method for solving ODE + * + * This is a predictor-corrector integration method. + */ class AdamsMoulton3 : public integration { protected: + /// y at time t realx3PointField_D& y0_; + /// dy at time t realx3PointField_D& dy0_; + /// dy at time t-dt realx3PointField_D& dy1_; + /// Range policy for integration kernel using rpIntegration = Kokkos::RangePolicy< DefaultExecutionSpace, Kokkos::Schedule, @@ -48,29 +56,44 @@ protected: >; public: - // type info + /// Type info TypeInfo("AdamsMoulton3"); - //// - Constructors + // - Constructors + + /// Construct from components AdamsMoulton3( const word& baseName, repository& owner, const pointStructure& pStruct, const word& method); + uniquePtr clone()const override + { + return makeUnique(*this); + } + + /// Destructor virtual ~AdamsMoulton3()=default; - // - add a virtual constructor + /// Add this to the virtual constructor table add_vCtor( integration, AdamsMoulton3, word); - //// - Methods - bool predict(real dt, realx3Vector_D& y, realx3Vector_D& dy) override; + // - Methods - bool correct(real dt, realx3Vector_D& y, realx3Vector_D& dy) override; + bool predict( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy) override; + + bool correct( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy) override; bool setInitialVals( const int32IndexContainer& newIndices, @@ -81,20 +104,35 @@ public: return true; } - uniquePtr clone()const override - { - return makeUnique(*this); - } - - bool predictAll(real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Prediction step on all points in the active range + bool predictAll( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + range activeRng); + /// Prediction step on active points in the active range template - bool predictRange(real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP); + bool predictRange( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + activeFunctor activeP); - bool intAll(real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Integrate on all points in the active range + bool intAll( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + range activeRng); + /// Integrate on active points in the active range template - bool intRange(real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP ); + bool intRange( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + activeFunctor activeP); }; @@ -104,7 +142,7 @@ bool AdamsMoulton3::predictRange( real dt, realx3Vector_D& y, realx3Vector_D& dy, - activeFunctor activeP ) + activeFunctor activeP) { auto d_dy = dy.deviceVectorAll(); auto d_y = y.deviceVectorAll(); @@ -141,7 +179,7 @@ bool pFlow::AdamsMoulton3::intRange( real dt, realx3Vector_D& y, realx3Vector_D& dy, - activeFunctor activeP ) + activeFunctor activeP) { auto d_dy = dy.deviceVectorAll(); @@ -176,4 +214,4 @@ bool pFlow::AdamsMoulton3::intRange( } // pFlow -#endif //__integration_hpp__ +#endif // diff --git a/src/Integration/AdamsMoulton4/AdamsMoulton4.hpp b/src/Integration/AdamsMoulton4/AdamsMoulton4.hpp index 1e3863a7..c0da0f62 100644 --- a/src/Integration/AdamsMoulton4/AdamsMoulton4.hpp +++ b/src/Integration/AdamsMoulton4/AdamsMoulton4.hpp @@ -28,21 +28,30 @@ Licence: namespace pFlow { - +/** + * Fourth order Adams-Moulton integration method for solving ODE + * + * This is a predictor-corrector integration method. + */ class AdamsMoulton4 : public integration { protected: + /// y at time t realx3PointField_D& y0_; + /// dy at time t realx3PointField_D& dy0_; + /// dy at time t-dt realx3PointField_D& dy1_; + /// dy at time t-2*dt realx3PointField_D& dy2_; + /// Range policy for integration kernel using rpIntegration = Kokkos::RangePolicy< DefaultExecutionSpace, Kokkos::Schedule, @@ -50,29 +59,44 @@ protected: >; public: - // type info + /// Type info TypeInfo("AdamsMoulton4"); - //// - Constructors + // - Constructors + + /// Construct from components AdamsMoulton4( const word& baseName, repository& owner, const pointStructure& pStruct, const word& method); + uniquePtr clone()const override + { + return makeUnique(*this); + } + + /// Destructor virtual ~AdamsMoulton4()=default; - // - add a virtual constructor + // Add this to the virtual constructor table add_vCtor( integration, AdamsMoulton4, word); - //// - Methods - bool predict(real dt, realx3Vector_D& y, realx3Vector_D& dy) override; + // - Methods - bool correct(real dt, realx3Vector_D& y, realx3Vector_D& dy) override; + bool predict( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy) override; + + bool correct( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy) override; bool setInitialVals( const int32IndexContainer& newIndices, @@ -83,20 +107,35 @@ public: return true; } - uniquePtr clone()const override - { - return makeUnique(*this); - } - - bool predictAll(real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Prediction step on all points in the active range + bool predictAll( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + range activeRng); + /// Prediction step on active points in the active range template - bool predictRange(real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP); + bool predictRange( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + activeFunctor activeP); - bool intAll(real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Integrate on all points in the active range + bool intAll( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + range activeRng); + /// Integrate on active points in the active range template - bool intRange(real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP ); + bool intRange( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + activeFunctor activeP ); }; @@ -182,4 +221,4 @@ bool pFlow::AdamsMoulton4::intRange( } // pFlow -#endif //__integration_hpp__ +#endif // diff --git a/src/Integration/AdamsMoulton5/AdamsMoulton5.hpp b/src/Integration/AdamsMoulton5/AdamsMoulton5.hpp index bcfe9035..2e381d4a 100644 --- a/src/Integration/AdamsMoulton5/AdamsMoulton5.hpp +++ b/src/Integration/AdamsMoulton5/AdamsMoulton5.hpp @@ -28,23 +28,33 @@ Licence: namespace pFlow { - +/** + * Fifth order Adams-Moulton integration method for solving ODE + * + * This is a predictor-corrector integration method. + */ class AdamsMoulton5 : public integration { protected: + /// y at time t realx3PointField_D& y0_; + /// dy at time t realx3PointField_D& dy0_; + /// dy at time t-dt realx3PointField_D& dy1_; + /// dy at time t-2*dt realx3PointField_D& dy2_; + /// dy at time t-3*dt realx3PointField_D& dy3_; + /// Range policy for integration kernel using rpIntegration = Kokkos::RangePolicy< DefaultExecutionSpace, Kokkos::Schedule, @@ -52,16 +62,24 @@ protected: >; public: - // type info + /// Type info TypeInfo("AdamsMoulton5"); - //// - Constructors + // - Constructors + + /// Construct from components AdamsMoulton5( const word& baseName, repository& owner, const pointStructure& pStruct, const word& method); + + uniquePtr clone()const override + { + return makeUnique(*this); + } + /// Destructor virtual ~AdamsMoulton5()=default; // - add a virtual constructor @@ -71,10 +89,17 @@ public: word); - //// - Methods - bool predict(real dt, realx3Vector_D& y, realx3Vector_D& dy) override; + // - Methods + + bool predict( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy) override; - bool correct(real dt, realx3Vector_D& y, realx3Vector_D& dy) override; + bool correct( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy) override; bool setInitialVals( const int32IndexContainer& newIndices, @@ -85,20 +110,35 @@ public: return true; } - uniquePtr clone()const override - { - return makeUnique(*this); - } - - bool predictAll(real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Prediction step on all points in the active range + bool predictAll( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + range activeRng); + /// Prediction step on active points in the active range template - bool predictRange(real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP); + bool predictRange( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + activeFunctor activeP); - bool intAll(real dt, realx3Vector_D& y, realx3Vector_D& dy, range activeRng); + /// Integrate on all points in the active range + bool intAll( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + range activeRng); + /// Integrate on active points in the active range template - bool intRange(real dt, realx3Vector_D& y, realx3Vector_D& dy, activeFunctor activeP ); + bool intRange( + real dt, + realx3Vector_D& y, + realx3Vector_D& dy, + activeFunctor activeP ); }; diff --git a/src/Integration/integration/integration.hpp b/src/Integration/integration/integration.hpp index a076039b..3cca58c2 100644 --- a/src/Integration/integration/integration.hpp +++ b/src/Integration/integration/integration.hpp @@ -31,32 +31,71 @@ Licence: namespace pFlow { - +/** + * Base class for integrating the first order ODE (IVP) + * + * The ODE should be in the following form: + *\f[ + \frac{dy}{dt} = f(y,t) + \f] + * for example the equation of motion is in the following form: + *\f[ + m\frac{d\vec{v}}{dt} = m\vec{g} + \sum \vec{f_c}(\vec{v},t) + \f] + * + * The integration method can be either one-step or predictor-corrector type. + * + */ class integration { protected: - repository& owner_; + // - Protected data members - const word baseName_; + /// The owner repository that all fields are storred in + repository& owner_; - const pointStructure& pStruct_; + /// The base name for integration + const word baseName_; + + /// A reference to pointStructure + const pointStructure& pStruct_; public: - // type info + /// Type info TypeInfo("integration"); - //// - Constructors + + // - Constructors + + /// Construct from components integration( const word& baseName, repository& owner, const pointStructure& pStruct, const word& method); + /// Copy constructor + integration(const integration&) = default; + + /// Move constructor + integration(integration&&) = default; + + /// Copy assignment + integration& operator = (const integration&) = default; + + /// Move assignment + integration& operator = (integration&&) = default; + + /// Polymorphic copy/cloning + virtual + uniquePtr clone()const=0; + + /// Destructor virtual ~integration()=default; - // - add a virtual constructor + /// Add a virtual constructor create_vCtor( integration, word, @@ -67,35 +106,49 @@ public: (baseName, owner, pStruct, method) ); - //// - Methods + // - Methods + /// Const ref to pointStructure + inline const auto& pStruct()const { return pStruct_; } - virtual bool predict(real dt, realx3Vector_D& y, realx3Vector_D& dy) = 0; - - virtual bool correct(real dt, realx3Vector_D& y, realx3Vector_D& dy) = 0; - - virtual bool setInitialVals( - const int32IndexContainer& newIndices, - const realx3Vector& y) = 0; - - virtual bool needSetInitialVals()const = 0; - - virtual uniquePtr clone()const=0; - + /// Base name + inline const word& baseName()const { return baseName_; } + /// Ref to the owner repository + inline repository& owner() { return owner_; } + /// Prediction step in integration + virtual + bool predict(real dt, realx3Vector_D& y, realx3Vector_D& dy) = 0; + + /// Correction/main integration step + virtual + bool correct(real dt, realx3Vector_D& y, realx3Vector_D& dy) = 0; + + /// Set the initial values for new indices + virtual + bool setInitialVals( + const int32IndexContainer& newIndices, + const realx3Vector& y) = 0; + + /// Check if the method requires any set initial vals + virtual + bool needSetInitialVals()const = 0; + + + /// Create the polymorphic object based on inputs static uniquePtr create( const word& baseName, @@ -103,7 +156,7 @@ public: const pointStructure& pStruct, const word& method); -}; +}; // integration } // pFlow diff --git a/src/Integration/integration/integrations.hpp b/src/Integration/integration/integrations.hpp deleted file mode 100644 index 428656c2..00000000 --- a/src/Integration/integration/integrations.hpp +++ /dev/null @@ -1,28 +0,0 @@ -/*------------------------------- phasicFlow --------------------------------- - O C enter of - O O E ngineering and - O O M ultiscale modeling of - OOOOOOO F luid flow ------------------------------------------------------------------------------- - Copyright (C): www.cemf.ir - email: hamid.r.norouzi AT gmail.com ------------------------------------------------------------------------------- -Licence: - This file is part of phasicFlow code. It is a free software for simulating - granular and multiphase flows. You can redistribute it and/or modify it under - the terms of GNU General Public License v3 or any other later versions. - - phasicFlow is distributed to help others in their research in the field of - granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - ------------------------------------------------------------------------------*/ - -#ifndef __integrations_hpp__ -#define __integrations_hpp__ - -#include "integration.hpp" -#include "AdamsBashforth2.hpp" -#include "AdamsBashforth3.hpp" - -#endif \ No newline at end of file diff --git a/src/Particles/dynamicPointStructure/dynamicPointStructure.hpp b/src/Particles/dynamicPointStructure/dynamicPointStructure.hpp index 7e101b31..843a3c46 100644 --- a/src/Particles/dynamicPointStructure/dynamicPointStructure.hpp +++ b/src/Particles/dynamicPointStructure/dynamicPointStructure.hpp @@ -24,7 +24,7 @@ Licence: #include "Time.hpp" #include "pointFields.hpp" -#include "integrations.hpp" +#include "integration.hpp" #include "uniquePtr.hpp" namespace pFlow @@ -57,17 +57,6 @@ public: dynamicPointStructure(const dynamicPointStructure& ps) = default; - /*dynamicPointStructure(const dynamicPointStructure& ps): - pointStructure(ps), - time_(ps.time_), - integrationMethod_(ps.integrationMethod_), - velocity_(ps.velocity_), - integrationPos_(ps.integrationPos_->clone()), - integrationVel_(ps.integrationVel_->clone()) - { - - }*/ - // - no move construct dynamicPointStructure(dynamicPointStructure&&) = delete; diff --git a/src/demComponent/demComponent.hpp b/src/demComponent/demComponent.hpp index 14041057..d5ad1635 100644 --- a/src/demComponent/demComponent.hpp +++ b/src/demComponent/demComponent.hpp @@ -28,70 +28,132 @@ Licence: namespace pFlow { +/** + * A base class for every main component of DEM system. + * + * This class provides abstraction at a very high level for any solver/utility + * that forces the derived component (i.e. particles, geometry, and etc) to + * advance over time when iterate is called in time a loop. + * + */ class demComponent { protected: - word componentName_; + // - Protected data members + /// Name of the DEM component + word componentName_; - systemControl& control_; + /// Reference to systemControl + systemControl& control_; - - Timers timers_; + /// All timers (if any) of this component + Timers timers_; public: + /// Type info TypeInfo("demComponent"); - demComponent(const word& name, systemControl& control) - : - componentName_(name), - control_(control), - timers_(name, &control.timers()) - {} + // - Constructors + + /// construct from components + demComponent(const word& name, systemControl& control) + : + componentName_(name), + control_(control), + timers_(name, &control.timers()) + {} - virtual ~demComponent() = default; + /// No copy constructor + demComponent(const demComponent&) = delete; + /// No move constructor + demComponent(demComponent&&) = delete; - const auto& control()const - { - return control_; - } + /// No copy assignment + demComponent& operator = (const demComponent&) = delete; - auto& control() - { - return control_; - } + /// No move assignment + demComponent& operator =(demComponent&&) = delete; - inline - real dt()const - { - return control_.time().dt(); - } + /// destructor + virtual ~demComponent() = default; - inline - real currentTime()const - { - return control_.time().currentTime(); - } + + // - Member functions - auto& timers(){ - return timers_; - } + /// Const ref to systemControl + inline + const auto& control()const + { + return control_; + } - const auto& timers() const{ - return timers_; - } + /// Ref to systemControl + inline + auto& control() + { + return control_; + } + /// Time step of integration + inline + real dt()const + { + return control_.time().dt(); + } - virtual bool beforeIteration() = 0; + /// Current simulation time + inline + real currentTime()const + { + return control_.time().currentTime(); + } + /// Const ref to timers + inline + const auto& timers() const + { + return timers_; + } - virtual bool iterate() = 0; + /// Ref to timers + inline + auto& timers() + { + return timers_; + } + /// This is called before the start of time loop + virtual + bool beforeTimeLoop() + { + notImplementedFunction; + return false; + } - virtual bool afterIteration() = 0; + /// This is called in time loop, before iterate + virtual + bool beforeIteration() = 0; + + /// This is called in time loop. Perform the main calculations + /// when the component should evolve along time. + virtual + bool iterate() = 0; + + /// This is called in time loop, after iterate. + virtual + bool afterIteration() = 0; + + /// This is called after the time loop + virtual + bool afterTimeLoop() + { + notImplementedFunction; + return false; + } };