release on 2013-03-07_14-30-36

This commit is contained in:
goniva
2013-03-07 14:30:37 +01:00
parent d196717ff3
commit 297a00ef80
22 changed files with 260 additions and 348 deletions

81
README Normal file
View File

@ -0,0 +1,81 @@
/*---------------------------------------------------------------------------*\
CFDEMcoupling - Open Source CFD-DEM coupling
CFDEMcoupling is part of the CFDEMproject
www.cfdem.com
Christoph Goniva, christoph.goniva@cfdem.com
Copyright 2009-2012 JKU Linz
Copyright 2012- DCS Computing GmbH, Linz
-------------------------------------------------------------------------------
License
This file is part of CFDEMcoupling.
CFDEMcoupling is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with CFDEMcoupling; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS
and OpenFOAM. Note: this code is not part of OpenFOAM (see DISCLAIMER).
\*---------------------------------------------------------------------------*/
CFDEM coupling provides an open source parallel coupled CFD-DEM framework
combining the strengths of LIGGGHTS DEM code and the Open Source
CFD package OpenFOAM(R)(*). The CFDEMcoupling toolbox allows to expand
standard CFD solvers of OpenFOAM(R)(*) to include a coupling to the DEM
code LIGGGHTS. In this toolbox the particle representation within the
CFD solver is organized by "cloud" classes. Key functionalities are organised
in sub-models (e.g. force models, data exchange models, etc.) which can easily
be selected and combined by dictionary settings.
The coupled solvers run fully parallel on distributed-memory clusters.
Features are:
- its modular approach allows users to easily implement new models
- its MPI parallelization enables to use it for large scale problems
- the "forum"_lws on CFD-DEM gives the possibility to exchange with other
users / developers
- the use of GIT allows to easily update to the latest version
- basic documentation is provided
The file structure:
- "src" directory including the source files of the coupling toolbox and models
- "applications" directory including the solver files for coupled CFD-DEM simulations
- "doc" directory including the documentation of CFDEMcoupling
- "tutorials" directory including basic tutorial cases showing the functionality
Details on installation are given on the "www.cfdem.com"
The functionality of this CFD-DEM framwork is described via "tutorial cases" showing
how to use different solvers and models.
CFDEMcoupling stands for Computational Fluid Dynamics (CFD) -
Discrete Element Method (DEM) coupling.
CFDEMcoupling is an open-source code, distributed freely under the terms of the
GNU Public License (GPL).
Core development of CFDEMcoupling is done by
Christoph Goniva and Christoph Kloss, both at DCS Computing GmbH, 2012
\*---------------------------------------------------------------------------*/
(*) "OpenFOAM(R)"_of is a registered trade mark of the ESI Group.
This offering is not affiliated, approved or endorsed by ESI Group,
the producer of the OpenFOAM® software and owner of the OpenFOAM® trade mark.
\*---------------------------------------------------------------------------*/

View File

@ -42,6 +42,7 @@ Description
#include "averagingModel.H" #include "averagingModel.H"
#include "momCoupleModel.H" #include "momCoupleModel.H"
#include "forceModel.H" #include "forceModel.H"
#include "IOModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -120,6 +121,8 @@ int main(int argc, char *argv[])
runTime.write(); runTime.write();
particleCloud.IOM().dumpDEMdata();
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl; << nl << endl;

View File

@ -75,7 +75,7 @@ The functionality of this CFD-DEM framwork is described via <A HREF = "#_1_2">tu
</P> </P>
<HR> <HR>
<P>(*) <A HREF = "http://www.openfoam.com">OpenFOAM(R)</A> is a registered trade mark of Silicon Graphics International Corp. This offering is not affiliated, approved or endorsed by Silicon Graphics International Corp., the producer of the OpenFOAM(R) software and owner of the OpenFOAM(R) trademark. <P>(*) <A HREF = "http://www.openfoam.com">OpenFOAM(R)</A> is a registered trade mark of the ESI Group. This offering is not affiliated, approved or endorsed by ESI Group, the producer of the OpenFOAM(R) software and owner of the OpenFOAM(R) trade mark.
</P> </P>
<HR> <HR>
@ -204,34 +204,34 @@ listing below of styles within certain commands.
</P> </P>
<DIV ALIGN=center><TABLE BORDER=1 > <DIV ALIGN=center><TABLE BORDER=1 >
<TR ALIGN="center"><TD ><A HREF = "IOModel.html">IOModel</A></TD><TD ><A HREF = "IOModel_basicIO.html">IOModel_basicIO</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "IOModel.html">IOModel</A></TD><TD ><A HREF = "IOModel_basicIO.html">IOModel_basicIO</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "IOModel_noIO.html">IOModel_noIO</A></TD><TD ><A HREF = "IOModel_trackIO.html">IOModel_trackIO</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "IOModel_noIO.html">IOModel_noIO</A></TD><TD ><A HREF = "IOModel_sophIO.html">IOModel_sophIO</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "averagingModel.html">averagingModel</A></TD><TD ><A HREF = "averagingModel_dilute.html">averagingModel_dilute</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "IOModel_trackIO.html">IOModel_trackIO</A></TD><TD ><A HREF = "averagingModel.html">averagingModel</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "cfdemSolverIB.html">cfdemSolverIB</A></TD><TD ><A HREF = "cfdemSolverPiso.html">cfdemSolverPiso</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "averagingModel_dilute.html">averagingModel_dilute</A></TD><TD ><A HREF = "cfdemSolverIB.html">cfdemSolverIB</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "cfdemSolverPisoScalar.html">cfdemSolverPisoScalar</A></TD><TD ><A HREF = "clockModel.html">clockModel</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "cfdemSolverPiso.html">cfdemSolverPiso</A></TD><TD ><A HREF = "cfdemSolverPisoScalar.html">cfdemSolverPisoScalar</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "clockModel_noClock.html">clockModel_noClock</A></TD><TD ><A HREF = "clockModel_standardClock.html">clockModel_standardClock</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "clockModel.html">clockModel</A></TD><TD ><A HREF = "clockModel_noClock.html">clockModel_noClock</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "dataExchangeModel.html">dataExchangeModel</A></TD><TD ><A HREF = "dataExchangeModel_noDataExchange.html">dataExchangeModel_noDataExchange</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "clockModel_standardClock.html">clockModel_standardClock</A></TD><TD ><A HREF = "dataExchangeModel.html">dataExchangeModel</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "dataExchangeModel_oneWayVTK.html">dataExchangeModel_oneWayVTK</A></TD><TD ><A HREF = "dataExchangeModel_twoWayFiles.html">dataExchangeModel_twoWayFiles</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "dataExchangeModel_noDataExchange.html">dataExchangeModel_noDataExchange</A></TD><TD ><A HREF = "dataExchangeModel_oneWayVTK.html">dataExchangeModel_oneWayVTK</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "dataExchangeModel_twoWayM2M.html">dataExchangeModel_twoWayM2M</A></TD><TD ><A HREF = "dataExchangeModel_twoWayMPI.html">dataExchangeModel_twoWayMPI</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "dataExchangeModel_twoWayFiles.html">dataExchangeModel_twoWayFiles</A></TD><TD ><A HREF = "dataExchangeModel_twoWayM2M.html">dataExchangeModel_twoWayM2M</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "forceModel.html">forceModel</A></TD><TD ><A HREF = "forceModel_Archimedes.html">forceModel_Archimedes</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "dataExchangeModel_twoWayMPI.html">dataExchangeModel_twoWayMPI</A></TD><TD ><A HREF = "forceModel.html">forceModel</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "forceModel_ArchimedesIB.html">forceModel_ArchimedesIB</A></TD><TD ><A HREF = "forceModel_DiFeliceDrag.html">forceModel_DiFeliceDrag</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "forceModel_Archimedes.html">forceModel_Archimedes</A></TD><TD ><A HREF = "forceModel_ArchimedesIB.html">forceModel_ArchimedesIB</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "forceModel_GidaspowDrag.html">forceModel_GidaspowDrag</A></TD><TD ><A HREF = "forceModel_KochHillDrag.html">forceModel_KochHillDrag</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "forceModel_DiFeliceDrag.html">forceModel_DiFeliceDrag</A></TD><TD ><A HREF = "forceModel_GidaspowDrag.html">forceModel_GidaspowDrag</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "forceModel_LaEuScalarTemp.html">forceModel_LaEuScalarTemp</A></TD><TD ><A HREF = "forceModel_MeiLift.html">forceModel_MeiLift</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "forceModel_KochHillDrag.html">forceModel_KochHillDrag</A></TD><TD ><A HREF = "forceModel_LaEuScalarTemp.html">forceModel_LaEuScalarTemp</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "forceModel_SchillerNaumannDrag.html">forceModel_SchillerNaumannDrag</A></TD><TD ><A HREF = "forceModel_ShirgaonkarIB.html">forceModel_ShirgaonkarIB</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "forceModel_MeiLift.html">forceModel_MeiLift</A></TD><TD ><A HREF = "forceModel_SchillerNaumannDrag.html">forceModel_SchillerNaumannDrag</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "forceModel_gradPForce.html">forceModel_gradPForce</A></TD><TD ><A HREF = "forceModel_noDrag.html">forceModel_noDrag</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "forceModel_ShirgaonkarIB.html">forceModel_ShirgaonkarIB</A></TD><TD ><A HREF = "forceModel_gradPForce.html">forceModel_gradPForce</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "forceModel_virtualMassForce.html">forceModel_virtualMassForce</A></TD><TD ><A HREF = "forceModel_viscForce.html">forceModel_viscForce</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "forceModel_noDrag.html">forceModel_noDrag</A></TD><TD ><A HREF = "forceModel_virtualMassForce.html">forceModel_virtualMassForce</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "liggghtsCommandModel.html">liggghtsCommandModel</A></TD><TD ><A HREF = "liggghtsCommandModel_execute.html">liggghtsCommandModel_execute</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "forceModel_viscForce.html">forceModel_viscForce</A></TD><TD ><A HREF = "liggghtsCommandModel.html">liggghtsCommandModel</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "liggghtsCommandModel_readLiggghtsData.html">liggghtsCommandModel_readLiggghtsData</A></TD><TD ><A HREF = "liggghtsCommandModel_runLiggghts.html">liggghtsCommandModel_runLiggghts</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "liggghtsCommandModel_execute.html">liggghtsCommandModel_execute</A></TD><TD ><A HREF = "liggghtsCommandModel_readLiggghtsData.html">liggghtsCommandModel_readLiggghtsData</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "liggghtsCommandModel_writeLiggghts.html">liggghtsCommandModel_writeLiggghts</A></TD><TD ><A HREF = "locateModel.html">locateModel</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "liggghtsCommandModel_runLiggghts.html">liggghtsCommandModel_runLiggghts</A></TD><TD ><A HREF = "liggghtsCommandModel_writeLiggghts.html">liggghtsCommandModel_writeLiggghts</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "locateModel_engineSearch.html">locateModel_engineSearch</A></TD><TD ><A HREF = "locateModel_engineSearchIB.html">locateModel_engineSearchIB</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "locateModel.html">locateModel</A></TD><TD ><A HREF = "locateModel_engineSearch.html">locateModel_engineSearch</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "locateModel_standardSearch.html">locateModel_standardSearch</A></TD><TD ><A HREF = "locateModel_turboEngineSearchM2M.html">locateModel_turboEngineM2MSearch</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "locateModel_engineSearchIB.html">locateModel_engineSearchIB</A></TD><TD ><A HREF = "locateModel_standardSearch.html">locateModel_standardSearch</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "locateModel_turboEngineSearch.html">locateModel_turboEngineSearch</A></TD><TD ><A HREF = "meshMotionModel.html">meshMotionModel</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "locateModel_turboEngineSearchM2M.html">locateModel_turboEngineM2MSearch</A></TD><TD ><A HREF = "locateModel_turboEngineSearch.html">locateModel_turboEngineSearch</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "meshMotionModel_noMeshMotion.html">meshMotionModel_noMeshMotion</A></TD><TD ><A HREF = "momCoupleModel.html">momCoupleModel</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "meshMotionModel.html">meshMotionModel</A></TD><TD ><A HREF = "meshMotionModel_noMeshMotion.html">meshMotionModel_noMeshMotion</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "momCoupleModel_explicitCouple.html">momCoupleModel_explicitCouple</A></TD><TD ><A HREF = "momCoupleModel_implicitCouple.html">momCoupleModel_implicitCouple</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "momCoupleModel.html">momCoupleModel</A></TD><TD ><A HREF = "momCoupleModel_explicitCouple.html">momCoupleModel_explicitCouple</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "momCoupleModel_noCouple.html">momCoupleModel_noCouple</A></TD><TD ><A HREF = "regionModel.html">regionModel</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "momCoupleModel_implicitCouple.html">momCoupleModel_implicitCouple</A></TD><TD ><A HREF = "momCoupleModel_noCouple.html">momCoupleModel_noCouple</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "regionModel_allRegion.html">regionModel_allRegion</A></TD><TD ><A HREF = "voidFractionModel.html">voidfractionModel</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "regionModel.html">regionModel</A></TD><TD ><A HREF = "regionModel_allRegion.html">regionModel_allRegion</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "voidFractionModel_GaussVoidFraction.html">voidfractionModel_GaussVoidFraction</A></TD><TD ><A HREF = "voidFractionModel_IBVoidFraction.html">voidfractionModel_IBVoidFraction</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "voidFractionModel.html">voidfractionModel</A></TD><TD ><A HREF = "voidFractionModel_GaussVoidFraction.html">voidfractionModel_GaussVoidFraction</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "voidFractionModel_bigParticleVoidFraction.html">voidfractionModel_bigParticleVoidFraction</A></TD><TD ><A HREF = "voidFractionModel_centreVoidFraction.html">voidfractionModel_centreVoidFraction</A></TD></TR> <TR ALIGN="center"><TD ><A HREF = "voidFractionModel_IBVoidFraction.html">voidfractionModel_IBVoidFraction</A></TD><TD ><A HREF = "voidFractionModel_bigParticleVoidFraction.html">voidfractionModel_bigParticleVoidFraction</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "voidFractionModel_dividedVoidFraction.html">voidfractionModel_dividedVoidFraction</A> <TR ALIGN="center"><TD ><A HREF = "voidFractionModel_centreVoidFraction.html">voidfractionModel_centreVoidFraction</A></TD><TD ><A HREF = "voidFractionModel_dividedVoidFraction.html">voidfractionModel_dividedVoidFraction</A>
</TD></TR></TABLE></DIV> </TD></TR></TABLE></DIV>
</HTML> </HTML>

Binary file not shown.

View File

@ -56,7 +56,7 @@ Core development of CFDEMcoupling is done by Christoph Goniva and Christoph Klos
This documentation was written by Christoph Goniva, DCS Computing GmbH, 2012 This documentation was written by Christoph Goniva, DCS Computing GmbH, 2012
:line :line
(*) "OpenFOAM(R)"_of is a registered trade mark of Silicon Graphics International Corp. This offering is not affiliated, approved or endorsed by Silicon Graphics International Corp., the producer of the OpenFOAM(R) software and owner of the OpenFOAM(R) trademark. (*) "OpenFOAM(R)"_of is a registered trade mark of the ESI Group. This offering is not affiliated, approved or endorsed by ESI Group, the producer of the OpenFOAM(R) software and owner of the OpenFOAM(R) trade mark.
:line :line
@ -170,274 +170,6 @@ Reasonable example settings for the "liggghtsCommands" dictionary are given in t
1.6 Models/Solvers :h4,link(cmd_5),link(comm) 1.6 Models/Solvers :h4,link(cmd_5),link(comm)
This section lists all CFDEMcoupling sub-models and solvers alphabetically, with a separate This section lists all CFDEMcoupling sub-models and solvers alphabetically, with a separate
@ -447,6 +179,7 @@ listing below of styles within certain commands.
"IOModel"_IOModel.html, "IOModel"_IOModel.html,
"IOModel_basicIO"_IOModel_basicIO.html, "IOModel_basicIO"_IOModel_basicIO.html,
"IOModel_noIO"_IOModel_noIO.html, "IOModel_noIO"_IOModel_noIO.html,
"IOModel_sophIO"_IOModel_sophIO.html,
"IOModel_trackIO"_IOModel_trackIO.html, "IOModel_trackIO"_IOModel_trackIO.html,
"averagingModel"_averagingModel.html, "averagingModel"_averagingModel.html,
"averagingModel_dilute"_averagingModel_dilute.html, "averagingModel_dilute"_averagingModel_dilute.html,

View File

@ -21,7 +21,7 @@
</PRE> </PRE>
<P><B>Description:</B> <P><B>Description:</B>
</P> </P>
<P>The basic IO-model writes particle positions velocities and radii to files. The output directory ($casePath/CFD/particles) is created automatically. Data is written every write time of the CFD simulation. <P>The basic IO-model writes particle positions velocities and radii to files. The default output directory ($casePath/CFD/proc*/time/lagrangian). Using the ceyword "serialOutput;" in couplingProperties the IO is serial to the directory ($casePath/CFD/lagrangian). In the latter case only the data on processor 0 is written! Data is written every write time of the CFD simulation.
</P> </P>
<P><B>Restrictions:</B> None. <P><B>Restrictions:</B> None.
</P> </P>

View File

@ -19,7 +19,7 @@ IOModel "basicIO"; :pre
[Description:] [Description:]
The basic IO-model writes particle positions velocities and radii to files. The output directory ($casePath/CFD/particles) is created automatically. Data is written every write time of the CFD simulation. The basic IO-model writes particle positions velocities and radii to files. The default output directory ($casePath/CFD/proc*/time/lagrangian). Using the ceyword "serialOutput;" in couplingProperties the IO is serial to the directory ($casePath/CFD/lagrangian). In the latter case only the data on processor 0 is written! Data is written every write time of the CFD simulation.
[Restrictions:] None. [Restrictions:] None.

33
doc/IOModel_sophIO.html Normal file
View File

@ -0,0 +1,33 @@
<HTML>
<CENTER><A HREF = "http://www.cfdem.com">CFDEMproject WWW Site</A> - <A HREF = "CFDEMcoupling_Manual.html#comm">CFDEM Commands</A>
</CENTER>
<HR>
<H3>IOModel_sophIO command
</H3>
<P><B>Syntax:</B>
</P>
<P>Defined in couplingProperties dictionary.
</P>
<PRE>IOModel "sophIO";
</PRE>
<P><B>Examples:</B>
</P>
<PRE>IOModel "sophIO";
</PRE>
<P><B>Description:</B>
</P>
<P>The soph IO-model writes particle positions, velocities, voidfraction, implicit forces, explicit forces , DEM forces and radii to files. the same as for basicIO model. Data is written every write time of the CFD simulation.
Currently paraview can only interpret position, velocity and radius (a port to VTK might help).
</P>
<P><B>Restrictions:</B> None.
</P>
<P><B>Related commands:</B>
</P>
<P><A HREF = "IOModel.html">IOModel</A>
</P>
</HTML>

30
doc/IOModel_sophIO.txt Normal file
View File

@ -0,0 +1,30 @@
"CFDEMproject WWW Site"_lws - "CFDEM Commands"_lc :c
:link(lws,http://www.cfdem.com)
:link(lc,CFDEMcoupling_Manual.html#comm)
:line
IOModel_sophIO command :h3
[Syntax:]
Defined in couplingProperties dictionary.
IOModel "sophIO"; :pre
[Examples:]
IOModel "sophIO"; :pre
[Description:]
The soph IO-model writes particle positions, velocities, voidfraction, implicit forces, explicit forces , DEM forces and radii to files. the same as for basicIO model. Data is written every write time of the CFD simulation.
Currently paraview can only interpret position, velocity and radius (a port to VTK might help).
[Restrictions:] None.
[Related commands:]
"IOModel"_IOModel.html

Binary file not shown.

View File

@ -6,7 +6,6 @@ voidFractionModels = subModels/voidFractionModel
locateModels = subModels/locateModel locateModels = subModels/locateModel
meshMotionModels = subModels/meshMotionModel meshMotionModels = subModels/meshMotionModel
momCoupleModels = subModels/momCoupleModel momCoupleModels = subModels/momCoupleModel
regionModels = subModels/regionModel
dataExchangeModels = subModels/dataExchangeModel dataExchangeModels = subModels/dataExchangeModel
averagingModels = subModels/averagingModel averagingModels = subModels/averagingModel
clockModels = subModels/clockModel clockModels = subModels/clockModel
@ -21,18 +20,33 @@ $(forceModels)/forceModel/newForceModel.C
$(forceModels)/noDrag/noDrag.C $(forceModels)/noDrag/noDrag.C
$(forceModels)/checkCouplingInterval/checkCouplingInterval.C $(forceModels)/checkCouplingInterval/checkCouplingInterval.C
$(forceModels)/DiFeliceDrag/DiFeliceDrag.C $(forceModels)/DiFeliceDrag/DiFeliceDrag.C
$(forceModels)/DiFeliceDragNLift/DiFeliceDragNLift.C
$(forceModels)/GidaspowDrag/GidaspowDrag.C $(forceModels)/GidaspowDrag/GidaspowDrag.C
$(forceModels)/SchillerNaumannDrag/SchillerNaumannDrag.C $(forceModels)/SchillerNaumannDrag/SchillerNaumannDrag.C
$(forceModels)/Archimedes/Archimedes.C $(forceModels)/Archimedes/Archimedes.C
$(forceModels)/ArchimedesIB/ArchimedesIB.C $(forceModels)/ArchimedesIB/ArchimedesIB.C
$(forceModels)/interface/interface.C $(forceModels)/interface/interface.C
$(forceModels)/ShirgaonkarIB/ShirgaonkarIB.C $(forceModels)/ShirgaonkarIB/ShirgaonkarIB.C
$(forceModels)/fieldTimeAverage/fieldTimeAverage.C
$(forceModels)/fieldBound/fieldBound.C
$(forceModels)/volWeightedAverage/volWeightedAverage.C
$(forceModels)/totalMomentumExchange/totalMomentumExchange.C
$(forceModels)/KochHillDrag/KochHillDrag.C $(forceModels)/KochHillDrag/KochHillDrag.C
$(forceModels)/BeetstraDrag/multiphaseFlowBasic/multiphaseFlowBasic.C
$(forceModels)/BeetstraDrag/BeetstraDrag.C
$(forceModels)/LaEuScalarLiquid/LaEuScalarLiquid.C
$(forceModels)/LaEuScalarTemp/LaEuScalarTemp.C $(forceModels)/LaEuScalarTemp/LaEuScalarTemp.C
$(forceModels)/LaEuScalarDust/LaEuScalarDust.C
$(forceModels)/virtualMassForce/virtualMassForce.C $(forceModels)/virtualMassForce/virtualMassForce.C
$(forceModels)/gradPForce/gradPForce.C $(forceModels)/gradPForce/gradPForce.C
$(forceModels)/gradULiftForce/gradULiftForce.C
$(forceModels)/viscForce/viscForce.C $(forceModels)/viscForce/viscForce.C
$(forceModels)/MeiLift/MeiLift.C $(forceModels)/MeiLift/MeiLift.C
$(forceModels)/KochHillDragNLift/KochHillDragNLift.C
$(forceModels)/solidsPressureForce/solidsPressureForce.C
$(forceModels)/periodicPressure/periodicPressure.C
$(forceModels)/periodicPressureControl/periodicPressureControl.C
$(forceModels)/averageSlipVel/averageSlipVel.C
$(forceModelsMS)/forceModelMS/forceModelMS.C $(forceModelsMS)/forceModelMS/forceModelMS.C
$(forceModelsMS)/forceModelMS/newForceModelMS.C $(forceModelsMS)/forceModelMS/newForceModelMS.C
@ -43,6 +57,7 @@ $(IOModels)/IOModel/newIOModel.C
$(IOModels)/noIO/noIO.C $(IOModels)/noIO/noIO.C
$(IOModels)/basicIO/basicIO.C $(IOModels)/basicIO/basicIO.C
$(IOModels)/trackIO/trackIO.C $(IOModels)/trackIO/trackIO.C
$(IOModels)/sophIO/sophIO.C
$(voidFractionModels)/voidFractionModel/voidFractionModel.C $(voidFractionModels)/voidFractionModel/voidFractionModel.C
$(voidFractionModels)/voidFractionModel/newVoidFractionModel.C $(voidFractionModels)/voidFractionModel/newVoidFractionModel.C
@ -61,21 +76,18 @@ $(locateModels)/turboEngineSearch/turboEngineSearch.C
$(locateModels)/turboEngineSearchM2M/turboEngineSearchM2M.C $(locateModels)/turboEngineSearchM2M/turboEngineSearchM2M.C
$(locateModels)/engineSearchIB/engineSearchIB.C $(locateModels)/engineSearchIB/engineSearchIB.C
$(meshMotionModels)/meshMotionModel/meshMotionModel.C $(meshMotionModels)/meshMotionModel/meshMotionModel.C
$(meshMotionModels)/meshMotionModel/newMeshMotionModel.C $(meshMotionModels)/meshMotionModel/newMeshMotionModel.C
$(meshMotionModels)/noMeshMotion/noMeshMotion.C $(meshMotionModels)/noMeshMotion/noMeshMotion.C
$(meshMotionModels)/DEMdrivenMeshMotion/DEMdrivenMeshMotion.C
$(momCoupleModels)/momCoupleModel/momCoupleModel.C $(momCoupleModels)/momCoupleModel/momCoupleModel.C
$(momCoupleModels)/momCoupleModel/newMomCoupleModel.C $(momCoupleModels)/momCoupleModel/newMomCoupleModel.C
$(momCoupleModels)/explicitCouple/explicitCouple.C $(momCoupleModels)/explicitCouple/explicitCouple.C
$(momCoupleModels)/explicitCoupleSource/explicitCoupleSource.C
$(momCoupleModels)/implicitCouple/implicitCouple.C $(momCoupleModels)/implicitCouple/implicitCouple.C
$(momCoupleModels)/noCouple/noCouple.C $(momCoupleModels)/noCouple/noCouple.C
$(regionModels)/regionModel/regionModel.C
$(regionModels)/regionModel/newRegionModel.C
$(regionModels)/allRegion/allRegion.C
$(dataExchangeModels)/dataExchangeModel/dataExchangeModel.C $(dataExchangeModels)/dataExchangeModel/dataExchangeModel.C
$(dataExchangeModels)/dataExchangeModel/newDataExchangeModel.C $(dataExchangeModels)/dataExchangeModel/newDataExchangeModel.C
$(dataExchangeModels)/oneWayVTK/oneWayVTK.C $(dataExchangeModels)/oneWayVTK/oneWayVTK.C
@ -101,4 +113,4 @@ $(liggghtsCommandModels)/runLiggghts/runLiggghts.C
$(liggghtsCommandModels)/writeLiggghts/writeLiggghts.C $(liggghtsCommandModels)/writeLiggghts/writeLiggghts.C
$(liggghtsCommandModels)/readLiggghtsData/readLiggghtsData.C $(liggghtsCommandModels)/readLiggghtsData/readLiggghtsData.C
LIB = $(FOAM_USER_LIBBIN)/lib$(CFDEM_LIB_NAME) LIB = $(CFDEM_LIB_DIR)/lib$(CFDEM_LIB_NAME)

View File

@ -1,5 +1,5 @@
word CFDEMversion="cfdem-2.5.0"; word CFDEMversion="cfdem-2.5.1";
word compatibleLIGGGHTSversion="2.2.5"; word compatibleLIGGGHTSversion="2.2.4";
Info << "\nCFDEMcoupling version: " << CFDEMversion << "\n" << endl; Info << "\nCFDEMcoupling version: " << CFDEMversion << "\n" << endl;
Info << "\n, compatible to LIGGGHTS version: " << compatibleLIGGGHTSversion << "\n" << endl; Info << "\n, compatible to LIGGGHTS version: " << compatibleLIGGGHTSversion << "\n" << endl;

View File

@ -32,5 +32,5 @@ do
compileSolver $logpath $logfileName $casePath $headerText compileSolver $logpath $logfileName $casePath $headerText
done done
echo "Note: the list of solvers compiled might be incomplete." #echo "Note: the list of solvers compiled might be incomplete."
echo "please check $CFDEM_SOLVER_DIR for more solvers available" #echo "please check $CFDEM_SOLVER_DIR for more solvers available"

View File

@ -64,11 +64,18 @@ basicIO::basicIO
//propsDict_(dict.subDict(typeName + "Props")), //propsDict_(dict.subDict(typeName + "Props")),
dirName_("lagrangian"), dirName_("lagrangian"),
path_("dev/null"), path_("dev/null"),
m2mComm_(false), parOutput_(true),
nPProc_(-1),
lagPath_("dev/null") lagPath_("dev/null")
{ {
if (particleCloud_.dataExchangeM().myType()=="twoWayM2M"){m2mComm_=true;} //typeName did not work if (
Info << "particleCloud_.dataExchangeM().typeName=" << particleCloud_.dataExchangeM().myType() << endl; particleCloud_.dataExchangeM().myType()=="oneWayVTK" ||
dict_.found("serialOutput")
)
{
parOutput_=false;
Warning << "IO model is in serial write mode, only data on proc 0 is written" << endl;
}
//if (propsDict_.found("dirName")) dirName_=word(propsDict_.lookup("dirName")); //if (propsDict_.found("dirName")) dirName_=word(propsDict_.lookup("dirName"));
path_ = buildFilePath(dirName_); path_ = buildFilePath(dirName_);
@ -90,17 +97,24 @@ void basicIO::dumpDEMdata() const
if (time_.outputTime()) if (time_.outputTime())
{ {
// make time directory // make time directory
if (m2mComm_) lagPath_=buildFilePath(dirName_); if (parOutput_) lagPath_=buildFilePath(dirName_);
else else
{ {
Info << "createTimeDir(path_), path="<<path_ << endl;
Info << "lagPath_=createTimeDir(fileName(lagPath_/lagrangian)), lagPath="<<path_ << endl;
lagPath_=createTimeDir(path_); lagPath_=createTimeDir(path_);
lagPath_=createTimeDir(fileName(lagPath_/"lagrangian")); lagPath_=createTimeDir(fileName(lagPath_/"lagrangian"));
} }
// calc the number of particles on proc
int count(0);
for(int index = 0;index < particleCloud_.numberOfParticles(); ++index)
if (particleCloud_.cellIDs()[index][0] > -1) count++;
nPProc_=count;
// stream data to file // stream data to file
streamDataToPath(lagPath_, particleCloud_.positions(), particleCloud_.numberOfParticles(), "positions","vector","Cloud<passiveParticle>","0"); streamDataToPath(lagPath_, particleCloud_.positions(), "positions","vector","Cloud<passiveParticle>","0");
streamDataToPath(lagPath_, particleCloud_.velocities(), particleCloud_.numberOfParticles(), "v","vector","vectorField",""); streamDataToPath(lagPath_, particleCloud_.velocities(), "v","vector","vectorField","");
streamDataToPath(lagPath_, particleCloud_.radii(), particleCloud_.numberOfParticles(), "r","scalar","scalarField",""); streamDataToPath(lagPath_, particleCloud_.radii(), "r","scalar","scalarField","");
} }
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -110,7 +124,7 @@ fileName basicIO::buildFilePath(word dirName) const
{ {
// create file structure // create file structure
fileName path(""); fileName path("");
if(m2mComm_) if(parOutput_)
{ {
path=fileName(particleCloud_.mesh().time().path()/particleCloud_.mesh().time().timeName()/dirName/"particleCloud"); path=fileName(particleCloud_.mesh().time().path()/particleCloud_.mesh().time().timeName()/dirName/"particleCloud");
mkDir(path,0777); mkDir(path,0777);
@ -125,16 +139,18 @@ fileName basicIO::buildFilePath(word dirName) const
return path; return path;
} }
void basicIO::streamDataToPath(fileName path, double** array,int n,word name,word type,word className,word finaliser) const void basicIO::streamDataToPath(fileName path, double** array,word name,word type,word className,word finaliser) const
{ {
vector vec; vector vec;
OFstream* fileStream = new OFstream(fileName(path/name)); OFstream* fileStream = new OFstream(fileName(path/name));
*fileStream << "FoamFile\n"; *fileStream << "FoamFile\n";
*fileStream << "{version 2.0; format ascii;class "<< className << "; location 0;object "<< name <<";}\n"; *fileStream << "{version 2.0; format ascii;class "<< className << "; location 0;object "<< name <<";}\n";
*fileStream << n <<"\n"; *fileStream << nPProc_ <<"\n";
*fileStream << "(\n"; *fileStream << "(\n";
for(int index = 0;index < n; ++index) for(int index = 0;index < particleCloud_.numberOfParticles(); ++index)
{
if (particleCloud_.cellIDs()[index][0] > -1) // particle Found
{ {
if (type=="scalar"){ if (type=="scalar"){
*fileStream << array[index][0] << " \n"; *fileStream << array[index][0] << " \n";
@ -143,6 +159,7 @@ void basicIO::streamDataToPath(fileName path, double** array,int n,word name,wor
*fileStream <<"( "<< vec[0] <<" "<<vec[1]<<" "<<vec[2]<<" ) "<< finaliser << " \n"; *fileStream <<"( "<< vec[0] <<" "<<vec[1]<<" "<<vec[2]<<" ) "<< finaliser << " \n";
} }
} }
}
*fileStream << ")\n"; *fileStream << ")\n";
delete fileStream; delete fileStream;
} }

View File

@ -64,7 +64,9 @@ private:
fileName path_; fileName path_;
bool m2mComm_; bool parOutput_;
mutable int nPProc_;
// Member Functions // Member Functions
fileName buildFilePath(word) const; fileName buildFilePath(word) const;
@ -72,7 +74,7 @@ private:
protected: protected:
mutable fileName lagPath_; mutable fileName lagPath_;
void streamDataToPath(fileName,double**,int,word,word type,word className,word finaliser) const; void streamDataToPath(fileName,double**,word,word type,word className,word finaliser) const;
public: public:

View File

@ -38,7 +38,7 @@ meshMotionModel noMeshMotion;
regionModel allRegion; regionModel allRegion;
IOModel off; IOModel basicIO;
dataExchangeModel oneWayVTK; dataExchangeModel oneWayVTK;

View File

@ -0,0 +1 @@
dummyfile

View File

@ -5,6 +5,7 @@ clc;
%====================================% %====================================%
% simulation data 1 % simulation data 1
%====================================% %====================================%
rhoG = 10 % density in kg/m3
%path = '../probes/0/p'; %path = '../probes/0/p';
path = '../probes/0/p'; path = '../probes/0/p';
columns=22; columns=22;
@ -12,7 +13,7 @@ headerlines=4;
data = loaddata(path,columns,headerlines); data = loaddata(path,columns,headerlines);
data=transpose(data); data=transpose(data);
[x,y]=size(data) [x,y]=size(data)
dp_sim = (data(:,2)-data(:,y))/10000; dp_sim = (data(:,2)-data(:,y))*rhoG; %conversion to Pa!
t_sim = data(:,1); t_sim = data(:,1);
%fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) ) %fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) )
@ -36,14 +37,13 @@ deltaU=(Uend-Ustart)/((Tend-Tstart)/timeStepSize);
U = Ustart+deltaU:deltaU:Uend; % velocity over time U = Ustart+deltaU:deltaU:Uend; % velocity over time
Ua = U / epsilon; % physical velocity Ua = U / epsilon; % physical velocity
L = 0.0156 % length of bed L = 0.0156 % length of bed
rhoG = 10 % density in kg/m3
nuG = 1.5*10^-4 % kinemat Visk in m2/s nuG = 1.5*10^-4 % kinemat Visk in m2/s
muG = nuG*rhoG % dynam visc in Pa s muG = nuG*rhoG % dynam visc in Pa s
dpErgun= L * ( dpErgun= L * (
150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2) 150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2)
+1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp)) +1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp))
)/10000/rhoG; );
fprintf('NOTE: this pressure is divided by density (according to CFD solver)\n') fprintf('NOTE: this pressure is divided by density (according to CFD solver)\n')
fprintf('so the result does not depend on density\n') fprintf('so the result does not depend on density\n')
@ -71,20 +71,18 @@ end
dpUmf= L * ( dpUmf= L * (
150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2) 150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2)
+1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp)) +1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp))
)/10000/rhoG; );
%dpUmf2=(L*(1-epsilon)*(rhoP-rhoG)*g+pHydr)/10000 %dpUmf2=(L*(1-epsilon)*(rhoP-rhoG)*g+pHydr)
%====================================% %====================================%
% plot data % plot data
%====================================% %====================================%
length(U)
length(dp_sim)
figure(2) figure(2)
plot(U,dp_sim) plot(U,dp_sim)
title("Ergun pressure drop vs. simulation") title("Ergun pressure drop vs. simulation")
a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf)); a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf));
legend(a,"simulation") legend(a,"simulation")
xlabel("velocity in [m/s]") xlabel("velocity in [m/s]")
ylabel("pressure drop [bar]") ylabel("pressure drop [Pa]")
axis([0,Uend,0,dpErgun(length(dpErgun))]) axis([0,Uend,0,dpErgun(length(dpErgun))])
figure(1) figure(1)
@ -93,7 +91,7 @@ title("Ergun pressure drop vs. simulation")
a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf)); a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf));
legend(a,"simulation","analyt. deltaP at Umf") legend(a,"simulation","analyt. deltaP at Umf")
xlabel("velocity in [m/s]") xlabel("velocity in [m/s]")
ylabel("pressure drop [bar]") ylabel("pressure drop [Pa]")
axis([0,Uend,0,dpErgun(length(dpErgun))]) axis([0,Uend,0,dpErgun(length(dpErgun))])
%print('cfdemSolverPiso_settlingTest.eps','-deps2') %print('cfdemSolverPiso_settlingTest.eps','-deps2')

View File

@ -5,6 +5,7 @@ clc;
%====================================% %====================================%
% simulation data 1 % simulation data 1
%====================================% %====================================%
rhoG = 10 % density in kg/m3
%path = '../probes/0/p'; %path = '../probes/0/p';
path = '../probes/0/p'; path = '../probes/0/p';
columns=22; columns=22;
@ -12,7 +13,7 @@ headerlines=4;
data = loaddata(path,columns,headerlines); data = loaddata(path,columns,headerlines);
data=transpose(data); data=transpose(data);
[x,y]=size(data) [x,y]=size(data)
dp_sim = (data(:,2)-data(:,y))/10000; dp_sim = (data(:,2)-data(:,y))*rhoG; % conversion to Pa
t_sim = data(:,1); t_sim = data(:,1);
%fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) ) %fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) )
@ -26,7 +27,7 @@ headerlines=4;
data = loaddata(path,columns,headerlines); data = loaddata(path,columns,headerlines);
data=transpose(data); data=transpose(data);
[x,y]=size(data) [x,y]=size(data)
dp_sim_2 = (data(:,2)-data(:,y))/10000; dp_sim_2 = (data(:,2)-data(:,y))*rhoG; % conversion to Pa
t_sim_2 = data(:,1); t_sim_2 = data(:,1);
%fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) ) %fprintf('final pressureDrop of sim = %f Pa\n',dp_sim(length(dp_sim)) )
@ -52,14 +53,13 @@ deltaU=(Uend-Ustart)/((Tend-Tstart)/timeStepSize);
U = Ustart+deltaU:deltaU:Uend; % velocity over time U = Ustart+deltaU:deltaU:Uend; % velocity over time
Ua = U / epsilon; % physical velocity Ua = U / epsilon; % physical velocity
L = 0.0156 % length of bed L = 0.0156 % length of bed
rhoG = 10 % density in kg/m3
nuG = 1.5*10^-4 % kinemat Visk in m2/s nuG = 1.5*10^-4 % kinemat Visk in m2/s
muG = nuG*rhoG % dynam visc in Pa s muG = nuG*rhoG % dynam visc in Pa s
dpErgun= L * ( dpErgun= L * (
150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2) 150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2)
+1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp)) +1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp))
)/10000/rhoG; );
fprintf('NOTE: this pressure is divided by density (according to CFD solver)\n') fprintf('NOTE: this pressure is divided by density (according to CFD solver)\n')
fprintf('so the result does not depend on density\n') fprintf('so the result does not depend on density\n')
@ -86,7 +86,7 @@ end
dpUmf= L * ( dpUmf= L * (
150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2) 150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2)
+1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp)) +1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp))
)/10000/rhoG; );
%====================================% %====================================%
% plot data % plot data
@ -98,7 +98,7 @@ dpUmf= L * (
%a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf)); %a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf));
%legend(a,"simulation") %legend(a,"simulation")
%xlabel("velocity in [m/s]") %xlabel("velocity in [m/s]")
%ylabel("pressure drop [bar]") %ylabel("pressure drop [Pa]")
%axis([0,Uend,0,dpErgun(length(dpErgun))]) %axis([0,Uend,0,dpErgun(length(dpErgun))])
figure(1) figure(1)
@ -107,7 +107,7 @@ title("Ergun pressure drop vs. simulation")
a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf)); a=strcat("analytical (Ergun), Umf=",num2str(Umf),", dpUmf=",num2str(dpUmf));
legend(a,"simulation") legend(a,"simulation")
xlabel("velocity in [m/s]") xlabel("velocity in [m/s]")
ylabel("pressure drop [bar]") ylabel("pressure drop [Pa]")
axis([0,Uend,0,dpErgun(length(dpErgun))]) axis([0,Uend,0,dpErgun(length(dpErgun))])
%print('cfdemSolverPiso_settlingTest.eps','-deps2') %print('cfdemSolverPiso_settlingTest.eps','-deps2')

View File

@ -19,11 +19,11 @@ application pisoFoam;
startFrom startTime; startFrom startTime;
startTime 0; startTime 0.05;
stopAt endTime; stopAt endTime;
endTime 0.05;//0.01; endTime 0.1;//0.01;
deltaT 0.001; deltaT 0.001;

View File

@ -35,3 +35,5 @@ dummyfile
dummyfile dummyfile
dummyfile dummyfile
dummyfile dummyfile
dummyfile
dummyfile