To run an example, let us go to cpl-library directory (available from github) and navigate to the examples/coupled folder. We are going to run a granular example with an FCC lattice, located here:
cpl-library/examples/coupled/fcc/fcc_fixedParticle
This guide uses singularity as this works on old version of linux (tested here on Ubuntu 12.04) and can be deployed without root privileges so should be an increasingly popular option for supercomputer deployment. To install singularity, check out the website but it should look something like this,
VERSION=2.5.2
wget https://github.com/singularityware/singularity/releases/download/$VERSION/singularity-$VERSION.tar.gz
tar xvf singularity-$VERSION.tar.gz
cd singularity-$VERSION
./configure --prefix=/usr/local
make
sudo make install
Once this is installed, to get the Docker container which has all OpenFOAM and LAMMPS executables, simply use,
singularity pull docker://cpllibrary/cpl-openfoam-lammps
which will create an image file in the current directory called cpl-openfoam-lammps.simg
.
To run this code, we first have to setup the OpenFOAM mesh and decompose for parallel runs.
This is done by using,
cd openfoam
singularity exec cpl-openfoam-lammps.simg blockMesh
singularity exec cpl-openfoam-lammps.simg decomposePar
cd ../
which will create a whole set of input files in the openfoam/processor0 folder. These can now be run as follows,
mpirun -np 1 singularity exec cpl-openfoam-lammps.simg CPLSediFOAM -case ./openfoam/ -parallel
and in another terminal in the same directory, run a version of LAMMPS to couple with this,
mpirun -np 1 singularity exec cpl-openfoam-lammps.simg lmp_cpl < lammps/fcc.in
The expected output of OpenFOAM should be similar to the following:
/*---------------------------------------------------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 3.0.1 |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
Build : 3.0.1-d8a290b55d28
Exec : CPLSediFOAM -case ./openfoam/ -parallel
Date : Jul 31 2018
Time : 16:18:58
Host : "me-flowdns05"
PID : 15780
Case : ./openfoam
nProcs : 1
Slaves : 0()
Pstream initialized with:
floatTransfer : 0
nProcsSimpleSum : 0
commsType : nonBlocking
polling iterations : 0
fileModificationChecking : Monitoring run-time modified files using timeStampMaster
allowSystemOperations : Allowing user-supplied system call operations
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time
Overriding DebugSwitches according to controlDict
dimensionSet 0;
Create mesh for time = 0
Reading environmentalProperties
*** coupled set to true by default
Reading field alpha
Reading field p
Reading field Ub
Setting up place-holder for Ua
Reading field F
Reading transportProperties
*** Max possible alpha set to 0.99 by default
Calculating face flux field phia
Calculating face flux field phib
CPLSocketFOAM::initComms
MPI_Initialized(&flag) 1
Only CFD realm present in MPI_COMM_WORLD
opened port: tag#0$description#$port#$ifname#127.0.1.1$ Attempting to write to file:./port
Portname written to file ./port
accepted connection on port to root of 1 procs.
Rank on realm 1 is 1 of 1 and rank on intercomm is 0 of 2
Completed CPL communicator init for CFD , CPL_WORLD_COMM ID: 0
________/\\\\\\\\\__/\\\\\\\\\\\\\____/\\\_____________
_____/\\\////////__\/\\\/////////\\\_\/\\\_____________
___/\\\/___________\/\\\_______\/\\\_\/\\\_____________
__/\\\_____________\/\\\\\\\\\\\\\/__\/\\\_____________
_\/\\\_____________\/\\\/////////____\/\\\_____________
_\//\\\____________\/\\\_____________\/\\\_____________
__\///\\\__________\/\\\_____________\/\\\_____________
____\////\\\\\\\\\_\/\\\_____________\/\\\\\\\\\\\\\\\_
_______\/////////__\///______________\///////////////__
C P L - L I B R A R Y
CPLSocketFOAM: Analysing processor and mesh topology
CPLSocketFOAM: Defining new MPI Cartesian communicator
Creating block mesh topology
OpenFOAM CPL topology initialisation complete
Starting time loop
Time = 0.0004
Courant Number mean: 8.0108e-05 max: 0.000100858
Max Ur Courant Number = 0.00036847
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 24.81 s ClockTime = 25 s
Time = 0.0008
Courant Number mean: 8.00859e-05 max: 0.000101061
Max Ur Courant Number = 0.000378359
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 25.27 s ClockTime = 26 s
Time = 0.0012
Courant Number mean: 8.00858e-05 max: 0.000101148
Max Ur Courant Number = 0.00038019
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 25.6 s ClockTime = 26 s
Time = 0.0016
Courant Number mean: 8.00858e-05 max: 0.000101185
Max Ur Courant Number = 0.000380607
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 25.94 s ClockTime = 26 s
Time = 0.002
Courant Number mean: 8.00861e-05 max: 0.000101208
Max Ur Courant Number = 0.000380742
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 26.28 s ClockTime = 27 s
Time = 0.0024
Courant Number mean: 8.00864e-05 max: 0.000101225
Max Ur Courant Number = 0.000380801
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 26.62 s ClockTime = 27 s
Time = 0.0028
Courant Number mean: 8.00985e-05 max: 0.000101251
Max Ur Courant Number = 0.000380884
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 26.96 s ClockTime = 27 s
Time = 0.0032
Courant Number mean: 8.00851e-05 max: 0.00010125
Max Ur Courant Number = 0.00038087
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 27.3 s ClockTime = 28 s
Time = 0.0036
Courant Number mean: 8.00918e-05 max: 0.00010126
Max Ur Courant Number = 0.000380891
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 27.63 s ClockTime = 28 s
Time = 0.004
Courant Number mean: 8.01003e-05 max: 0.000101273
Max Ur Courant Number = 0.000380953
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 27.98 s ClockTime = 28 s
Time = 0.0044
Courant Number mean: 8.00888e-05 max: 0.00010126
Max Ur Courant Number = 0.000380897
Dispersed phase volume fraction = 0.0622004 Min(alpha) = 0 Max(alpha) = 0.819445
ExecutionTime = 28.31 s ClockTime = 29 s
End
Finalising parallel run
Whereas the LAMMPS output will look something like,
Only MD realm present in MPI_COMM_WORLD
connection accepted to root of 1 procs.
Rank on realm 2 is 1 of 1 and rank on intercomm is 1 of 2
Completed CPL communicator init for MD , CPL_WORLD_COMM ID: 1
LAMMPS (16 Jul 2018)
Lattice spacing in x,y,z = 0.08 0.08 0.08
Created orthogonal box = (0 0 0) to (2 10 2)
1 by 1 by 1 MPI processor grid
Created 26250 atoms
Time spent = 0.00943184 secs
Setting atom values ...
26250 settings made for diameter
26250 settings made for density
CPL_init has been called more than once. Returning same COMM
Lammps cpl/init input arg 0 is 5
Lammps cpl/init input arg 1 is all
Lammps cpl/init input arg 2 is cpl/init
Lammps cpl/init input arg 3 is region
Lammps cpl/init input arg 4 is all
Lammps cpl/init input arg 5 is forcetype
Lammps forcetype: Drag with args Cd
Lammps forcetype: Drag with args 2.31918489371882
Lammps forcetype: Drag with args overlap
Lammps forcetype: Drag with args true
Lammps forcetype: Drag with args gradP
Lammps forcetype: Drag with args false
Lammps cpl/init input arg 6 is Drag
Lammps cpl/init input arg 7 is Cd
Lammps cpl/init input arg 8 is 2.31918489371882
Lammps cpl/init input arg 9 is overlap
Lammps cpl/init input arg 10 is true
Lammps cpl/init input arg 11 is gradP
Lammps cpl/init input arg 12 is false
Lammps cpl/init input arg 13 is sendtype
Lammps cpl/init input arg 14 is granfull
MODE ABOVE
dynamic group cplforcegroup defined
Lammps FixCPLForce forcetype: Drag with args Cd
Lammps FixCPLForce forcetype: Drag with args 2.31918489371882
Lammps FixCPLForce forcetype: Drag with args overlap
Lammps FixCPLForce forcetype: Drag with args true
Lammps FixCPLForce forcetype: Drag with args gradP
Lammps FixCPLForce forcetype: Drag with args false
Neighbor list info ...
update every 1 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 0.0615685
ghost atom cutoff = 0.0615685
binsize = 0.0307843, bins = 65 325 65
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair gran/hertz/history, perpetual
attributes: half, newton off, size, history
pair build: half/size/bin/newtoff
stencil: half/bin/3d/newtoff
bin: standard
Setting up Verlet run ...
Unit style : cgs
Current step : 0
Time step : 2e-05
Per MPI rank memory allocation (min/avg/max) = 29.42 | 29.42 | 29.42 Mbytes
Step Atoms CPU
0 26250 0
20 26250 0.34270096
40 26250 0.68225789
60 26250 1.0215797
80 26250 1.3615072
100 26250 1.7024806
120 26250 2.0426209
140 26250 2.3821836
160 26250 2.7220778
180 26250 3.0617683
200 26250 3.401315
Loop time of 3.40133 on 1 procs for 200 steps with 26250 atoms
98.9% CPU use with 1 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.021202 | 0.021202 | 0.021202 | 0.0 | 0.62
Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0.0141 | 0.0141 | 0.0141 | 0.0 | 0.41
Output | 0.74021 | 0.74021 | 0.74021 | 0.0 | 21.76
Modify | 2.6149 | 2.6149 | 2.6149 | 0.0 | 76.88
Other | | 0.01087 | | | 0.32
Nlocal: 26250 ave 26250 max 26250 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 3244 ave 3244 max 3244 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Ave neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
Total wall time: 0:00:03