From 99da1d5a209b25264762a34f1985f7dae9174f6f Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:47:19 +0330 Subject: [PATCH 01/27] Create toteblender folder --- tutorials/sphereGranFlow/toteblender/toteblender | 1 + 1 file changed, 1 insertion(+) create mode 100644 tutorials/sphereGranFlow/toteblender/toteblender diff --git a/tutorials/sphereGranFlow/toteblender/toteblender b/tutorials/sphereGranFlow/toteblender/toteblender new file mode 100644 index 00000000..e8689b24 --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/toteblender @@ -0,0 +1 @@ +hh From 46385b695315db53133ff2ec81f88bf17931ac1c Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:53:46 +0330 Subject: [PATCH 02/27] Add tote blender files via Upload --- .../sphereGranFlow/toteblender/cleanThisCase | 7 +++++++ .../sphereGranFlow/toteblender/runThisCase | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 tutorials/sphereGranFlow/toteblender/cleanThisCase create mode 100644 tutorials/sphereGranFlow/toteblender/runThisCase diff --git a/tutorials/sphereGranFlow/toteblender/cleanThisCase b/tutorials/sphereGranFlow/toteblender/cleanThisCase new file mode 100644 index 00000000..8a0ab919 --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/cleanThisCase @@ -0,0 +1,7 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +ls | grep -P "^(([0-9]+\.?[0-9]*)|(\.[0-9]+))$" | xargs -d"\n" rm -rf +rm -rf VTK + +#------------------------------------------------------------------------------ diff --git a/tutorials/sphereGranFlow/toteblender/runThisCase b/tutorials/sphereGranFlow/toteblender/runThisCase new file mode 100644 index 00000000..c48d71fe --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/runThisCase @@ -0,0 +1,21 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory +echo "\n<--------------------------------------------------------------------->" +echo "1) Creating particles" +echo "<--------------------------------------------------------------------->\n" +particlesPhasicFlow + +echo "\n<--------------------------------------------------------------------->" +echo "2) Creating geometry" +echo "<--------------------------------------------------------------------->\n" +geometryPhasicFlow + +echo "\n<--------------------------------------------------------------------->" +echo "3) Running the case" +echo "<--------------------------------------------------------------------->\n" +sphereGranFlow + + + + +#------------------------------------------------------------------------------ From 8666e87f83ef00fb86acbca990dc05a528b78bb9 Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:54:33 +0330 Subject: [PATCH 03/27] Delete test file --- tutorials/sphereGranFlow/toteblender/toteblender | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tutorials/sphereGranFlow/toteblender/toteblender diff --git a/tutorials/sphereGranFlow/toteblender/toteblender b/tutorials/sphereGranFlow/toteblender/toteblender deleted file mode 100644 index e8689b24..00000000 --- a/tutorials/sphereGranFlow/toteblender/toteblender +++ /dev/null @@ -1 +0,0 @@ -hh From bc3409d1540d75386833a31880d189ad14520052 Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:55:33 +0330 Subject: [PATCH 04/27] create test --- tutorials/sphereGranFlow/toteblender/caseSetup/test | 1 + 1 file changed, 1 insertion(+) create mode 100644 tutorials/sphereGranFlow/toteblender/caseSetup/test diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/test b/tutorials/sphereGranFlow/toteblender/caseSetup/test new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/test @@ -0,0 +1 @@ + From 1b0667576bde9bb0bc2e5042c0f997bb4e011a26 Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:56:03 +0330 Subject: [PATCH 05/27] Add caseSetup files via Upload --- .../toteblender/caseSetup/interaction | 61 +++++++++++++++++++ .../toteblender/caseSetup/particleInsertion | 13 ++++ .../toteblender/caseSetup/sphereShape | 13 ++++ 3 files changed, 87 insertions(+) create mode 100644 tutorials/sphereGranFlow/toteblender/caseSetup/interaction create mode 100644 tutorials/sphereGranFlow/toteblender/caseSetup/particleInsertion create mode 100644 tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/interaction b/tutorials/sphereGranFlow/toteblender/caseSetup/interaction new file mode 100644 index 00000000..f97d2f4f --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/interaction @@ -0,0 +1,61 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName interaction; +objectType dicrionary; +/* ------------------------------------------------------------------------- */ +// a list of materials names +materials (prop1); +// density of materials [kg/m3] +densities (1000.0); + +contactListType sortedContactList; + +model +{ + contactForceModel nonLinearNonLimited; + rollingFrictionModel normal; + /* + Property (prop1-prop1); + */ +// 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); + +} +contactSearch +{ +// method for broad search particle-particle + method NBS; +// method for broad search particle-wall + wallMapping cellMapping; + + NBSInfo + { + // each 20 timesteps, update neighbor list + updateFrequency 20; + // bounding box size to particle diameter (max) + sizeRatio 1.1; + } + + cellMappingInfo + { + // each 20 timesteps, update neighbor list + updateFrequency 20; + // bounding box for particle-wall search (> 0.5) + cellExtent 0.7; + } + +} \ No newline at end of file diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/particleInsertion b/tutorials/sphereGranFlow/toteblender/caseSetup/particleInsertion new file mode 100644 index 00000000..d8f022c6 --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/particleInsertion @@ -0,0 +1,13 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName particleInsertion; +objectType dicrionary; +/* ------------------------------------------------------------------------- */ +// is insertion active? +active no; +// not implemented for yes +collisionCheck No; + + diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape b/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape new file mode 100644 index 00000000..ff2df8d1 --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape @@ -0,0 +1,13 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName sphereDict; +objectType sphereShape; +/* ------------------------------------------------------------------------- */ +// names of shapes +names (sphere1); +// diameter of shapes (m) +diameters (0.004); +// material names for shapes +materials (prop1); \ No newline at end of file From 4ecc667a10ad36fd72dd44ad15cd493c54bb53af Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:56:41 +0330 Subject: [PATCH 06/27] Delete test --- tutorials/sphereGranFlow/toteblender/caseSetup/test | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tutorials/sphereGranFlow/toteblender/caseSetup/test diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/test b/tutorials/sphereGranFlow/toteblender/caseSetup/test deleted file mode 100644 index 8b137891..00000000 --- a/tutorials/sphereGranFlow/toteblender/caseSetup/test +++ /dev/null @@ -1 +0,0 @@ - From 05328a395171d805e57c20194d8caf2e1cc5e406 Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:57:13 +0330 Subject: [PATCH 07/27] Create test --- tutorials/sphereGranFlow/toteblender/settings/test | 1 + 1 file changed, 1 insertion(+) create mode 100644 tutorials/sphereGranFlow/toteblender/settings/test diff --git a/tutorials/sphereGranFlow/toteblender/settings/test b/tutorials/sphereGranFlow/toteblender/settings/test new file mode 100644 index 00000000..6a69f920 --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/settings/test @@ -0,0 +1 @@ +f From 0dcff307a6181f3b64f0f6834a2c9aca4443c95a Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:57:44 +0330 Subject: [PATCH 08/27] Add settings files via Upload --- .../toteblender/settings/geometryDict | 151 ++++++++++++++++++ .../toteblender/settings/particlesDict | 59 +++++++ .../toteblender/settings/settingsDict | 34 ++++ 3 files changed, 244 insertions(+) create mode 100644 tutorials/sphereGranFlow/toteblender/settings/geometryDict create mode 100644 tutorials/sphereGranFlow/toteblender/settings/particlesDict create mode 100644 tutorials/sphereGranFlow/toteblender/settings/settingsDict diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict new file mode 100644 index 00000000..49d486bd --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -0,0 +1,151 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName geometryDict; +objectType dictionary; +/* ------------------------------------------------------------------------- */ +// motion model: rotating object around an axis +motionModel rotatingAxisMotion; + +surfaces +{ + enterGate + { + // type of wall + type planeWall; + // coords of wall + p1 (-0.05 -0.05 0.3); + p2 (-0.05 0.05 0.3); + p3 ( 0.05 0.05 0.3); + p4 (0.05 -0.05 0.3); + // material of wall + material prop1; + // motion component name + motion rotAxis; + } + + cylinderinlet + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.28); + // end point of cylinder axis + p2 (0.0 0.0 0.3); + // radius at p1 + radius1 0.03; + // radius at p2 + radius2 0.03; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + + coneShelltop + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.2); + // end point of cylinder axis + p2 (0.0 0.0 0.28); + // radius at p1 + radius1 0.1; + // radius at p2 + radius2 0.03; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + + cylinderShell + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.1); + // end point of cylinder axis + p2 (0.0 0.0 0.2); + // radius at p1 + radius1 0.1; + // radius at p2 + radius2 0.1; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + + coneShelldown + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.02); + // end point of cylinder axis + p2 (0.0 0.0 0.1); + // radius at p1 + radius1 0.03; + // radius at p2 + radius2 0.1; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + /* + This is a plane wall at the exit of silo + */ + + cylinderoutlet + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.0); + // end point of cylinder axis + p2 (0.0 0.0 0.02); + // radius at p1 + radius1 0.03; + // radius at p2 + radius2 0.03; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + 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 rotAxis; + } + +} +// information for rotatingAxisMotion motion model +rotatingAxisMotionInfo +{ + rotAxis + { + 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 + omega 3; // rotation speed (rad/s) + } +} diff --git a/tutorials/sphereGranFlow/toteblender/settings/particlesDict b/tutorials/sphereGranFlow/toteblender/settings/particlesDict new file mode 100644 index 00000000..49a26e76 --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/settings/particlesDict @@ -0,0 +1,59 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName particlesDict; +objectType dictionary; +/* ------------------------------------------------------------------------- */ +setFields +{ + /* + Default value for fields defined for particles + These fields should always be defined for simulations with + spherical particles. + */ + + defaultValue + { +// linear velocity (m/s) + velocity realx3 (0 0 0); +// linear acceleration (m/s2) + acceleration realx3 (0 0 0); +// rotational velocity (rad/s) + rotVelocity realx3 (0 0 0); +// name of the particle shape + shapeName word sphere1; + } + + selectors + {} +} + +// 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; +// box for positioning particles + box + { +// lower corner point of the box + min (-0.06 -0.06 0.08); +// upper corner point of the box + max (0.06 0.06 0.18); + } + + positionOrderedInfo + { +// minimum space between centers of particles + diameter 0.004; +// number of particles in the simulation + numPoints 20000; +// axis order for filling the space with particles + axisOrder (z y x); + } +} diff --git a/tutorials/sphereGranFlow/toteblender/settings/settingsDict b/tutorials/sphereGranFlow/toteblender/settings/settingsDict new file mode 100644 index 00000000..28b9a552 --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/settings/settingsDict @@ -0,0 +1,34 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName settingsDict; +objectType dictionary;; +/*---------------------------------------------------------------------------*/ +run toteBlender; +// time step for integration (s) +dt 0.00001; +// start time for simulation +startTime 0; +// end time for simulation +endTime 10; +// time interval for saving the simulation +saveInterval 0.1; +// maximum number of digits for time folder +timePrecision 6; +// gravity vector (m/s2) +g (0 0 -9.8); + +/* Simulation domain */ +/* every particles that goes outside this domain is deleted. */ +domain +{ + min (-0.5 -0.5 -0.5); + max (0.5 0.5 0.5); +} +// integration method +integrationMethod AdamsBashforth2; +// report timers? +timersReport Yes; +// time interval for reporting timers +timersReportInterval 0.01; From d4dc0d7e80663a3a3d7de210ce800ffdc1da1710 Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:58:15 +0330 Subject: [PATCH 09/27] Delete test --- tutorials/sphereGranFlow/toteblender/settings/test | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tutorials/sphereGranFlow/toteblender/settings/test diff --git a/tutorials/sphereGranFlow/toteblender/settings/test b/tutorials/sphereGranFlow/toteblender/settings/test deleted file mode 100644 index 6a69f920..00000000 --- a/tutorials/sphereGranFlow/toteblender/settings/test +++ /dev/null @@ -1 +0,0 @@ -f From 04d7ecfe9e91155945c541ec28ef6fae0bb746f9 Mon Sep 17 00:00:00 2001 From: Omid Khosravi <123903048+omid-khosravi@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:58:42 +0330 Subject: [PATCH 10/27] Add ReadMe file via Upload --- .../sphereGranFlow/toteblender/ReadMe.md | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 tutorials/sphereGranFlow/toteblender/ReadMe.md diff --git a/tutorials/sphereGranFlow/toteblender/ReadMe.md b/tutorials/sphereGranFlow/toteblender/ReadMe.md new file mode 100644 index 00000000..4a9ff9bf --- /dev/null +++ b/tutorials/sphereGranFlow/toteblender/ReadMe.md @@ -0,0 +1,244 @@ +# 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 drum. +* **20000** particles with **4 mm** diameter, at the rate of 20000 particles/s for 1 sec. + + + +
+ a view of the tote-blender while rotating +
+
+ +
+ + + +# 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. + +## Defining particles +Then in the `caseSetup/sphereShape` the diameter and the material name of the particles are defined. +```C++ +// names of shapes +names (sphere1); +// diameter of shapes (m) +diameters (0.004); +// material names for shapes +materials (prop1); +``` +## 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 +
+ +```C++ +// 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; +// box for positioning particles + box + { +// lower corner point of the box + min (-0.06 -0.06 0.08); +// upper corner point of the box + max (0.06 0.06 0.18); + } +``` + ## 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). +```C++ + // a list of materials names +materials (prop1); +// density of materials [kg/m3] +densities (1000.0); + +contactListType sortedContactList; + +model +{ + contactForceModel nonLinearNonLimited; + rollingFrictionModel normal; + /* + Property (prop1-prop1); + */ +// 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 drum. 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 +{ + enterGate + { + // type of wall + type planeWall; + // coords of wall + p1 (-0.05 -0.05 0.3); + p2 (-0.05 0.05 0.3); + p3 ( 0.05 0.05 0.3); + p4 (0.05 -0.05 0.3); + // material of wall + material prop1; + // motion component name + motion rotAxis; + } + + cylinderinlet + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.28); + // end point of cylinder axis + p2 (0.0 0.0 0.3); + // radius at p1 + radius1 0.03; + // radius at p2 + radius2 0.03; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + + coneShelltop + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.2); + // end point of cylinder axis + p2 (0.0 0.0 0.28); + // radius at p1 + radius1 0.1; + // radius at p2 + radius2 0.03; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + + cylinderShell + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.1); + // end point of cylinder axis + p2 (0.0 0.0 0.2); + // radius at p1 + radius1 0.1; + // radius at p2 + radius2 0.1; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + + coneShelldown + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.02); + // end point of cylinder axis + p2 (0.0 0.0 0.1); + // radius at p1 + radius1 0.03; + // radius at p2 + radius2 0.1; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + /* + This is a plane wall at the exit of silo + */ + + cylinderoutlet + { + // type of the wall + type cylinderWall; + // begin point of cylinder axis + p1 (0.0 0.0 0.0); + // end point of cylinder axis + p2 (0.0 0.0 0.02); + // radius at p1 + radius1 0.03; + // radius at p2 + radius2 0.03; + // number of divisions + resolution 36; + // material name of this wall + material prop1; + // motion component name + motion rotAxis; + } + 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 rotAxis; + } + +} +``` +### 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**. +```C++ +rotatingAxisMotionInfo +{ + rotAxis + { + 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 + omega 3; // rotation speed (rad/s) + } +} +``` +## Performing Simulation +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. +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 From 7dee94e29787b200083dd2291525ebd98e783c7c Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Sun, 26 Mar 2023 22:23:50 +0430 Subject: [PATCH 11/27] Update settingsDict Efficient domain --- tutorials/sphereGranFlow/toteblender/settings/settingsDict | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/settingsDict b/tutorials/sphereGranFlow/toteblender/settings/settingsDict index 28b9a552..d5a05a48 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/settingsDict +++ b/tutorials/sphereGranFlow/toteblender/settings/settingsDict @@ -23,7 +23,7 @@ g (0 0 -9.8); /* every particles that goes outside this domain is deleted. */ domain { - min (-0.5 -0.5 -0.5); + min (-0.3 -0.3 -0.3); max (0.5 0.5 0.5); } // integration method From 55f0b6c0c1c38dad4da80696160df94f3cc2c2e7 Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Sun, 26 Mar 2023 23:04:39 +0430 Subject: [PATCH 12/27] Update geometryDict Rotation Speed rotating axis instead of rot axis move rotating axis info to motion model --- .../toteblender/settings/geometryDict | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict index 49d486bd..bb045806 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/geometryDict +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -7,7 +7,16 @@ objectType dictionary; /* ------------------------------------------------------------------------- */ // motion model: rotating object around an axis motionModel rotatingAxisMotion; - +// information for rotatingAxisMotion motion model +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 + omega 1.5708; // rotation speed ==> 15 rad/s + } +} surfaces { enterGate @@ -22,7 +31,7 @@ surfaces // material of wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } cylinderinlet @@ -139,13 +148,3 @@ surfaces } } -// information for rotatingAxisMotion motion model -rotatingAxisMotionInfo -{ - rotAxis - { - 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 - omega 3; // rotation speed (rad/s) - } -} From 013764669bddd242e226b7c167cc9f840f1eadcf Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Sun, 26 Mar 2023 23:20:30 +0430 Subject: [PATCH 13/27] Update geometryDict axisOfRotation instead of rotAxis --- .../sphereGranFlow/toteblender/settings/geometryDict | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict index bb045806..5ca048c8 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/geometryDict +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -51,7 +51,7 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } coneShelltop @@ -71,7 +71,7 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } cylinderShell @@ -91,7 +91,7 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } coneShelldown @@ -111,7 +111,7 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } /* This is a plane wall at the exit of silo @@ -134,7 +134,7 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } exitGate { @@ -144,7 +144,7 @@ surfaces p3 ( 0.05 0.05 0); p4 (0.05 -0.05 0); material prop1; - motion rotAxis; + motion axisOfRotation; } } From e504606a05cf737d27c1e5da13987af7e88a44f7 Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Sun, 26 Mar 2023 23:26:17 +0430 Subject: [PATCH 14/27] Update particlesDict Particles order changed from (z y x) to (x y z) --- tutorials/sphereGranFlow/toteblender/settings/particlesDict | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/particlesDict b/tutorials/sphereGranFlow/toteblender/settings/particlesDict index 49a26e76..4b2ef43e 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/particlesDict +++ b/tutorials/sphereGranFlow/toteblender/settings/particlesDict @@ -54,6 +54,6 @@ positionParticles // number of particles in the simulation numPoints 20000; // axis order for filling the space with particles - axisOrder (z y x); + axisOrder (x y z); } } From 55085648e6d175a005c33c4cdca35099ae3ee63d Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Sun, 26 Mar 2023 23:33:07 +0430 Subject: [PATCH 15/27] Update geometryDict Added start and end time of rotation. first phase settling of particles and then rotation --- tutorials/sphereGranFlow/toteblender/settings/geometryDict | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict index 5ca048c8..b30e9a0e 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/geometryDict +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -15,6 +15,10 @@ rotatingAxisMotionInfo 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 omega 1.5708; // rotation speed ==> 15 rad/s + // Start time of Geometry Rotating (s) + startTime 1; + // End time of Geometry Rotating (s) + endTime 9.5; } } surfaces From 9580c4cdcd15d159c8123d0e5ebc74891d7b9921 Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Tue, 28 Mar 2023 02:06:40 +0430 Subject: [PATCH 16/27] Update particlesDict change the insert region from box to cylinder --- .../sphereGranFlow/toteblender/settings/particlesDict | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/particlesDict b/tutorials/sphereGranFlow/toteblender/settings/particlesDict index 4b2ef43e..f78dc644 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/particlesDict +++ b/tutorials/sphereGranFlow/toteblender/settings/particlesDict @@ -39,12 +39,13 @@ positionParticles // perform initial sorting based on morton code? mortonSorting Yes; // box for positioning particles - box + cylinder { -// lower corner point of the box - min (-0.06 -0.06 0.08); -// upper corner point of the box - max (0.06 0.06 0.18); +// Coordinates of cylinderRegion (m,m,m)x + p1 (0.03 0.06 0.08); + p2 (0.03 0.06 0.18); +// radius of cylinder + radius 0.035; } positionOrderedInfo From b9d8aab1afaaa1fc4d6d3d78e4b19745b4930a2b Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Tue, 28 Mar 2023 16:53:07 +0430 Subject: [PATCH 17/27] Update tote blender Changed the particle insert region from box to cylinder --- .../toteblender/settings/particlesDict | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/particlesDict b/tutorials/sphereGranFlow/toteblender/settings/particlesDict index f78dc644..8cccaabf 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/particlesDict +++ b/tutorials/sphereGranFlow/toteblender/settings/particlesDict @@ -38,23 +38,23 @@ positionParticles maxNumberOfParticles 40000; // perform initial sorting based on morton code? mortonSorting Yes; -// box for positioning particles - cylinder +// cylinder for positioning particles + cylinder { -// Coordinates of cylinderRegion (m,m,m)x - p1 (0.03 0.06 0.08); - p2 (0.03 0.06 0.18); +// 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.035; + radius 0.066; } positionOrderedInfo { // minimum space between centers of particles - diameter 0.004; + diameter 0.003; // number of particles in the simulation numPoints 20000; // axis order for filling the space with particles - axisOrder (x y z); + axisOrder (z y x); } } From 1d61b87ad4ccd490e6efa890721f3bb0a7e644ea Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Tue, 28 Mar 2023 16:56:41 +0430 Subject: [PATCH 18/27] Update particlesDict Changed the rotVelocity to rVelocity. --- tutorials/sphereGranFlow/toteblender/settings/particlesDict | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/particlesDict b/tutorials/sphereGranFlow/toteblender/settings/particlesDict index 8cccaabf..f7e291c4 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/particlesDict +++ b/tutorials/sphereGranFlow/toteblender/settings/particlesDict @@ -20,7 +20,7 @@ setFields // linear acceleration (m/s2) acceleration realx3 (0 0 0); // rotational velocity (rad/s) - rotVelocity realx3 (0 0 0); + rVelocity realx3 (0 0 0); // name of the particle shape shapeName word sphere1; } From fc37e7042deb9cf3cbc676666f14e2ce9d0f2a63 Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Tue, 28 Mar 2023 17:02:29 +0430 Subject: [PATCH 19/27] Update geometryDict the names of some geometries were fixed --- .../sphereGranFlow/toteblender/settings/geometryDict | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict index b30e9a0e..246c7c30 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/geometryDict +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -23,7 +23,7 @@ rotatingAxisMotionInfo } surfaces { - enterGate + topGate { // type of wall type planeWall; @@ -38,7 +38,7 @@ surfaces motion axisOfRotation; } - cylinderinlet + topCylinder { // type of the wall type cylinderWall; @@ -98,7 +98,7 @@ surfaces motion axisOfRotation; } - coneShelldown + coneShellbottom { // type of the wall type cylinderWall; @@ -121,7 +121,7 @@ surfaces This is a plane wall at the exit of silo */ - cylinderoutlet + bottomCylinder { // type of the wall type cylinderWall; @@ -140,7 +140,7 @@ surfaces // motion component name motion axisOfRotation; } - exitGate + bottomGate { type planeWall; p1 (-0.05 -0.05 0); From 8f2749d599ae12ebe5a1bb62765d18b6dfa5383d Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Tue, 28 Mar 2023 17:50:59 +0430 Subject: [PATCH 20/27] Update tote blender ReadMe fixed some misspellings and code blocks. --- .../sphereGranFlow/toteblender/ReadMe.md | 61 ++++++++++++------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/ReadMe.md b/tutorials/sphereGranFlow/toteblender/ReadMe.md index 4a9ff9bf..6a423f66 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 drum. -* **20000** particles with **4 mm** diameter, at the rate of 20000 particles/s for 1 sec. +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**. @@ -43,14 +43,26 @@ positionParticles maxNumberOfParticles 40000; // perform initial sorting based on morton code? mortonSorting Yes; -// box for positioning particles - box +// cylinder for positioning particles + cylinder { -// lower corner point of the box - min (-0.06 -0.06 0.08); -// upper corner point of the box - max (0.06 0.06 0.18); +// 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; } + + 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); + } +} ``` ## 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). @@ -92,7 +104,7 @@ In the `settings/geometryDict` file, the geometry and axis of rotation is define ```C++ surfaces { - enterGate + topGate { // type of wall type planeWall; @@ -104,10 +116,10 @@ surfaces // material of wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } - cylinderinlet + topCylinder { // type of the wall type cylinderWall; @@ -124,7 +136,7 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } coneShelltop @@ -144,7 +156,7 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } cylinderShell @@ -164,10 +176,10 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } - coneShelldown + coneShellbottom { // type of the wall type cylinderWall; @@ -184,13 +196,13 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } /* This is a plane wall at the exit of silo */ - cylinderoutlet + bottomCylinder { // type of the wall type cylinderWall; @@ -207,9 +219,9 @@ surfaces // material name of this wall material prop1; // motion component name - motion rotAxis; + motion axisOfRotation; } - exitGate + bottomGate { type planeWall; p1 (-0.05 -0.05 0); @@ -217,7 +229,7 @@ surfaces p3 ( 0.05 0.05 0); p4 (0.05 -0.05 0); material prop1; - motion rotAxis; + motion axisOfRotation; } } @@ -225,13 +237,18 @@ 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**. ```C++ +// information for rotatingAxisMotion motion model rotatingAxisMotionInfo { - rotAxis + 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 - omega 3; // rotation speed (rad/s) + omega 1.5708; // rotation speed ==> 15 rad/s + // Start time of Geometry Rotating (s) + startTime 1; + // End time of Geometry Rotating (s) + endTime 9.5; } } ``` From 7e216f4cac34ffeec9f62cffac99c98a5c6ac920 Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Tue, 28 Mar 2023 18:11:30 +0430 Subject: [PATCH 21/27] solidProperty instead of prop1 --- .../toteblender/caseSetup/interaction | 4 ++-- .../toteblender/caseSetup/sphereShape | 2 +- .../toteblender/settings/geometryDict | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/interaction b/tutorials/sphereGranFlow/toteblender/caseSetup/interaction index f97d2f4f..6dfdc46d 100644 --- a/tutorials/sphereGranFlow/toteblender/caseSetup/interaction +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/interaction @@ -6,7 +6,7 @@ objectName interaction; objectType dicrionary; /* ------------------------------------------------------------------------- */ // a list of materials names -materials (prop1); +materials (solidProperty); // density of materials [kg/m3] densities (1000.0); @@ -17,7 +17,7 @@ model contactForceModel nonLinearNonLimited; rollingFrictionModel normal; /* - Property (prop1-prop1); + Property (solidProperty-solidProperty); */ // Young modulus [Pa] Yeff (1.0e6); diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape b/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape index ff2df8d1..566fb339 100644 --- a/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape @@ -10,4 +10,4 @@ names (sphere1); // diameter of shapes (m) diameters (0.004); // material names for shapes -materials (prop1); \ No newline at end of file +materials (solidProperty); \ No newline at end of file diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict index 246c7c30..da479bac 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/geometryDict +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -33,7 +33,7 @@ surfaces p3 ( 0.05 0.05 0.3); p4 (0.05 -0.05 0.3); // material of wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -53,7 +53,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -73,7 +73,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -93,7 +93,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -113,7 +113,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -136,7 +136,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -147,7 +147,7 @@ surfaces p2 (-0.05 0.05 0); p3 ( 0.05 0.05 0); p4 (0.05 -0.05 0); - material prop1; + material solidProperty; motion axisOfRotation; } From 861a7a7b5d959c12d02abe5c7731ae37b36b882e Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Thu, 30 Mar 2023 22:11:30 +0430 Subject: [PATCH 22/27] Update geometryDict Top gate was replaced from wall to cylinder. **There is an error for bottom Gate that i couldn't solve it.** --- .../toteblender/settings/geometryDict | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict index da479bac..d5d1df99 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/geometryDict +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -23,21 +23,25 @@ rotatingAxisMotionInfo } surfaces { + topGate topGate { // type of wall - type planeWall; - // coords of wall - p1 (-0.05 -0.05 0.3); - p2 (-0.05 0.05 0.3); - p3 ( 0.05 0.05 0.3); - p4 (0.05 -0.05 0.3); + 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 + radius1 0.03; + // radius at p2 + radius2 0.0001; // material of wall material solidProperty; // motion component name motion axisOfRotation; } - + topCylinder { // type of the wall @@ -53,7 +57,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material solidProperty; + material prop1; // motion component name motion axisOfRotation; } @@ -73,7 +77,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material solidProperty; + material prop1; // motion component name motion axisOfRotation; } @@ -93,12 +97,12 @@ surfaces // number of divisions resolution 36; // material name of this wall - material solidProperty; + material prop1; // motion component name motion axisOfRotation; } - coneShellbottom + coneShelldown { // type of the wall type cylinderWall; @@ -113,7 +117,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material solidProperty; + material prop1; // motion component name motion axisOfRotation; } @@ -136,18 +140,18 @@ surfaces // number of divisions resolution 36; // material name of this wall - material solidProperty; + material prop1; // motion component name motion axisOfRotation; } - bottomGate + 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 solidProperty; + material prop1; motion axisOfRotation; } From 519ae70905d5864729656ec74bb3be50b74fbd9f Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Thu, 30 Mar 2023 22:14:48 +0430 Subject: [PATCH 23/27] Update ReadMe toteBlender geometry code block was fixed. --- .../sphereGranFlow/toteblender/ReadMe.md | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/ReadMe.md b/tutorials/sphereGranFlow/toteblender/ReadMe.md index 6a423f66..5a6d13b5 100644 --- a/tutorials/sphereGranFlow/toteblender/ReadMe.md +++ b/tutorials/sphereGranFlow/toteblender/ReadMe.md @@ -104,21 +104,25 @@ In the `settings/geometryDict` file, the geometry and axis of rotation is define ```C++ surfaces { + topGate topGate { // type of wall - type planeWall; - // coords of wall - p1 (-0.05 -0.05 0.3); - p2 (-0.05 0.05 0.3); - p3 ( 0.05 0.05 0.3); - p4 (0.05 -0.05 0.3); + 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 + radius1 0.03; + // radius at p2 + radius2 0.0001; // material of wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } - + topCylinder { // type of the wall @@ -179,7 +183,7 @@ surfaces motion axisOfRotation; } - coneShellbottom + coneShelldown { // type of the wall type cylinderWall; @@ -221,7 +225,7 @@ surfaces // motion component name motion axisOfRotation; } - bottomGate + exitGate { type planeWall; p1 (-0.05 -0.05 0); From f14e9169f8e6ccb6793030921d83db875096162c Mon Sep 17 00:00:00 2001 From: Omid Khosravi Date: Thu, 30 Mar 2023 22:28:53 +0430 Subject: [PATCH 24/27] Update geometryDict changed prop1 to solidProperty --- .../sphereGranFlow/toteblender/settings/geometryDict | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict index d5d1df99..da9b22e8 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/geometryDict +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -57,7 +57,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -77,7 +77,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -97,7 +97,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -117,7 +117,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -140,7 +140,7 @@ surfaces // number of divisions resolution 36; // material name of this wall - material prop1; + material solidProperty; // motion component name motion axisOfRotation; } @@ -151,7 +151,7 @@ surfaces p2 (-0.05 0.05 0); p3 ( 0.05 0.05 0); p4 (0.05 -0.05 0); - material prop1; + material solidProperty; motion axisOfRotation; } From e8e093dbfc26e0df959163a0b478c6e628b02a6c Mon Sep 17 00:00:00 2001 From: Hamidreza Norouzi Date: Thu, 30 Mar 2023 15:07:45 -0700 Subject: [PATCH 25/27] CLI::Timer renamed to remove compiler errors --- doc/Doxyfile | 5 +++-- doc/mdDocs/howToBuild.md | 8 +++++--- doc/mdDocs/howToUsePhasicFlow.md | 5 +++++ .../commandLine/CLI/{Timer.hpp => cliTimer.hpp} | 12 ++++++------ tutorials/sphereGranFlow/rotatingDrumSmall/README.md | 1 + 5 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 doc/mdDocs/howToUsePhasicFlow.md rename src/phasicFlow/commandLine/CLI/{Timer.hpp => cliTimer.hpp} (91%) diff --git a/doc/Doxyfile b/doc/Doxyfile index e9ba8098..92592451 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -822,7 +822,8 @@ WARN_LOGFILE = INPUT = $(pFlow_PROJECT_DIR)/src \ $(pFlow_PROJECT_DIR)/utilities \ $(pFlow_PROJECT_DIR)/solvers \ - mdDocs + mdDocs \ + $(pFlow_PROJECT_DIR)/tutorials # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -866,7 +867,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = $(pFlow_PROJECT_DIR)/src/phasicFlow/commandLine +EXCLUDE = $(pFlow_PROJECT_DIR)/src/phasicFlow/commandLine/CLI # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded diff --git a/doc/mdDocs/howToBuild.md b/doc/mdDocs/howToBuild.md index 7fbd8162..ce979692 100644 --- a/doc/mdDocs/howToBuild.md +++ b/doc/mdDocs/howToBuild.md @@ -123,17 +123,19 @@ After building, `bin`, `include`, and `lib` folders will be created in `~/Phasic **note 1**: When compiling the code in parallel, you need to have enough RAM on your computer. As a rule, you need 1 GB free RAM per each processor in your computer for compiling in parallel. You may want to use fewer number of cores on your computer by using the following command: + `$ make install -j 3` -the above command uses only 3 cores for compiling. + +the above command only uses 3 cores for compiling. **note 2**: By default PhasicFlow is compiled with **double** as floating point variable. You can compile it with **float**. Just in the command line of camke added `-DpFlow_Build_Double=Off` flag to compile it with float. For example if you are building for cuda, you can enter the following command: -`$ cmake ../ -DpFlow_Build_Cuda=On --DpFlow_Build_Double=Off` +`$ cmake ../ -DpFlow_Build_Cuda=On -DpFlow_Build_Double=Off` ### Step 6: Testing In the current terminal or a new terminal enter the following command: -`$ ~checkPhasicFlow` +`$ checkPhasicFlow` This command shows the host and device environments and software version. If PhasicFlow was build correctly, you would get the following output: ``` diff --git a/doc/mdDocs/howToUsePhasicFlow.md b/doc/mdDocs/howToUsePhasicFlow.md new file mode 100644 index 00000000..ca8e69db --- /dev/null +++ b/doc/mdDocs/howToUsePhasicFlow.md @@ -0,0 +1,5 @@ +# How to use PhasicFlow {#howToUsePhasicFlow} +Here you will learn how to use PhasicFlow to setup a granular flow simulation. The inputs for simulation are supplied through some text-based files, called file dictionary, located in two folders: `settings` and `caseSetup`. These folders are located under the root case directory. +All the commands are performed through terminal in which the current working directory is root case directory (you see `settings` and `caseSetup` folders when `ls` command is entered). The states of geometry and particles are stored in time folders with names that represent the time. When simulation is finished, one case use post-processing tool pFlowToVTK to convert the stored results in the time folder into VTK file format. The VTK file format can be read by Paraview. +A set of tutorials with detailed descriptions are provided to show you how to use PhasicFlow for various granular flow problems. Here is a list of them. +* [Small rotating drum] (@ref rotatingDrumSmall) diff --git a/src/phasicFlow/commandLine/CLI/Timer.hpp b/src/phasicFlow/commandLine/CLI/cliTimer.hpp similarity index 91% rename from src/phasicFlow/commandLine/CLI/Timer.hpp rename to src/phasicFlow/commandLine/CLI/cliTimer.hpp index 429ca026..d345b4bf 100644 --- a/src/phasicFlow/commandLine/CLI/Timer.hpp +++ b/src/phasicFlow/commandLine/CLI/cliTimer.hpp @@ -22,7 +22,7 @@ namespace CLI { /// This is a simple timer with pretty printing. Creating the timer starts counting. -class Timer { +class cliTimer { protected: /// This is a typedef to make clocks easier to use using clock = std::chrono::steady_clock; @@ -57,7 +57,7 @@ class Timer { public: /// Standard constructor, can set title and print function - explicit Timer(std::string title = "Timer", time_print_t time_print = Simple) + explicit cliTimer(std::string title = "cliTimer", time_print_t time_print = Simple) : title_(std::move(title)), time_print_(std::move(time_print)), start_(clock::now()) {} /// Time a function by running it multiple times. Target time is the len to target. @@ -111,17 +111,17 @@ class Timer { std::string to_string() const { return time_print_(title_, make_time_str()); } /// Division sets the number of cycles to divide by (no graphical change) - Timer &operator/(std::size_t val) { + cliTimer &operator/(std::size_t val) { cycles = val; return *this; } }; /// This class prints out the time upon destruction -class AutoTimer : public Timer { +class AutoTimer : public cliTimer { public: /// Reimplementing the constructor is required in GCC 4.7 - explicit AutoTimer(std::string title = "Timer", time_print_t time_print = Simple) : Timer(title, time_print) {} + explicit AutoTimer(std::string title = "cliTimer", time_print_t time_print = Simple) : cliTimer(title, time_print) {} // GCC 4.7 does not support using inheriting constructors. /// This destructor prints the string @@ -131,4 +131,4 @@ class AutoTimer : public Timer { } // namespace CLI /// This prints out the time if shifted into a std::cout like stream. -inline std::ostream &operator<<(std::ostream &in, const CLI::Timer &timer) { return in << timer.to_string(); } +inline std::ostream &operator<<(std::ostream &in, const CLI::cliTimer &timer) { return in << timer.to_string(); } diff --git a/tutorials/sphereGranFlow/rotatingDrumSmall/README.md b/tutorials/sphereGranFlow/rotatingDrumSmall/README.md index 300b61d8..60d0ad55 100644 --- a/tutorials/sphereGranFlow/rotatingDrumSmall/README.md +++ b/tutorials/sphereGranFlow/rotatingDrumSmall/README.md @@ -1,3 +1,4 @@ +# Simulating a small rotating drum {#rotatingDrumSmall} ## Problem definition The problem is to simulate a rotating drum with the diameter 0.24 m and the length 0.1 m rotating at 11.6 rpm. It is filled with 30,000 4-mm spherical particles. The timestep for integration is 0.00001 s.
From c3a729e2d35c0e8a0e4b3400303868d1a21efd57 Mon Sep 17 00:00:00 2001 From: Hamidreza Norouzi Date: Fri, 31 Mar 2023 08:21:24 -0700 Subject: [PATCH 26/27] tote blender corrected --- .../toteblender/caseSetup/interaction | 49 +++-- .../toteblender/caseSetup/particleInsertion | 4 +- .../toteblender/caseSetup/sphereShape | 9 +- .../toteblender/settings/geometryDict | 195 ++++++++++++------ .../toteblender/settings/particlesDict | 57 ++--- .../toteblender/settings/settingsDict | 19 +- 6 files changed, 217 insertions(+), 116 deletions(-) diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/interaction b/tutorials/sphereGranFlow/toteblender/caseSetup/interaction index 6dfdc46d..6b4847dc 100644 --- a/tutorials/sphereGranFlow/toteblender/caseSetup/interaction +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/interaction @@ -5,8 +5,10 @@ objectName interaction; objectType dicrionary; /* ------------------------------------------------------------------------- */ + // a list of materials names materials (solidProperty); + // density of materials [kg/m3] densities (1000.0); @@ -14,47 +16,60 @@ contactListType sortedContactList; model { - contactForceModel nonLinearNonLimited; - rollingFrictionModel normal; + contactForceModel nonLinearNonLimited; + + rollingFrictionModel normal; + /* 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); } + contactSearch { -// method for broad search particle-particle + + // method for broad search particle-particle method NBS; -// method for broad search particle-wall + + // method for broad search particle-wall wallMapping cellMapping; NBSInfo { - // each 20 timesteps, update neighbor list + // each 20 timesteps, update neighbor list updateFrequency 20; - // bounding box size to particle diameter (max) + + // bounding box size to particle diameter (max) sizeRatio 1.1; } cellMappingInfo { - // each 20 timesteps, update neighbor list + // each 20 timesteps, update neighbor list updateFrequency 20; - // bounding box for particle-wall search (> 0.5) + + // bounding box for particle-wall search (> 0.5) cellExtent 0.7; } diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/particleInsertion b/tutorials/sphereGranFlow/toteblender/caseSetup/particleInsertion index d8f022c6..45ca817c 100644 --- a/tutorials/sphereGranFlow/toteblender/caseSetup/particleInsertion +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/particleInsertion @@ -5,8 +5,10 @@ objectName particleInsertion; objectType dicrionary; /* ------------------------------------------------------------------------- */ + // is insertion active? -active no; +active no; + // not implemented for yes collisionCheck No; diff --git a/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape b/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape index 566fb339..b579d7c6 100644 --- a/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape +++ b/tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape @@ -5,9 +5,12 @@ objectName sphereDict; objectType sphereShape; /* ------------------------------------------------------------------------- */ -// names of shapes + +// name of shapes names (sphere1); + // diameter of shapes (m) -diameters (0.004); -// material names for shapes +diameters (0.005); + +// material name for shapes materials (solidProperty); \ No newline at end of file diff --git a/tutorials/sphereGranFlow/toteblender/settings/geometryDict b/tutorials/sphereGranFlow/toteblender/settings/geometryDict index da9b22e8..b65854eb 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/geometryDict +++ b/tutorials/sphereGranFlow/toteblender/settings/geometryDict @@ -5,154 +5,217 @@ objectName geometryDict; objectType dictionary; /* ------------------------------------------------------------------------- */ + // motion model: rotating object around an axis motionModel rotatingAxisMotion; + // information for rotatingAxisMotion motion model 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; } } + 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 name of this wall material solidProperty; - // motion component name + + // 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 name of this wall material solidProperty; - // motion component name + + // 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 name of this wall material solidProperty; - // motion component name + + // 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 name of this wall material solidProperty; - // motion component name + + // 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 name of this wall material solidProperty; - // motion component name + + // 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 solidProperty; - 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; } } diff --git a/tutorials/sphereGranFlow/toteblender/settings/particlesDict b/tutorials/sphereGranFlow/toteblender/settings/particlesDict index f7e291c4..20f56227 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/particlesDict +++ b/tutorials/sphereGranFlow/toteblender/settings/particlesDict @@ -12,16 +12,18 @@ setFields These fields should always be defined for simulations with spherical particles. */ - defaultValue { -// linear velocity (m/s) + // linear velocity (m/s) velocity realx3 (0 0 0); -// linear acceleration (m/s2) + + // linear acceleration (m/s2) acceleration realx3 (0 0 0); -// rotational velocity (rad/s) - rVelocity realx3 (0 0 0); -// name of the particle shape + + // rotational velocity (rad/s) + rVelocity realx3 (0 0 0); + + // name of the particle shape shapeName word sphere1; } @@ -32,29 +34,36 @@ setFields // 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); } } diff --git a/tutorials/sphereGranFlow/toteblender/settings/settingsDict b/tutorials/sphereGranFlow/toteblender/settings/settingsDict index d5a05a48..34c287bb 100644 --- a/tutorials/sphereGranFlow/toteblender/settings/settingsDict +++ b/tutorials/sphereGranFlow/toteblender/settings/settingsDict @@ -6,16 +6,22 @@ objectName settingsDict; objectType dictionary;; /*---------------------------------------------------------------------------*/ run toteBlender; + // time step for integration (s) -dt 0.00001; +dt 0.00004; + // start time for simulation startTime 0; + // end time for simulation endTime 10; + // time interval for saving the simulation -saveInterval 0.1; +saveInterval 0.05; + // maximum number of digits for time folder -timePrecision 6; +timePrecision 3; + // gravity vector (m/s2) g (0 0 -9.8); @@ -26,9 +32,12 @@ domain min (-0.3 -0.3 -0.3); max (0.5 0.5 0.5); } + // integration method -integrationMethod AdamsBashforth2; +integrationMethod AdamsMoulton4; + // report timers? timersReport Yes; + // time interval for reporting timers -timersReportInterval 0.01; +timersReportInterval 0.02; \ No newline at end of file From 8faa1a5e531257240e6b98e11726d03c3ec9758d Mon Sep 17 00:00:00 2001 From: Hamidreza Norouzi Date: Fri, 31 Mar 2023 10:48:23 -0700 Subject: [PATCH 27/27] documentation for rotatingAxis --- .../entities/rotatingAxis/rotatingAxis.hpp | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/MotionModel/entities/rotatingAxis/rotatingAxis.hpp b/src/MotionModel/entities/rotatingAxis/rotatingAxis.hpp index 07e8de5d..0fa38bc7 100644 --- a/src/MotionModel/entities/rotatingAxis/rotatingAxis.hpp +++ b/src/MotionModel/entities/rotatingAxis/rotatingAxis.hpp @@ -32,6 +32,33 @@ class rotatingAxis; #include "rotatingAxisFwd.hpp" +/** + * An axis which rotates around itself at specified speed + * + * This defines an axis with two end points that rotates around + * itself at specified speed (rad/s). + * + * + \verbatim + // This creates an axis of rotation around x-axis, rotation starts at t = 1 s + // and ends at t = 5 s. + { + p1 (0 0 0); + p2 (1 0 0); + omega 1.57; + startTime 1; + endTime 5; + } \endverbatim + * + * | parameter | value type | discription | optional (default) | + * |----| ---- | ---- | ---- | + * | p1 | realx3 | begin point of axis | No | + * | p2 | realx3 | end point of axis | No | + * | omega | real | rotation speed (rad/s) | No | + * | startTime | real | start time of rotation (s) | Yes (0) | + * | endTime | real | end time of rotation (s) | Yes (infinity) | + * + */ class rotatingAxis : public timeInterval, @@ -39,56 +66,72 @@ class rotatingAxis { protected: - // rotation speed + /// rotation speed real omega_ = 0; + /// is rotating bool rotating_ = false; public: + // - Constructor + + /// Empty constructor FUNCTION_HD rotatingAxis(){} + /// Construct from dictionary FUNCTION_H rotatingAxis(const dictionary& dict); + /// Construct from components FUNCTION_HD rotatingAxis(const realx3& p1, const realx3& p2, real omega = 0.0); + /// Copy constructor FUNCTION_HD rotatingAxis(const rotatingAxis&) = default; + /// Copy asssignment rotatingAxis& operator=(const rotatingAxis&) = default; + /// Set omega FUNCTION_HD real setOmega(real omega); - + /// Return omega INLINE_FUNCTION_HD real omega()const { return omega_; } + /// Is rotating INLINE_FUNCTION_HD bool isRotating()const { return rotating_; } + /// Linear tangential velocity at point p INLINE_FUNCTION_HD realx3 linTangentialVelocityPoint(const realx3 &p)const; // - IO operation + + /// Read from dictionary FUNCTION_H bool read(const dictionary& dict); + /// Write to dictionary FUNCTION_H bool write(dictionary& dict) const; + /// Read from input stream is FUNCTION_H bool read(iIstream& is); + /// Write to output stream os FUNCTION_H bool write(iOstream& os)const;