Difference between revisions of "Contrib/OLAFOAM"

From OpenFOAMWiki
(Ongoing Development)
(Full changes)
Line 1: Line 1:
[https://sites.google.com/site/olafoamcfd OLAFOAM] is a set of solvers and boundary conditions to generate and absorb water waves actively at the boundaries and to simulate their interaction with porous coastal structures.
+
[https://sites.google.com/site/olafoamcfd OLAFOAM] is a new numerical model from the creator and developer of IHFOAM. This free and open source project is committed to bringing the latest advances in the simulation of wave dynamics to the OpenFOAM and FOAM-extend communities.
 +
 
 +
OLAFOAM is a set of solvers and boundary conditions to generate and absorb water waves actively at the boundaries and to simulate their interaction with porous coastal structures.
  
 
The main scope of these modelling tools is coastal, marine, hydraulic and offshore engineering.
 
The main scope of these modelling tools is coastal, marine, hydraulic and offshore engineering.
Line 7: Line 9:
 
<noinclude>
 
<noinclude>
 
[[Category:FeaturedArticle]]
 
[[Category:FeaturedArticle]]
== IHFOAM Overview ==
+
== OLAFOAM Overview ==
The IHFOAM package includes:
+
The OLAFOAM package includes:
* Individual boundary conditions for wave generation and active wave absorption for alpha1 and U fields. (libIHwaveGeneration.so)
+
* Individual boundary conditions for wave generation and active wave absorption for alpha1 and U fields. (libwaveGeneration.so)
** '''IH_Waves_InletAlpha'''
+
** '''waveAlpha'''
** '''IH_Waves_InletVelocity'''
+
** '''waveVelocity'''
* Boundary conditions for pure wave absorption applicable to U field. Based on 2D or 3D theories, both are applicable to 3D cases. (libIHwaveAbsorption.so)
+
* Boundary conditions for pure wave absorption applicable to U field. Based on 2D or 3D theories, both are applicable to 3D cases. (libwaveAbsorption.so)
** '''IH_3D_3DAbsorption_InletVelocity'''
+
** '''2DWaveAbsorptionVelocity'''
** '''IH_3D_2DAbsorption_InletVelocity'''
+
** '''3DWaveAbsorptionVelocity'''
 +
* Boundary condition for wave generation and active wave absorption using a piston wavemaker, with any number of paddles. (libmultiPistonMovement.so)
 +
** '''multiPistonMovement'''
 
* Solvers to be used with your favourite version of OpenFOAM or FOAM-extend. See compatibility below.
 
* Solvers to be used with your favourite version of OpenFOAM or FOAM-extend. See compatibility below.
** '''ihFoam'''
+
** '''olaFoam'''
** '''ihDyMFoam'''
+
** '''olaDyMFoam'''
 
* Brief reference manual
 
* Brief reference manual
 
* Tutorials and validation cases
 
* Tutorials and validation cases
  
=== About IHFOAM solvers ===  
+
=== About OLAFOAM solvers ===  
ihFoam and ihDyMFoam solve two-phase incompressible flows within porous media by means of the VARANS (Volume-Averaged Reynolds-Averaged Navier-Stokes) equations. More information will be added, in the mean time check the [[#References_and_Citing | references]].
+
olaFoam and olaDyMFoam solve two-phase incompressible flows within porous media by means of the VARANS (Volume-Averaged Reynolds-Averaged Navier-Stokes) equations. More information will be added, in the mean time check the [[#References_and_Citing | references]].
  
Both solvers are derived from interFoam and interDyMFoam. Furthermore, outside the porous media, the VARANS equations are identical to the classic RANS. Therefore, <u>ihFoam and ihDyMFoam can be used instead of interFoam and interDyMFoam even when the case presents no porous zones.</u>
+
Both solvers are derived from interFoam and interDyMFoam. Furthermore, outside the porous media, the VARANS equations are identical to the classic RANS. Therefore, <u>olaFoam and olaDyMFoam can be used instead of interFoam and interDyMFoam even when the case presents no porous zones.</u>
  
 
=== Supported Versions ===  
 
=== Supported Versions ===  
{{VersionInfo}}{{Version1.6-ext}}{{Version1.7.1}}{{Version2.1.1}}{{Version2.2.2}}{{Version2.3.0}}{{Version2.4.0}}{{Version3.0-ext}}{{Version3.1-ext}}
+
{{VersionInfo}}{{Version1.6-ext}}{{Version1.7.1}}{{Version2.1.1}}{{Version2.2.2}}{{Version2.3.0}}{{Version2.4.0}}{{Version3.0.0}}{{Version3.0-ext}}{{Version3.1-ext}}{{Version3.2-ext}}
  
 
Known issues:
 
Known issues:
Line 44: Line 48:
 
** Fixed with commits c5a2b9d7 (master) and 02833621 (nextRelease).
 
** Fixed with commits c5a2b9d7 (master) and 02833621 (nextRelease).
 
** The '''solution''' can be found [http://www.cfd-online.com/Forums/openfoam-bugs/139466-fe-3-1-parallel-issues-bcs-gmax-reduce.html#post504033 here].  
 
** The '''solution''' can be found [http://www.cfd-online.com/Forums/openfoam-bugs/139466-fe-3-1-parallel-issues-bcs-gmax-reduce.html#post504033 here].  
 +
 +
{{Version3.2-ext}} the boundary conditions compile and everything works.
 +
* Running in parallel yields an error.
 +
** '''Solution:''' edit your case's controlDict and add the following snippet. Reference [http://www.cfd-online.com/Forums/openfoam-programming-development/160288-commstype-foam-extend-3-2-a.html].
 +
<pre>
 +
OptimisationSwitches
 +
{
 +
    commsType      nonBlocking;
 +
}
 +
</pre>
  
 
{{Version1.7.1}} everything works when you compile OpenFOAM from source, as there is a problem with the precompiled installable pack. Reference [http://www.cfd-online.com/Forums/openfoam-solving/100091-waves2foam-related-topics.html#post339687].
 
{{Version1.7.1}} everything works when you compile OpenFOAM from source, as there is a problem with the precompiled installable pack. Reference [http://www.cfd-online.com/Forums/openfoam-solving/100091-waves2foam-related-topics.html#post339687].
Line 50: Line 64:
 
** IHFOAM solvers compile and work. Despite the BCs being included, apparently they are not linked, as they are not recognized.
 
** IHFOAM solvers compile and work. Despite the BCs being included, apparently they are not linked, as they are not recognized.
 
** If the boundary conditions are included dynamically in controlDict and used with the IHFOAM solvers, turbulence modelling does not work.
 
** If the boundary conditions are included dynamically in controlDict and used with the IHFOAM solvers, turbulence modelling does not work.
 
{{Version2.3.0}}{{Version2.4.0}}  everything is working now.
 
* We are experiencing severe problems with pressure calculations (not linked in any way to IHFOAM implementation) in this version.
 
** Find the bug report for the OpenFOAM developers [http://www.cfd-online.com/Forums/openfoam-bugs/139286-interfoam-pressure-miscalculation-2-3-wrt-previous-versions.html here].
 
* Although porous solvers and tutorials are now provided, we suggest you stay with prior OpenFOAM versions.
 
  
 
=== Ongoing Development ===  
 
=== Ongoing Development ===  
Line 65: Line 74:
 
* Wave theories implemented as classes, gathered by an autoPtr.
 
* Wave theories implemented as classes, gathered by an autoPtr.
 
* Custom dynamicRefineFvMesh to enable dynamic mesh refinement on snappyHexMesh-generated meshes, as seen in [http://dx.doi.org/10.1016/j.coastaleng.2013.09.002 the fourth paper].
 
* Custom dynamicRefineFvMesh to enable dynamic mesh refinement on snappyHexMesh-generated meshes, as seen in [http://dx.doi.org/10.1016/j.coastaleng.2013.09.002 the fourth paper].
* Custom boundary condition to generate waves using moving boundaries, as presented in [http://registration.sdewes.org/ofw09/dfile.php?dm=Px66e485b2cbb21c4047057636a5a9b187cdb36989x2 OFW9].
 
 
* Support for flap-type wavemakers.
 
* Support for flap-type wavemakers.
 
* Custom boundary condition to generate waves using pneumatic wavemakers.
 
* Custom boundary condition to generate waves using pneumatic wavemakers.
Line 71: Line 79:
  
 
=== References and Citing ===  
 
=== References and Citing ===  
IHFOAM is a product developed in the frame of a Master and PhD Thesis at the [http://www.ihcantabria.com/en/ Environmental Hydraulics Institute "IH Cantabria"] of the [http://www.unican.es University of Cantabria]. The PhD thesis can be found and downloaded for free here:
+
OLAFOAM is the evolution of IHFOAM, a product developed in the frame of a Master and PhD Thesis at the [http://www.ihcantabria.com/en/ Environmental Hydraulics Institute "IH Cantabria"] of the [http://www.unican.es University of Cantabria]. The PhD thesis can be found and downloaded for free here:
  
[http://www.tesisenred.net/handle/10803/288368 IHFOAM Pablo Higuera PhD Thesis]
+
[http://www.tesisenred.net/handle/10803/288368 Pablo Higuera PhD Thesis]
  
If you want to reference the model in your publications it should be called '''IHFOAM''', either if you are only using the wave generation and absorption capabilities (that was IHFOAM version 1.0) or the new porous media capabilities (that is IHFOAM version 2.0).
+
If you want to reference the model in your publications it should be called '''OLAFOAM''', and state that is an evolution of IHFOAM, referencing any of the following research papers.
  
 
The implementation and validation details are published in the following references:
 
The implementation and validation details are published in the following references:
Line 138: Line 146:
 
=== Get Connected ===
 
=== Get Connected ===
 
To submit your feedback, suggestions, bugs... you have many options:
 
To submit your feedback, suggestions, bugs... you have many options:
* The IHFOAM e-mail, found [http://ihfoam.ihcantabria.com/contact/ here].
+
* The OLAFOAM e-mail, found [https://sites.google.com/site/olafoamcfd/contact here].
 
* The e-mail found within the source code headers.
 
* The e-mail found within the source code headers.
* The [https://www.linkedin.com/groups?home=&gid=4548979 IHFOAM LinkedIn group].
 
  
IHFOAM at cfd-online
+
OLAFOAM at cfd-online
* [http://www.cfd-online.com/Forums/openfoam-news-announcements-other/138985-ihfoam-release.html IHFOAM Release Thread]
+
* [http://www.cfd-online.com/Forums/openfoam-news-announcements-other/138985-ihfoam-release.html OLAFOAM Release Thread (UPDATE)]
* [http://www.cfd-online.com/Forums/openfoam-solving/138987-ihfoam-thread.html IHFOAM Support Thread]
+
* [http://www.cfd-online.com/Forums/openfoam-solving/138987-ihfoam-thread.html OLAFOAM Support Thread (UPDATE)]
 
+
You can be informed and get all the latest news by joining our [http://ihfoam.ihcantabria.com/source-download/ mailing list]
+
  
 
== Source Download and Compilation ==
 
== Source Download and Compilation ==
IHFOAM download site can be found [http://ihfoam.ihcantabria.com/source-download/ here].
+
OLAFOAM download site can be found [https://sites.google.com/site/olafoamcfd/source-code here].
  
 
=== Source Code Download ===
 
=== Source Code Download ===
You can find IHFOAM in [https://github.com/IHFOAM/ihFOAM GitHub], and it can be downloaded in zip format.
+
You can find IHFOAM in [https://github.com/phicau/OLAFOAM GitHub], and it can be downloaded in zip format.
  
 
For a more convenient download of the source code, run the following command:
 
For a more convenient download of the source code, run the following command:
  
 
<pre>
 
<pre>
git clone git://github.com/IHFOAM/ihFOAM.git
+
git clone git://github.com/phicau/OLAFOAM.git
 
</pre>
 
</pre>
  
Line 163: Line 168:
  
 
<pre>
 
<pre>
git clone https://github.com/IHFOAM/ihFOAM.git
+
git clone https://github.com/phicau/OLAFOAM.git
git clone http://github.com/IHFOAM/ihFOAM.git
+
git clone http://github.com/phicau/OLAFOAM.git
 
</pre>
 
</pre>
  
Code updates can be downloaded in the future from the IHFOAM folder as follows:
+
Code updates can be downloaded in the future for the OLAFOAM folder as follows:
  
 
<pre>
 
<pre>
Line 177: Line 182:
  
 
=== Source Code Structure ===
 
=== Source Code Structure ===
IHFOAM source code is divided in two main folders:
+
OLAFOAM source code is divided in two main folders:
 
* '''genAbs''' --> Generation and absorption boundary conditions
 
* '''genAbs''' --> Generation and absorption boundary conditions
 
** '''waveAbsorption''' --> (BCs)
 
** '''waveAbsorption''' --> (BCs)
Line 183: Line 188:
 
** '''common''' --> Scripts shared by both BCs
 
** '''common''' --> Scripts shared by both BCs
 
* '''solvers''' --> Guess what's inside...
 
* '''solvers''' --> Guess what's inside...
** '''ihFoamXXXXX''' --> One for each compatible version, including ihFoam and ihDyMFoam
+
** '''olaFoamXXXXX''' --> One for each compatible version, including olaFoam and olaDyMFoam
  
 
=== Compilation ===
 
=== Compilation ===
Compilation has been automatized and needs to be performed only once. Since IHFOAM does not need any dependencies, the source code can be downloaded and compiled anywhere on your computer.
+
Compilation has been automatized and needs to be performed only once. Since OLAFOAM does not require any dependencies, the source code can be downloaded and compiled anywhere on your computer.
  
 
* '''First''' compile the boundary conditions:
 
* '''First''' compile the boundary conditions:
Line 196: Line 201:
 
The script will figure out which version of OpenFOAM or FOAM-extend you are running and set a convenient preprocessor statement to adjust the code automatically to each flavour/version.
 
The script will figure out which version of OpenFOAM or FOAM-extend you are running and set a convenient preprocessor statement to adjust the code automatically to each flavour/version.
  
* '''Second''' compile the solvers: ihFoam and ihDyMFoam
+
* '''Second''' compile the solvers: olaFoam and olaDyMFoam
 
<pre>
 
<pre>
cd solvers/ihFoamXXXXX
+
cd solvers/olaFoamXXXXX
 
./allMake
 
./allMake
 
</pre>
 
</pre>
Line 210: Line 215:
 
libs
 
libs
 
(
 
(
     "libIHwaveGeneration.so"
+
     "libwaveGeneration.so"
     "libIHwaveAbsorption.so"
+
     "libwaveAbsorption.so"
 
);
 
);
 
</pre>
 
</pre>
  
== IHFOAM Usage ==
+
== OLAFOAM Usage ==
 
'''IMPORTANT NOTES:'''
 
'''IMPORTANT NOTES:'''
* IHFOAM is programmed in such a way that gravity has to act in the negative Z direction.
+
* OLAFOAM is programmed in such a way that gravity has to act in the negative Z direction.
 
* Currently the X and Y coordinates of each boundary face are substituted by those of the centroid of the paddle to which the face belongs (similarly to what happens in the laboratory). Therefore, to obtain accurate directionality you need several paddles (''nPaddles'' >> 1). Next releases will change the implementation so you can choose.
 
* Currently the X and Y coordinates of each boundary face are substituted by those of the centroid of the paddle to which the face belongs (similarly to what happens in the laboratory). Therefore, to obtain accurate directionality you need several paddles (''nPaddles'' >> 1). Next releases will change the implementation so you can choose.
 
* Angles such as ''waveDir'' and ''absDir'' are measured in degrees with respect to the positive X axis (0º), growing towards the positive Y axis (90º).
 
* Angles such as ''waveDir'' and ''absDir'' are measured in degrees with respect to the positive X axis (0º), growing towards the positive Y axis (90º).
  
=== ihFoam and ihDyMFoam Solvers ===
+
=== olaFoam and olaDyMFoam Solvers ===
 
'''IMPORTANT NOTE:'''
 
'''IMPORTANT NOTE:'''
* IHFOAM has a slightly different formulation than the one published in the third [[#References_and_Citing | reference]], due to a volume-averaging approach with an ill-posed term. The results now, however, are as good as those shown on the validation, but with different friction factors. Check out the tutorials for the dam break validation case. The wrong term slightly changed the results where gradients of porosity appeared (i.e. at the interface between the porous medium and the clear fluid, or between porous media), where not many people measure, as the flow is very dependent on the local effects (the ones that we try to filter out by volume-averaging).
+
* OLAFOAM has a slightly different formulation than the one published in the third [[#References_and_Citing | reference]], due to a volume-averaging approach with an ill-posed term. The results now, however, are as good as those shown on the validation, but with different friction factors. Check out the tutorials for the dam break validation case. The wrong term slightly changed the results where gradients of porosity appeared (i.e. at the interface between the porous medium and the clear fluid, or between porous media), where not many people measure, as the flow is very dependent on the local effects (the ones that we try to filter out by volume-averaging).
  
Porosity is introduced by setting an initial field. It can be done using the ''setFields'' utility, in a similar way to alpha1. This field is called ''porosityIndex'' and it features the index of the porous zone to which each cell belongs.
+
Porosity is introduced by setting an initial field. It can be done using the ''setFields'' utility, in a similar way to the VOF indicator function (alpha1, alpha.water). This field is called ''porosityIndex'' and it features the index of the porous zone to which each cell belongs.
  
* If no ''porosityIndex'' field is found, ihFoam is identical to interFoam.
+
* If no ''porosityIndex'' field is found, olaFoam is identical to interFoam.
 
* Index 0 represents the clear region, outside any porous medium.
 
* Index 0 represents the clear region, outside any porous medium.
 
* Practical examples can be found in the training materials.
 
* Practical examples can be found in the training materials.
Line 248: Line 253:
 
To generate waves you have to set the following boundary conditions.
 
To generate waves you have to set the following boundary conditions.
  
For alpha1:
+
For alpha1/alpha.water:
 
<pre>
 
<pre>
 
     inlet
 
     inlet
 
     {
 
     {
         type            IH_Waves_InletAlpha;
+
         type            waveAlpha;
         waveDictName    IHWavesDict;
+
         waveDictName    waveDict;
 
         value          uniform 0;
 
         value          uniform 0;
 
     }
 
     }
Line 262: Line 267:
 
     inlet
 
     inlet
 
     {
 
     {
         type            IH_Waves_InletVelocity;
+
         type            waveVelocity;
         waveDictName    IHWavesDict;
+
         waveDictName    waveDict;
 
         value          uniform (0 0 0);
 
         value          uniform (0 0 0);
 
     }
 
     }
Line 269: Line 274:
  
 
* The other boundary condition needed is:
 
* The other boundary condition needed is:
** ''buoyantPressure'' for ''p_rgh''
+
** ''buoyantPressure'' or ''fixedFluxPressure'' for ''p_rgh''
  
 
==== Wave Generation Dictionary ====
 
==== Wave Generation Dictionary ====
Line 275: Line 280:
  
 
* The wave conditions are read from a dictionary file located in the '''constant''' folder.  
 
* The wave conditions are read from a dictionary file located in the '''constant''' folder.  
* By default it is named '''IHWavesDict''', however, you can name it differently setting '''waveDictName'''.  
+
* By default it is named '''waveDict''', however, you can name it differently setting '''waveDictName'''.  
 
* This way you can even specify different wave conditions for different patches on your case.
 
* This way you can even specify different wave conditions for different patches on your case.
  
All the options are gathered in the figure on the right. The rectangles indicate the different parameters and the rounded boxes denote the options available. A complete showcase for the different wave theories can be found in the '''reference/IHWavesDict''' folder.
+
All the options are gathered in the figure on the right. The rectangles indicate the different parameters and the rounded boxes denote the options available. A complete showcase for the different wave theories can be found in the '''reference/waveDict''' folder.
  
 
Implemented wave theories:
 
Implemented wave theories:
Line 303: Line 308:
 
|}
 
|}
  
Active wave absorption can be connected on the wave generation boundary so that waves incident to it flow out while still generating the target waves. If no other boundary is absorbing it sould be connected, to avoid a mean water level increase due to the stokes drift.
+
Active wave absorption can be connected on the wave generation boundary so that waves incident to it flow out while still generating the target waves. If no other boundary is absorbing it sould be connected, to avoid a mean water level increase due to the mass imbalance between crests and troughs.
 
* Controlled by ''genAbs'' bool variable: true/false
 
* Controlled by ''genAbs'' bool variable: true/false
 
* Correction velocity applied in the ''absDir'' direction. When not set or set greater than 360, it defaults the perpendicular direction to the boundary. See the first [[#References_and_Citing | reference]] for a complete explanation on when it is convenient to set ''absDir''.
 
* Correction velocity applied in the ''absDir'' direction. When not set or set greater than 360, it defaults the perpendicular direction to the boundary. See the first [[#References_and_Citing | reference]] for a complete explanation on when it is convenient to set ''absDir''.
Line 309: Line 314:
  
 
==== Wave Formulae Form ====
 
==== Wave Formulae Form ====
All the waves in IHFOAM are generated in a similar way to the following implementation (Stokes I):
+
All the waves in OLAFOAM are generated in a similar way to the following implementation (Stokes I):
  
 
<math>\eta = \frac{H}{2} cos \left( k_x x + k_y y - \omega t + \psi \right)</math>
 
<math>\eta = \frac{H}{2} cos \left( k_x x + k_y y - \omega t + \psi \right)</math>
Line 318: Line 323:
 
Why pure active wave absorption conditions when wave generation already includes it? Pure active wave absorption, disregarding wave generation, allows a more sofisticated treatment and better performance.
 
Why pure active wave absorption conditions when wave generation already includes it? Pure active wave absorption, disregarding wave generation, allows a more sofisticated treatment and better performance.
  
To absorb waves you have to set the following boundary condition for U. This time nothing is read from a dictionary, so everything is set at the boundary condition level. The default values are shown, so the parameters that need no different value can be left out.
+
To absorb waves you have to set the following boundary condition for U. This time no data are read from a dictionary, so everything is set at the boundary condition level. The default values are shown, so the parameters that need no different value can be left out.
  
 
2D-theory version, applicable to 2D/3D:
 
2D-theory version, applicable to 2D/3D:
Line 324: Line 329:
 
     outlet
 
     outlet
 
     {
 
     {
         type            IH_3D_2DAbsorption_InletVelocity;;
+
         type            2DWaveAbsorptionVelocity;
 
         nPaddles        1;
 
         nPaddles        1;
 
         nEdgeMin        0;
 
         nEdgeMin        0;
Line 339: Line 344:
 
     outlet
 
     outlet
 
     {
 
     {
         type            IH_3D_3DAbsorption_InletVelocity;;
+
         type            3DWaveAbsorptionVelocity;
 
         nPaddles        1;
 
         nPaddles        1;
 
         nEdgeMin        0;
 
         nEdgeMin        0;
Line 351: Line 356:
 
* The rest of the boundary conditions needed are:
 
* The rest of the boundary conditions needed are:
 
** ''zeroGradient'' for ''alpha1''
 
** ''zeroGradient'' for ''alpha1''
** ''buoyantPressure'' for ''p_rgh''
+
** ''buoyantPressure'' or ''fixedFluxPressure'' for ''p_rgh''
  
 
Similarly to wave generation, setting ''nPaddles'' > 1 will allow directional absorption, as each paddles (vertical slices of the patch) absorbs the waves independently. For stability reasons try to keep your paddles approximately 5 cells wide at least.
 
Similarly to wave generation, setting ''nPaddles'' > 1 will allow directional absorption, as each paddles (vertical slices of the patch) absorbs the waves independently. For stability reasons try to keep your paddles approximately 5 cells wide at least.
Line 360: Line 365:
 
* ''nEdgeMin'' and ''nEdgeMax'' solve some issues that appear on the corners, selecting a number of paddles that are only capable of taking water out according to the 2D theory.
 
* ''nEdgeMin'' and ''nEdgeMax'' solve some issues that appear on the corners, selecting a number of paddles that are only capable of taking water out according to the 2D theory.
  
== IHFOAM Documentation and Tutorials ==
+
== OLAFOAM Documentation and Tutorials ==
The IHFOAM documentation and tutorials are not included in the Github bundle. Instead, they can be downloaded under request in the following site:
+
The OLAFOAM documentation and tutorials are included in the Github bundle.
 
+
[http://ihfoam.ihcantabria.com/source-download/ http://ihfoam.ihcantabria.com/source-download/]
+
 
+
Upon registration you will receive an e-mail with the download link. We kindly ask you to respect this procedure, and not to redistribute the download link, as the information regarding how many people, where and how are using the code is important for us. As stated on the Terms and Conditions, your personal information (i.e. name and e-mail) will never be shared. You can also sign up for the mailing list, to get the latest information about IHFOAM new releases and training courses.
+
  
 
=== Documentation ===
 
=== Documentation ===
Line 373: Line 374:
 
Old version of Fenton's Fourier program to obtain the input parameters needed to set up streamfunction wave theory.
 
Old version of Fenton's Fourier program to obtain the input parameters needed to set up streamfunction wave theory.
  
==== IHwavesDict ====
+
==== waveDict ====
Directory that includes a sample of IHwavesDict file for each supported wave theory.
+
Directory that includes a sample of waveDict file for each supported wave theory.
  
 
=== Tutorials ===
 
=== Tutorials ===
A set of tutorials, covering the use of ihFoam and the wave generation boundary conditions, is available. All the cases include a ''runCase'' and ''cleanCase''. The first one runs all the steps needed to simulate the case and sampling/validation (when available). The second one resets the case to its initial state (i.e. with a very small size).
+
A set of tutorials, covering the use of olaFoam and the wave generation boundary conditions, is available. All the cases include a ''runCase'' and ''cleanCase''. The first one runs all the steps needed to simulate the case and sampling/validation (when available). The second one resets the case to its initial state (i.e. with a very small size).
  
 
The practical cases are as follows.
 
The practical cases are as follows.
Line 387: Line 388:
 
* Waves are absorbed on the right patch (outlet), according to the 2D theory.
 
* Waves are absorbed on the right patch (outlet), according to the 2D theory.
 
* Water depth is set to 0.4 m.
 
* Water depth is set to 0.4 m.
* The wave conditions are specified in '''constant/IHwavesDict'''.
+
* The wave conditions are specified in '''constant/waveDict'''.
 
** Regular waves, 0.1 m high and with 3 s of period are generated according to the cnoidal theory.
 
** Regular waves, 0.1 m high and with 3 s of period are generated according to the cnoidal theory.
 
* No porosity involved.
 
* No porosity involved.
Line 425: Line 426:
 
* Waves are absorbed on the right patch (outlet), according to the 2D theory.
 
* Waves are absorbed on the right patch (outlet), according to the 2D theory.
 
* Water depth is set to 0.8 m.
 
* Water depth is set to 0.8 m.
* The wave conditions are specified in '''constant/IHwavesDict'''.
+
* The wave conditions are specified in '''constant/waveDict'''.
 
** Regular waves, 0.25 m high and with 3 s of period are generated according to the cnoidal theory.
 
** Regular waves, 0.25 m high and with 3 s of period are generated according to the cnoidal theory.
 
* Samping of free surface elevation and pressure is included.
 
* Samping of free surface elevation and pressure is included.

Revision as of 03:00, 22 February 2016

OLAFOAM is a new numerical model from the creator and developer of IHFOAM. This free and open source project is committed to bringing the latest advances in the simulation of wave dynamics to the OpenFOAM and FOAM-extend communities.

OLAFOAM is a set of solvers and boundary conditions to generate and absorb water waves actively at the boundaries and to simulate their interaction with porous coastal structures.

The main scope of these modelling tools is coastal, marine, hydraulic and offshore engineering.

UNDER CONSTRUCTION

1 OLAFOAM Overview

The OLAFOAM package includes:

  • Individual boundary conditions for wave generation and active wave absorption for alpha1 and U fields. (libwaveGeneration.so)
    • waveAlpha
    • waveVelocity
  • Boundary conditions for pure wave absorption applicable to U field. Based on 2D or 3D theories, both are applicable to 3D cases. (libwaveAbsorption.so)
    • 2DWaveAbsorptionVelocity
    • 3DWaveAbsorptionVelocity
  • Boundary condition for wave generation and active wave absorption using a piston wavemaker, with any number of paddles. (libmultiPistonMovement.so)
    • multiPistonMovement
  • Solvers to be used with your favourite version of OpenFOAM or FOAM-extend. See compatibility below.
    • olaFoam
    • olaDyMFoam
  • Brief reference manual
  • Tutorials and validation cases

1.1 About OLAFOAM solvers

olaFoam and olaDyMFoam solve two-phase incompressible flows within porous media by means of the VARANS (Volume-Averaged Reynolds-Averaged Navier-Stokes) equations. More information will be added, in the mean time check the references.

Both solvers are derived from interFoam and interDyMFoam. Furthermore, outside the porous media, the VARANS equations are identical to the classic RANS. Therefore, olaFoam and olaDyMFoam can be used instead of interFoam and interDyMFoam even when the case presents no porous zones.

1.2 Supported Versions

Valid versions: OF Version 16ext.png OF Version 171.png OF Version 211.png OF Version 222.png OF Version 230.png OF Version 240.png OF Version 300.png OF Version 30ext.png OF Version 31ext.png OF Version 32ext.png

Known issues:

OF Version 16ext.png OF Version 30ext.png OF Version 31ext.png the boundary conditions compile and everything works.
  • Running in parallel yields an error.
    • Solution: edit $WM_PROJECT_DIR/etc/controlDict and change commsType to nonBlocking. Reference [1].
[user:PID] *** An error occurred in MPI_Recv
[user:PID] *** on communicator MPI_COMM_WORLD
[user:PID] *** MPI_ERR_TRUNCATE: message truncated
[user:PID] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
--------------------------------------------------------------------------
  • Running in parallel may produce unexpected results due to a bug in gMin and gMax functions. See [2]
    • Fixed with commits c5a2b9d7 (master) and 02833621 (nextRelease).
    • The solution can be found here.
OF Version 32ext.png the boundary conditions compile and everything works.
  • Running in parallel yields an error.
    • Solution: edit your case's controlDict and add the following snippet. Reference [3].
OptimisationSwitches
{
    commsType       nonBlocking;
}
OF Version 171.png everything works when you compile OpenFOAM from source, as there is a problem with the precompiled installable pack. Reference [4].
  • Otherwise:
    • The solvers (even the regular version of interFoam) need to include "-linterfaceProperties" to compile.
    • IHFOAM solvers compile and work. Despite the BCs being included, apparently they are not linked, as they are not recognized.
    • If the boundary conditions are included dynamically in controlDict and used with the IHFOAM solvers, turbulence modelling does not work.

1.3 Ongoing Development

  • Bug fixes will be issued on a regular basis, while the development of new features is currently ongoing.
  • The new version will include major changes in the structure of the boundary conditions, which will not affect the use.

Future releases may/will include:

  • Volume-averaged turbulence models.
  • Current generation (already pre-implemented but not referenced, as it needs further work and validation).
  • Wave theories implemented as classes, gathered by an autoPtr.
  • Custom dynamicRefineFvMesh to enable dynamic mesh refinement on snappyHexMesh-generated meshes, as seen in the fourth paper.
  • Support for flap-type wavemakers.
  • Custom boundary condition to generate waves using pneumatic wavemakers.
  • Full support of the semi-implicit MULES for porous media.

1.4 References and Citing

OLAFOAM is the evolution of IHFOAM, a product developed in the frame of a Master and PhD Thesis at the Environmental Hydraulics Institute "IH Cantabria" of the University of Cantabria. The PhD thesis can be found and downloaded for free here:

Pablo Higuera PhD Thesis

If you want to reference the model in your publications it should be called OLAFOAM, and state that is an evolution of IHFOAM, referencing any of the following research papers.

The implementation and validation details are published in the following references:

(2015) Validation of OpenFOAM® for Oscillating Water Column three-dimensional modeling.

Validation of OpenFOAM® for Oscillating Water Column three-dimensional modeling.
Iturrioz, A., Guanche, R., Lara, J.L., Vidal, C., & Losada, I.J. [2015]
Ocean Engineering [Vol. 107, pp. 222-237]
http://dx.doi.org/10.1016/j.oceaneng.2015.07.051


(2015) Tsunami wave interaction with mangrove forests: A 3-D numerical approach.

Tsunami wave interaction with mangrove forests: A 3-D numerical approach.
Maza, M, Lara, J.L., & Losada, I.J. [2015]
Coastal Engineering [Vol.98, pp. 33-54]
http://dx.doi.org/10.1016/j.oceaneng.2015.07.051


(2015) Three-dimensional numerical wave generation with moving boundaries.

Three-dimensional numerical wave generation with moving boundaries.
Higuera, P., Losada, I.J. and  Lara, J.L. (2015)
Coastal Engineering, Vol. 101, pp. 35–47


(2014) Three-dimensional interaction of waves and porous coastal structures using OpenFOAM. Part II: Application.

Three-dimensional interaction of waves and porous coastal structures using OpenFOAM. Part II: Application.
Higuera, P., Lara, J.L. and Losada, I.J. (2014)
Coastal Engineering, Vol. 83, pp. 259–270


(2014) Three-dimensional interaction of waves and porous coastal structures using OpenFOAM. Part I: Formulation and validation.

Three-dimensional interaction of waves and porous coastal structures using OpenFOAM. Part I: Formulation and validation.
Higuera, P., Lara, J.L. and Losada, I.J. (2014)
Coastal Engineering, Vol. 83, pp. 243-258


(2013) Simulating coastal engineering processes with OpenFOAM.

Simulating coastal engineering processes with OpenFOAM.
Higuera, P., Lara, J.L. and Losada, I.J. (2013)
Coastal Engineering, Vol. 71, pp. 119-134.


(2013) Realistic wave generation and active wave absorption for Navier-Stokes models: Application to OpenFOAM.

Realistic wave generation and active wave absorption for Navier-Stokes models: Application to OpenFOAM.
Higuera, P., Lara, J.L. and Losada, I.J. (2013)
Coastal Engineering, Vol. 71, pp. 102-118.

1.5 Get Connected

To submit your feedback, suggestions, bugs... you have many options:

  • The OLAFOAM e-mail, found here.
  • The e-mail found within the source code headers.

OLAFOAM at cfd-online

2 Source Download and Compilation

OLAFOAM download site can be found here.

2.1 Source Code Download

You can find IHFOAM in GitHub, and it can be downloaded in zip format.

For a more convenient download of the source code, run the following command:

git clone git://github.com/phicau/OLAFOAM.git

If the git protocol is blocked in your network try either of the following commands:

git clone https://github.com/phicau/OLAFOAM.git
git clone http://github.com/phicau/OLAFOAM.git

Code updates can be downloaded in the future for the OLAFOAM folder as follows:

git checkout
git pull

Recompilation is required to apply the changes.

2.2 Source Code Structure

OLAFOAM source code is divided in two main folders:

  • genAbs --> Generation and absorption boundary conditions
    • waveAbsorption --> (BCs)
    • waveGeneration --> (BCs)
    • common --> Scripts shared by both BCs
  • solvers --> Guess what's inside...
    • olaFoamXXXXX --> One for each compatible version, including olaFoam and olaDyMFoam

2.3 Compilation

Compilation has been automatized and needs to be performed only once. Since OLAFOAM does not require any dependencies, the source code can be downloaded and compiled anywhere on your computer.

  • First compile the boundary conditions:
cd genAbs
./allMake

The script will figure out which version of OpenFOAM or FOAM-extend you are running and set a convenient preprocessor statement to adjust the code automatically to each flavour/version.

  • Second compile the solvers: olaFoam and olaDyMFoam
cd solvers/olaFoamXXXXX
./allMake

Where XXXXX denotes your flavour (OpenFOAM - OF, FOAM-extend - FE) and your version. The currently supported versions have already been shown.

2.4 Dynamic Linking of the Boundary Conditions

In order to include the wave generation and active wave absorption boundary conditions without needing to re-compile a solver, write the following code in controlDict:

libs
(
    "libwaveGeneration.so"
    "libwaveAbsorption.so"
);

3 OLAFOAM Usage

IMPORTANT NOTES:

  • OLAFOAM is programmed in such a way that gravity has to act in the negative Z direction.
  • Currently the X and Y coordinates of each boundary face are substituted by those of the centroid of the paddle to which the face belongs (similarly to what happens in the laboratory). Therefore, to obtain accurate directionality you need several paddles (nPaddles >> 1). Next releases will change the implementation so you can choose.
  • Angles such as waveDir and absDir are measured in degrees with respect to the positive X axis (0º), growing towards the positive Y axis (90º).

3.1 olaFoam and olaDyMFoam Solvers

IMPORTANT NOTE:

  • OLAFOAM has a slightly different formulation than the one published in the third reference, due to a volume-averaging approach with an ill-posed term. The results now, however, are as good as those shown on the validation, but with different friction factors. Check out the tutorials for the dam break validation case. The wrong term slightly changed the results where gradients of porosity appeared (i.e. at the interface between the porous medium and the clear fluid, or between porous media), where not many people measure, as the flow is very dependent on the local effects (the ones that we try to filter out by volume-averaging).

Porosity is introduced by setting an initial field. It can be done using the setFields utility, in a similar way to the VOF indicator function (alpha1, alpha.water). This field is called porosityIndex and it features the index of the porous zone to which each cell belongs.

  • If no porosityIndex field is found, olaFoam is identical to interFoam.
  • Index 0 represents the clear region, outside any porous medium.
  • Practical examples can be found in the training materials.

The porous media properties (i.e. a, b and c friction factors, mean rock size and porosity) are included in constant/porosityDict

a               n(0.0 ... );
b               n(0.0 ... );
c               n(0.0 ... );

D50             n(1.0 ... );
porosity        n(1.0 ... );
  • The first values should always be as shown, as they represent the clear flow region.
  • n is the number of materials.

3.2 Wave Generation BCs

To generate waves you have to set the following boundary conditions.

For alpha1/alpha.water:

    inlet
    {
        type            waveAlpha;
        waveDictName    waveDict;
        value           uniform 0;
    }

For U:

    inlet
    {
        type            waveVelocity;
        waveDictName    waveDict;
        value           uniform (0 0 0);
    }
  • The other boundary condition needed is:
    • buoyantPressure or fixedFluxPressure for p_rgh

3.2.1 Wave Generation Dictionary

Wave generation dictionary options
  • The wave conditions are read from a dictionary file located in the constant folder.
  • By default it is named waveDict, however, you can name it differently setting waveDictName.
  • This way you can even specify different wave conditions for different patches on your case.

All the options are gathered in the figure on the right. The rectangles indicate the different parameters and the rounded boxes denote the options available. A complete showcase for the different wave theories can be found in the reference/waveDict folder.

Implemented wave theories:

waveType / waveTheory Reference Comments
regular / StokesI Dean and Dalrymple (1991)
regular / StokesII Dean and Dalrymple (1991)
regular / StokesV Skjelbreia and Hendrickson (1960)
regular / cnoidal Svendsen (2006)
regular / streamfunction Fenton (1988) No solver programmed. Use Fenton's Fourier solver (old version tested only, distributed with the materials) to set all the parameters required.
solitary / Boussinesq Lee et al. (1982)
wavemaker / (tx/tv/txeta/tveta) Own development waveTheory depending on what you provide: t (time series), x (paddle displacement), eta (free surface elevation). Note that this BC replicates the wavemaker (constant) profile, but it does not move.
irregular / () Dean and Dalrymple (1991) Linear summation of StokesI components. Second order by Longuet-Higgins and Stewart (1960) completed with Baldock et al. (1996)

Active wave absorption can be connected on the wave generation boundary so that waves incident to it flow out while still generating the target waves. If no other boundary is absorbing it sould be connected, to avoid a mean water level increase due to the mass imbalance between crests and troughs.

  • Controlled by genAbs bool variable: true/false
  • Correction velocity applied in the absDir direction. When not set or set greater than 360, it defaults the perpendicular direction to the boundary. See the first reference for a complete explanation on when it is convenient to set absDir.
  • You can select nPaddles greater than 1 to obtain a better directional absorption.

3.2.2 Wave Formulae Form

All the waves in OLAFOAM are generated in a similar way to the following implementation (Stokes I):

\eta = \frac{H}{2} cos \left( k_x x + k_y y - \omega t + \psi \right)

This means that the free surface elevation (eta) is dependent of the patch location. If you want to keep the phase meaningful I would recommend you to locate the wave generation patch at X = 0, although this is not a must.

3.3 Wave Absorption BCs

Why pure active wave absorption conditions when wave generation already includes it? Pure active wave absorption, disregarding wave generation, allows a more sofisticated treatment and better performance.

To absorb waves you have to set the following boundary condition for U. This time no data are read from a dictionary, so everything is set at the boundary condition level. The default values are shown, so the parameters that need no different value can be left out.

2D-theory version, applicable to 2D/3D:

    outlet
    {
        type            2DWaveAbsorptionVelocity;
        nPaddles        1;
        nEdgeMin        0;
        nEdgeMax        0;
        absorptionDir   400;
        value           uniform (0 0 0);
    }
  • absorptionDir can be used to obtain Quasi-3D behaviour (see the first reference). Its default value is greater than 360, so absorption is applied to the perpendicular direction to the patch.

3D-theory version, applicable to 3D:

    outlet
    {
        type            3DWaveAbsorptionVelocity;
        nPaddles        1;
        nEdgeMin        0;
        nEdgeMax        0;
        value           uniform (0 0 0);
    }

The differences between both are explained in the first reference. If you are unsure whether to use the 2D or 3D version, use the 2D, as its range of applicability is wider.

  • The rest of the boundary conditions needed are:
    • zeroGradient for alpha1
    • buoyantPressure or fixedFluxPressure for p_rgh

Similarly to wave generation, setting nPaddles > 1 will allow directional absorption, as each paddles (vertical slices of the patch) absorbs the waves independently. For stability reasons try to keep your paddles approximately 5 cells wide at least.

  • The patch is splitted in nPaddles vertical transects according to its orientation
    • If it is more perpendicular to the X axis, it uses the Y coordinates to divide the patch in nPaddles between YMin and YMax. nEdgeMin starts to count from YMin. nEdgeMax starts to count from YMax.
    • If it is more perpendicular to the Y axis, it uses the X coordinates to divide the patch in nPaddles between XMin and XMax. nEdgeMin starts to count from XMin. nEdgeMax starts to count from XMax.
  • nEdgeMin and nEdgeMax solve some issues that appear on the corners, selecting a number of paddles that are only capable of taking water out according to the 2D theory.

4 OLAFOAM Documentation and Tutorials

The OLAFOAM documentation and tutorials are included in the Github bundle.

4.1 Documentation

A brief reference document is included.

4.1.1 FourierFenton

Old version of Fenton's Fourier program to obtain the input parameters needed to set up streamfunction wave theory.

4.1.2 waveDict

Directory that includes a sample of waveDict file for each supported wave theory.

4.2 Tutorials

A set of tutorials, covering the use of olaFoam and the wave generation boundary conditions, is available. All the cases include a runCase and cleanCase. The first one runs all the steps needed to simulate the case and sampling/validation (when available). The second one resets the case to its initial state (i.e. with a very small size).

The practical cases are as follows.

4.2.1 baseWaveFlume

A simple wave flume (i.e. 2D channel).

  • Waves are generated on the left patch (inlet).
  • Waves are absorbed on the right patch (outlet), according to the 2D theory.
  • Water depth is set to 0.4 m.
  • The wave conditions are specified in constant/waveDict.
    • Regular waves, 0.1 m high and with 3 s of period are generated according to the cnoidal theory.
  • No porosity involved.
  • The case can be run very fast in serial.

4.2.2 irreg45degTank

A more advanced wave case. This is a 3D wave tank with a peculiar shape, similar to the one used in the first reference. An irregular sea state is generated at patch X = 0, and absorbed elsewhere.

  • A directional, irregular sea state is generated (842 wave components).
    • Note nPaddles value for directionality
  • On the rest of the patches, the waves are absorbed according to the 3D theory.
    • Note also nPaddles, nEdgeMin and nEdgeMin values.
  • No porosity involved.
  • Case to be better run in parallel. Some known issues exist for several OpenFOAM and FOAM-extend versions.

4.2.3 CR35_dambreak

A classic benchmark case to validate free surface flow through a porous medium. It is a 2D dam break in a tank.

  • Porosity.
    • Note the porosityIndex field at the 0 folder.
    • porosityIndex is set using setFields, check setFieldsDict out.
    • The porous variables are set in constant/porosityDict.
  • Validation is included.
    • Sampling is not needed as free surface is obtained with a function object (included in controlDict).
    • Requirement: matplotlib (a.k.a. pylab)
    • A python script (plotValidation.py) can be run in the end to plot a comparison between the experimental and numerical data.
  • The case can be run very fast in serial.

4.2.4 breakwater

A composite breakwater within a wave flume in 2D.

  • Porosity.
    • Note the porosityIndex field at the 0 folder.
    • porosityIndex is set using setFields, check setFieldsDict out for setting porosity inside STL files.
    • The porous variables are set in constant/porosityDict. This time several porous media are included.
  • Waves are generated in the left patch (inlet)
  • Waves are absorbed on the right patch (outlet), according to the 2D theory.
  • Water depth is set to 0.8 m.
  • The wave conditions are specified in constant/waveDict.
    • Regular waves, 0.25 m high and with 3 s of period are generated according to the cnoidal theory.
  • Samping of free surface elevation and pressure is included.
    • Requirement: matplotlib (a.k.a. pylab)
    • Python scripts are included for postprocessing OpenFOAM results: postSens*.py
    • Python scripts are included for plotting postprocessed results: plotSens*.py
  • The case can be run very fast in serial.

This case also involves turbulence modelling. In future releases it will include the volume-averaged k-epsilon model.