diff --git a/applications/test/cpuInfo/Make/files b/applications/test/cpuInfo/Make/files
new file mode 100644
index 0000000000..f9302d8ef2
--- /dev/null
+++ b/applications/test/cpuInfo/Make/files
@@ -0,0 +1,3 @@
+Test-cpuInfo.C
+
+EXE = $(FOAM_USER_APPBIN)/Test-cpuInfo
diff --git a/applications/test/cpuInfo/Make/options b/applications/test/cpuInfo/Make/options
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/OSspecific/POSIX/memInfo/memInfoIO.C b/applications/test/cpuInfo/Test-cpuInfo.C
similarity index 58%
rename from src/OSspecific/POSIX/memInfo/memInfoIO.C
rename to applications/test/cpuInfo/Test-cpuInfo.C
index 883b216103..785b804678 100644
--- a/src/OSspecific/POSIX/memInfo/memInfoIO.C
+++ b/applications/test/cpuInfo/Test-cpuInfo.C
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
- \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -21,49 +21,26 @@ License
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see .
+Application
+
+Description
+
\*---------------------------------------------------------------------------*/
-#include "memInfo.H"
+#include "cpuInfo.H"
#include "IOstreams.H"
-// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+using namespace Foam;
-Foam::memInfo::memInfo(Istream& is)
-:
- base1(is),
- base2(is),
- member1(is),
- member2(is)
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
{
- // Check state of Istream
- is.check("Foam::memInfo::memInfo(Foam::Istream&)");
-}
+ cpuInfo().write(Info);
+ Info<< endl;
-
-// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
-
-Foam::Istream& Foam::operator>>(Istream& is, memInfo&)
-{
- // Check state of Istream
- is.check
- (
- "Foam::Istream& Foam::operator>>(Foam::Istream&, Foam::memInfo&)"
- );
-
- return is;
-}
-
-
-Foam::Ostream& Foam::operator<<(Ostream& os, const memInfo&)
-{
- // Check state of Ostream
- os.check
- (
- "Foam::Ostream& Foam::operator<<(Foam::Ostream&, "
- "const Foam::memInfo&)"
- );
-
- return os;
+ return 0;
}
diff --git a/applications/test/sysInfo/Make/files b/applications/test/sysInfo/Make/files
new file mode 100644
index 0000000000..7406672887
--- /dev/null
+++ b/applications/test/sysInfo/Make/files
@@ -0,0 +1,3 @@
+Test-sysInfo.C
+
+EXE = $(FOAM_USER_APPBIN)/Test-sysInfo
diff --git a/applications/test/sysInfo/Make/options b/applications/test/sysInfo/Make/options
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/applications/test/sysInfo/Test-sysInfo.C b/applications/test/sysInfo/Test-sysInfo.C
new file mode 100644
index 0000000000..3c04ce0187
--- /dev/null
+++ b/applications/test/sysInfo/Test-sysInfo.C
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+Application
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#include "ProfilingSysInfo.H"
+#include "IOstreams.H"
+
+using namespace Foam;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
+{
+ Profiling::sysInfo().write(Info);
+
+ return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
index b73c1fbecc..b5187f1e94 100644
--- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
+++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation | Copyright 2015 OpenCFD Ltd.
+ \\/ M anipulation | Copyright 2015-2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -59,6 +59,7 @@ Description
#include "IOmanip.H"
#include "decompositionModel.H"
#include "fvMeshTools.H"
+#include "profiling.H"
using namespace Foam;
@@ -633,6 +634,7 @@ int main(int argc, char *argv[])
"fileName",
"name of the file to save the simplified surface to"
);
+ #include "addProfilingOption.H"
#include "addDictOption.H"
#include "setRootCase.H"
@@ -816,7 +818,6 @@ int main(int argc, char *argv[])
const Switch keepPatches(meshDict.lookupOrDefault("keepPatches", false));
-
// Read decomposePar dictionary
dictionary decomposeDict;
{
@@ -927,6 +928,8 @@ int main(int argc, char *argv[])
}
}
+ // for the impatient who want to see some output files:
+ profiling::writeNow();
// Read geometry
// ~~~~~~~~~~~~~
@@ -957,6 +960,7 @@ int main(int argc, char *argv[])
if (surfaceSimplify)
{
+ addProfiling(surfaceSimplify, "snappyHexMesh::surfaceSimplify");
IOdictionary foamyHexMeshDict
(
IOobject
@@ -1001,6 +1005,8 @@ int main(int argc, char *argv[])
refineDict.lookupOrDefault("gapLevelIncrement", 0),
initialCellSize/defaultCellSize
);
+
+ profiling::writeNow();
}
else
{
@@ -1535,6 +1541,8 @@ int main(int argc, char *argv[])
Info<< "Mesh refined in = "
<< timer.cpuTimeIncrement() << " s." << endl;
+
+ profiling::writeNow();
}
if (wantSnap)
@@ -1583,6 +1591,8 @@ int main(int argc, char *argv[])
Info<< "Mesh snapped in = "
<< timer.cpuTimeIncrement() << " s." << endl;
+
+ profiling::writeNow();
}
if (wantLayers)
@@ -1639,11 +1649,14 @@ int main(int argc, char *argv[])
Info<< "Layers added in = "
<< timer.cpuTimeIncrement() << " s." << endl;
+
+ profiling::writeNow();
}
-
{
+ addProfiling(checkMesh, "snappyHexMesh::checkMesh");
+
// Check final mesh
Info<< "Checking final mesh ..." << endl;
faceSet wrongFaces(mesh, "wrongFaces", mesh.nFaces()/100);
@@ -1665,11 +1678,15 @@ int main(int argc, char *argv[])
{
Info<< "Finished meshing without any errors" << endl;
}
+
+ profiling::writeNow();
}
if (surfaceSimplify)
{
+ addProfiling(surfaceSimplify, "snappyHexMesh::surfaceSimplify");
+
const polyBoundaryMesh& bMesh = mesh.boundaryMesh();
labelHashSet includePatches(bMesh.size());
@@ -1727,6 +1744,7 @@ int main(int argc, char *argv[])
cellCentres.write();
}
+ profiling::writeNow();
Info<< "Finished meshing in = "
<< runTime.elapsedCpuTime() << " s." << endl;
diff --git a/applications/utilities/preProcessing/mapFieldsPar/MapVolFields.H b/applications/utilities/preProcessing/mapFieldsPar/MapVolFields.H
index c365bbddf6..c212b473ec 100644
--- a/applications/utilities/preProcessing/mapFieldsPar/MapVolFields.H
+++ b/applications/utilities/preProcessing/mapFieldsPar/MapVolFields.H
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
- \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -35,6 +35,88 @@ License
namespace Foam
{
+template
+void evaluateConstraintTypes(GeometricField& fld)
+{
+ typename GeometricField::
+ GeometricBoundaryField& fldBf = fld.boundaryField();
+
+ if
+ (
+ Pstream::defaultCommsType == Pstream::blocking
+ || Pstream::defaultCommsType == Pstream::nonBlocking
+ )
+ {
+ label nReq = Pstream::nRequests();
+
+ forAll(fldBf, patchi)
+ {
+ fvPatchField& tgtField = fldBf[patchi];
+
+ if
+ (
+ tgtField.type() == tgtField.patch().patch().type()
+ && polyPatch::constraintType(tgtField.patch().patch().type())
+ )
+ {
+ tgtField.initEvaluate(Pstream::defaultCommsType);
+ }
+ }
+
+ // Block for any outstanding requests
+ if
+ (
+ Pstream::parRun()
+ && Pstream::defaultCommsType == Pstream::nonBlocking
+ )
+ {
+ Pstream::waitRequests(nReq);
+ }
+
+ forAll(fldBf, patchi)
+ {
+ fvPatchField& tgtField = fldBf[patchi];
+
+ if
+ (
+ tgtField.type() == tgtField.patch().patch().type()
+ && polyPatch::constraintType(tgtField.patch().patch().type())
+ )
+ {
+ tgtField.evaluate(Pstream::defaultCommsType);
+ }
+ }
+ }
+ else if (Pstream::defaultCommsType == Pstream::scheduled)
+ {
+ const lduSchedule& patchSchedule =
+ fld.mesh().globalData().patchSchedule();
+
+ forAll(patchSchedule, patchEvali)
+ {
+ label patchi = patchSchedule[patchEvali].patch;
+ fvPatchField& tgtField = fldBf[patchi];
+
+ if
+ (
+ tgtField.type() == tgtField.patch().patch().type()
+ && polyPatch::constraintType(tgtField.patch().patch().type())
+ )
+ {
+ if (patchSchedule[patchEvali].init)
+ {
+ tgtField.initEvaluate(Pstream::scheduled);
+ }
+ else
+ {
+ tgtField.evaluate(Pstream::scheduled);
+ }
+ }
+ }
+ }
+}
+
+
template
void MapVolFields
(
@@ -57,8 +139,6 @@ void MapVolFields
if (selectedFields.empty() || selectedFields.found(fieldName))
{
- Info<< " interpolating " << fieldName << endl;
-
const fieldType fieldSource(*fieldIter(), meshSource);
IOobject targetIO
@@ -71,14 +151,21 @@ void MapVolFields
if (targetIO.typeHeaderOk(true))
{
+ Info<< " interpolating onto existing field "
+ << fieldName << endl;
fieldType fieldTarget(targetIO, meshTarget);
interp.mapSrcToTgt(fieldSource, cop, fieldTarget);
+ evaluateConstraintTypes(fieldTarget);
+
fieldTarget.write();
}
else
{
+ Info<< " creating new field "
+ << fieldName << endl;
+
targetIO.readOpt() = IOobject::NO_READ;
tmp
@@ -86,6 +173,8 @@ void MapVolFields
fieldType fieldTarget(targetIO, tfieldTarget);
+ evaluateConstraintTypes(fieldTarget);
+
fieldTarget.write();
}
}
diff --git a/applications/utilities/preProcessing/mapFieldsPar/mapFieldsPar.C b/applications/utilities/preProcessing/mapFieldsPar/mapFieldsPar.C
index 515dc66459..fdfdaad1da 100644
--- a/applications/utilities/preProcessing/mapFieldsPar/mapFieldsPar.C
+++ b/applications/utilities/preProcessing/mapFieldsPar/mapFieldsPar.C
@@ -121,34 +121,6 @@ void mapSubMesh
}
-wordList addProcessorPatches
-(
- const fvMesh& meshTarget,
- const wordList& cuttingPatches
-)
-{
- // Add the processor patches to the cutting list
- HashSet cuttingPatchTable;
- forAll(cuttingPatches, i)
- {
- cuttingPatchTable.insert(cuttingPatches[i]);
- }
-
- const polyBoundaryMesh& pbm = meshTarget.boundaryMesh();
-
- forAll(pbm, patchI)
- {
- if (isA(pbm[patchI]))
- {
- const word& patchName = pbm[patchI].name();
- cuttingPatchTable.insert(patchName);
- }
- }
-
- return cuttingPatchTable.toc();
-}
-
-
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
@@ -369,7 +341,7 @@ int main(int argc, char *argv[])
meshSource,
meshTarget,
patchMap,
- addProcessorPatches(meshTarget, cuttingPatches),
+ cuttingPatches,
mapMethod,
patchMapMethod,
subtract,
diff --git a/src/OSspecific/POSIX/Make/files b/src/OSspecific/POSIX/Make/files
index 90dc5bc92e..4780174be9 100644
--- a/src/OSspecific/POSIX/Make/files
+++ b/src/OSspecific/POSIX/Make/files
@@ -10,6 +10,7 @@ fileStat.C
POSIX.C
cpuTime/cpuTime.C
clockTime/clockTime.C
+cpuInfo/cpuInfo.C
memInfo/memInfo.C
/*
diff --git a/src/OSspecific/POSIX/cpuInfo/cpuInfo.C b/src/OSspecific/POSIX/cpuInfo/cpuInfo.C
new file mode 100644
index 0000000000..ef71120a74
--- /dev/null
+++ b/src/OSspecific/POSIX/cpuInfo/cpuInfo.C
@@ -0,0 +1,241 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "cpuInfo.H"
+#include "IFstream.H"
+#include "IOstreams.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+// file-scope function
+template
+inline static void writeEntry
+(
+ Foam::Ostream& os, const Foam::word& key, const T& value
+)
+{
+ os.writeKeyword(key) << value << Foam::token::END_STATEMENT << '\n';
+}
+
+
+// file-scope function
+static bool split(std::string& line, std::string& key, std::string& val)
+{
+ std::string::size_type sep = line.find(':');
+
+ if (sep == std::string::npos)
+ {
+ return false;
+ }
+
+ std::string::size_type endKey = line.find_last_not_of("\t:", sep);
+ std::string::size_type begVal = line.find_first_not_of(" :", sep);
+
+ if (endKey == std::string::npos || begVal == std::string::npos)
+ {
+ return false;
+ }
+ ++endKey;
+
+ // replace spaces in key with '_' for ease of use/consistency
+ for
+ (
+ std::string::iterator iter = line.begin();
+ iter != line.end();
+ ++iter
+ )
+ {
+ if (*iter == ' ')
+ {
+ *iter = '_';
+ }
+ else if (*iter == ':')
+ {
+ break;
+ }
+ }
+
+ key = line.substr(0, endKey);
+ val = line.substr(begVal);
+
+ // std::cerr<<"key=" << key << " val= " << val << '\n';
+
+ return true;
+}
+
+
+// file-scope function - get int
+static inline bool getInt(const std::string& str, int& val)
+{
+ int i;
+ if (sscanf(str.c_str(), "%d", &i) == 1)
+ {
+ val = i;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+// file-scope function - get float
+static inline bool getFlt(const std::string& str, float& val)
+{
+ float f;
+ if (sscanf(str.c_str(), "%f", &f) == 1)
+ {
+ val = f;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+// parse this type of content:
+// ===========================
+// processor : 0
+// vendor_id : GenuineIntel
+// cpu family : 6
+// model : 63
+// model name : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
+// stepping : 2
+// microcode : 0x35
+// cpu MHz : 1200.000
+// cache size : 15360 KB
+// physical id : 0
+// siblings : 12
+// core id : 0
+// cpu cores : 6
+// apicid : 0
+// initial apicid : 0
+// fpu : yes
+// fpu_exception : yes
+// cpuid level : 15
+// wp : yes
+// flags : fpu vme ...
+// bugs :
+// bogomips : 4789.15
+// clflush size : 64
+// cache_alignment : 64
+// address sizes : 46 bits physical, 48 bits virtual
+// power management:
+
+void Foam::cpuInfo::parse()
+{
+ int ncpu = 0;
+
+ IFstream is("/proc/cpuinfo");
+ while (is.good())
+ {
+ string line, key, value;
+ is.getLine(line);
+
+ if (!split(line, key, value))
+ {
+ continue;
+ }
+
+ if (key == "processor")
+ {
+ if (ncpu++)
+ {
+ break; // stop after the first cpu
+ }
+ }
+ else if (key == "vendor_id") { vendor_id = value; }
+ else if (key == "model_name") { model_name = value; }
+ else if (key == "cpu_family") { getInt(value, cpu_family); }
+ else if (key == "model") { getInt(value, model); }
+ else if (key == "cpu_MHz") { getFlt(value, cpu_MHz); }
+ else if (key == "cpu_cores") { getInt(value, cpu_cores); }
+ else if (key == "siblings") { getInt(value, siblings); }
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::cpuInfo::cpuInfo()
+:
+ vendor_id(),
+ model_name(),
+ cpu_family(-1),
+ model(-1),
+ cpu_MHz(0),
+ siblings(0),
+ cpu_cores(0)
+{
+ parse();
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::cpuInfo::~cpuInfo()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+void Foam::cpuInfo::write(Ostream& os) const
+{
+ if (!vendor_id.empty())
+ {
+ writeEntry(os, "vendor_id", vendor_id);
+ }
+ if (!model_name.empty())
+ {
+ writeEntry(os, "model_name", model_name);
+ }
+ if (cpu_family != -1)
+ {
+ writeEntry(os, "cpu_family", cpu_family);
+ }
+ if (model != -1)
+ {
+ writeEntry(os, "model", model);
+ }
+ if (cpu_MHz > 0)
+ {
+ writeEntry(os, "cpu_MHz", cpu_MHz);
+ }
+ if (cpu_cores > 0)
+ {
+ writeEntry(os, "cpu_cores", cpu_cores);
+ }
+ if (siblings > 0)
+ {
+ writeEntry(os, "siblings", siblings);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/src/OSspecific/POSIX/cpuInfo/cpuInfo.H b/src/OSspecific/POSIX/cpuInfo/cpuInfo.H
new file mode 100644
index 0000000000..6821684f61
--- /dev/null
+++ b/src/OSspecific/POSIX/cpuInfo/cpuInfo.H
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+Class
+ Foam::cpuInfo
+
+Description
+ General CPU characteristics.
+
+ If the machine has multiple cpus/cores, only the characteristics
+ of the first core are used.
+
+Note
+ Uses the information from /proc/cpuinfo
+
+SourceFiles
+ cpuInfo.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef cpuInfo_H
+#define cpuInfo_H
+
+#include
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+// forward declarations
+class Ostream;
+
+/*---------------------------------------------------------------------------*\
+ Class cpuInfo Declaration
+\*---------------------------------------------------------------------------*/
+
+class cpuInfo
+{
+ // Private data
+
+ // Various bits from /proc/cpuinfo
+
+ std::string vendor_id;
+ std::string model_name;
+ int cpu_family;
+ int model;
+ float cpu_MHz;
+ int siblings;
+ int cpu_cores;
+
+ // Private Member Functions
+
+ //- Parse /proc/cpuinfo
+ void parse();
+
+ //- Disallow default bitwise assignment
+ void operator=(const cpuInfo&) = delete;
+
+ //- Disallow default copy constructor
+ cpuInfo(const cpuInfo&) = delete;
+
+public:
+
+ // Constructors
+
+ //- Construct null
+ cpuInfo();
+
+
+ //- Destructor
+ ~cpuInfo();
+
+
+ // Member Functions
+
+ //- Write content as dictionary entries
+ void write(Ostream&) const;
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OSspecific/POSIX/memInfo/memInfo.C b/src/OSspecific/POSIX/memInfo/memInfo.C
index 6273fe5aa1..43037b5c79 100644
--- a/src/OSspecific/POSIX/memInfo/memInfo.C
+++ b/src/OSspecific/POSIX/memInfo/memInfo.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -24,14 +24,29 @@ License
\*---------------------------------------------------------------------------*/
#include "memInfo.H"
+#include "IFstream.H"
+#include "IOstreams.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+// file-scope function
+template
+inline static void writeEntry
+(
+ Foam::Ostream& os, const Foam::word& key, const T& value
+)
+{
+ os.writeKeyword(key) << value << Foam::token::END_STATEMENT << '\n';
+}
+
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::memInfo::memInfo()
:
- peak_(-1),
- size_(-1),
- rss_(-1)
+ peak_(0),
+ size_(0),
+ rss_(0)
{
update();
}
@@ -48,7 +63,7 @@ Foam::memInfo::~memInfo()
const Foam::memInfo& Foam::memInfo::update()
{
// reset to invalid values first
- peak_ = size_ = rss_ = -1;
+ peak_ = size_ = rss_ = 0;
IFstream is("/proc/" + name(pid()) + "/status");
while (is.good())
@@ -81,7 +96,15 @@ const Foam::memInfo& Foam::memInfo::update()
bool Foam::memInfo::valid() const
{
- return peak_ != -1;
+ return peak_ > 0;
+}
+
+
+void Foam::memInfo::write(Ostream& os) const
+{
+ writeEntry(os, "size", size_);
+ writeEntry(os, "peak", peak_);
+ writeEntry(os, "rss", rss_);
}
@@ -108,14 +131,15 @@ Foam::Istream& Foam::operator>>(Istream& is, memInfo& m)
Foam::Ostream& Foam::operator<<(Ostream& os, const memInfo& m)
{
os << token::BEGIN_LIST
- << m.peak_ << token::SPACE << m.size_ << token::SPACE << m.rss_
+ << m.peak_ << token::SPACE
+ << m.size_ << token::SPACE
+ << m.rss_
<< token::END_LIST;
// Check state of Ostream
os.check
(
- "Foam::Ostream& Foam::operator<<(Foam::Ostream&, "
- "const Foam::memInfo&)"
+ "Foam::Ostream& Foam::operator<<(Foam::Ostream&, const Foam::memInfo&)"
);
return os;
diff --git a/src/OSspecific/POSIX/memInfo/memInfo.H b/src/OSspecific/POSIX/memInfo/memInfo.H
index 540ea9b6d1..cc970896fc 100644
--- a/src/OSspecific/POSIX/memInfo/memInfo.H
+++ b/src/OSspecific/POSIX/memInfo/memInfo.H
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -28,7 +28,7 @@ Description
Memory usage information for the process running this object.
Note
- Uses the information from /proc/\/status
+ Uses the information from /proc/PID/status
SourceFiles
memInfo.C
@@ -47,6 +47,10 @@ SourceFiles
namespace Foam
{
+// forward declarations
+class Istream;
+class Ostream;
+
/*---------------------------------------------------------------------------*\
Class memInfo Declaration
\*---------------------------------------------------------------------------*/
@@ -55,15 +59,20 @@ class memInfo
{
// Private data
- //- Peak memory used by the process (VmPeak in /proc/\/status)
+ //- Peak memory used by the process (VmPeak in /proc/PID/status)
int peak_;
- //- Memory used by the process (VmSize in /proc/\/status)
+ //- Memory used by the process (VmSize in /proc/PID/status)
int size_;
- //- Resident set size of the process (VmRSS in /proc/\/status)
+ //- Resident set size of the process (VmRSS in /proc/PID/status)
int rss_;
+ //- Disallow default bitwise assignment
+ void operator=(const memInfo&) = delete;
+
+ //- Disallow default copy constructor
+ memInfo(const memInfo&) = delete;
public:
@@ -79,27 +88,24 @@ public:
// Member Functions
- //- Parse /proc/\/status
+ //- Parse /proc/PID/status and update accordingly
const memInfo& update();
// Access
- //- Access the stored peak memory (VmPeak in /proc/\/status)
- // The value is stored from the previous update()
+ //- Peak memory (VmPeak in /proc/PID/status) at last update()
int peak() const
{
return peak_;
}
- //- Access the stored memory size (VmSize in /proc/\/status)
- // The value is stored from the previous update()
+ //- Memory size (VmSize in /proc/PID/status) at last update()
int size() const
{
return size_;
}
- //- Access the stored rss value (VmRSS in /proc/\/status)
- // The value is stored from the previous update()
+ //- Resident set size (VmRSS in /proc/PID/status) at last update()
int rss() const
{
return rss_;
@@ -109,6 +115,10 @@ public:
bool valid() const;
+ //- Write content as dictionary entries
+ void write(Ostream&) const;
+
+
// IOstream Operators
//- Read peak/size/rss from stream
diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files
index 460c85c164..1f42581d8b 100644
--- a/src/OpenFOAM/Make/files
+++ b/src/OpenFOAM/Make/files
@@ -3,6 +3,8 @@ global/global.Cver
/* global/constants/dimensionedConstants.C in global.Cver */
global/argList/argList.C
global/clock/clock.C
+global/profiling/profiling.C
+global/profiling/profilingSysInfo.C
bools = primitives/bools
$(bools)/bool/bool.C
diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C
index 4153ec823a..7792e9dca2 100644
--- a/src/OpenFOAM/db/Time/Time.C
+++ b/src/OpenFOAM/db/Time/Time.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -27,6 +27,7 @@ License
#include "PstreamReduceOps.H"
#include "argList.H"
#include "HashSet.H"
+#include "profiling.H"
#include
@@ -333,6 +334,72 @@ void Foam::Time::setControls()
}
+void Foam::Time::setMonitoring(bool forceProfiling)
+{
+ const dictionary* profilingDict = controlDict_.subDictPtr("profiling");
+
+ // initialize profiling on request
+ // otherwise rely on profiling entry within controlDict
+ // and skip if 'active' keyword is explicitly set to false
+ if (forceProfiling)
+ {
+ profiling::initialize
+ (
+ IOobject
+ (
+ "profiling",
+ timeName(),
+ "uniform",
+ *this,
+ IOobject::NO_READ,
+ IOobject::AUTO_WRITE
+ ),
+ *this
+ );
+ }
+ else if
+ (
+ profilingDict
+ && profilingDict->lookupOrDefault("active", true)
+ )
+ {
+ profiling::initialize
+ (
+ *profilingDict,
+ IOobject
+ (
+ "profiling",
+ timeName(),
+ "uniform",
+ *this,
+ IOobject::NO_READ,
+ IOobject::AUTO_WRITE
+ ),
+ *this
+ );
+ }
+
+ // Time objects not registered so do like objectRegistry::checkIn ourselves.
+ if (runTimeModifiable_)
+ {
+ monitorPtr_.reset
+ (
+ new fileMonitor
+ (
+ regIOobject::fileModificationChecking == inotify
+ || regIOobject::fileModificationChecking == inotifyMaster
+ )
+ );
+
+ // Monitor all files that controlDict depends on
+ addWatches(controlDict_, controlDict_.files());
+ }
+
+ // Clear dependent files - not needed now
+ controlDict_.files().clear();
+}
+
+
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::Time::Time
@@ -401,25 +468,7 @@ Foam::Time::Time
readOpt() = IOobject::MUST_READ_IF_MODIFIED;
setControls();
-
- // Time objects not registered so do like objectRegistry::checkIn ourselves.
- if (runTimeModifiable_)
- {
- monitorPtr_.reset
- (
- new fileMonitor
- (
- regIOobject::fileModificationChecking == inotify
- || regIOobject::fileModificationChecking == inotifyMaster
- )
- );
-
- // Monitor all files that controlDict depends on
- addWatches(controlDict_, controlDict_.files());
- }
-
- // Clear dependent files
- controlDict_.files().clear();
+ setMonitoring();
}
@@ -496,24 +545,8 @@ Foam::Time::Time
setControls();
- // Time objects not registered so do like objectRegistry::checkIn ourselves.
- if (runTimeModifiable_)
- {
- monitorPtr_.reset
- (
- new fileMonitor
- (
- regIOobject::fileModificationChecking == inotify
- || regIOobject::fileModificationChecking == inotifyMaster
- )
- );
-
- // Monitor all files that controlDict depends on
- addWatches(controlDict_, controlDict_.files());
- }
-
- // Clear dependent files since not needed
- controlDict_.files().clear();
+ // '-profiling' = force profiling, ignore controlDict entry
+ setMonitoring(args.optionFound("profiling"));
}
@@ -588,25 +621,7 @@ Foam::Time::Time
controlDict_.readOpt() = IOobject::MUST_READ_IF_MODIFIED;
setControls();
-
- // Time objects not registered so do like objectRegistry::checkIn ourselves.
- if (runTimeModifiable_)
- {
- monitorPtr_.reset
- (
- new fileMonitor
- (
- regIOobject::fileModificationChecking == inotify
- || regIOobject::fileModificationChecking == inotifyMaster
- )
- );
-
- // Monitor all files that controlDict depends on
- addWatches(controlDict_, controlDict_.files());
- }
-
- // Clear dependent files since not needed
- controlDict_.files().clear();
+ setMonitoring();
}
@@ -667,6 +682,7 @@ Foam::Time::Time
functionObjects_(*this, enableFunctionObjects)
{
libs_.open(controlDict_, "libs");
+ setMonitoring(); // for profiling etc
}
@@ -681,6 +697,9 @@ Foam::Time::~Time()
// destroy function objects first
functionObjects_.clear();
+
+ // cleanup profiling
+ profiling::stop(*this);
}
@@ -922,9 +941,13 @@ bool Foam::Time::run() const
{
// Ensure functionObjects execute on last time step
// (and hence write uptodate functionObjectProperties)
+ addProfiling(foExec, "functionObjects.execute()");
functionObjects_.execute();
+ endProfiling(foExec);
+ addProfiling(foEnd, "functionObjects.end()");
functionObjects_.end();
+ endProfiling(foEnd);
}
}
@@ -936,10 +959,12 @@ bool Foam::Time::run() const
if (timeIndex_ == startTimeIndex_)
{
+ addProfiling(functionObjects, "functionObjects.start()");
functionObjects_.start();
}
else
{
+ addProfiling(functionObjects, "functionObjects.execute()");
functionObjects_.execute();
}
}
diff --git a/src/OpenFOAM/db/Time/Time.H b/src/OpenFOAM/db/Time/Time.H
index cac8f2e02e..1a32dcff00 100644
--- a/src/OpenFOAM/db/Time/Time.H
+++ b/src/OpenFOAM/db/Time/Time.H
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -181,6 +181,10 @@ protected:
//- Set the controls from the current controlDict
void setControls();
+ //- Set file monitoring, profiling, etc
+ // Optionally force profiling without inspecting the controlDict
+ void setMonitoring(const bool forceProfiling=false);
+
//- Read the control dictionary and set the write controls etc.
virtual void readDict();
diff --git a/src/OpenFOAM/db/Time/TimeIO.C b/src/OpenFOAM/db/Time/TimeIO.C
index f6b41ab2cf..4747ea7d62 100644
--- a/src/OpenFOAM/db/Time/TimeIO.C
+++ b/src/OpenFOAM/db/Time/TimeIO.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -27,6 +27,7 @@ License
#include "Pstream.H"
#include "simpleObjectRegistry.H"
#include "dimensionedConstants.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@@ -518,6 +519,8 @@ bool Foam::Time::writeObject
{
if (outputTime())
{
+ addProfiling(writing, "objectRegistry::writeObject");
+
const word tmName(timeName());
IOdictionary timeDict
diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C
index a66ef2893b..caa55f43c9 100644
--- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C
+++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C
@@ -26,6 +26,7 @@ License
#include "functionObjectList.H"
#include "Time.H"
#include "mapPolyMesh.H"
+#include "profiling.H"
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
@@ -220,6 +221,12 @@ bool Foam::functionObjectList::execute(const bool forceWrite)
forAll(*this, objectI)
{
+ addProfiling
+ (
+ fo,
+ "functionObject::" + operator[](objectI).name() + "::execute"
+ );
+
ok = operator[](objectI).execute(forceWrite) && ok;
}
}
@@ -257,6 +264,12 @@ bool Foam::functionObjectList::end()
forAll(*this, objectI)
{
+ addProfiling
+ (
+ fo,
+ "functionObject::" + operator[](objectI).name() + "::end"
+ );
+
ok = operator[](objectI).end() && ok;
}
}
@@ -339,6 +352,8 @@ bool Foam::functionObjectList::read()
label nFunc = 0;
+ addProfiling(fo,"functionObjects::read");
+
if (entryPtr->isDict())
{
// A dictionary of functionObjects
@@ -366,12 +381,24 @@ bool Foam::functionObjectList::read()
// An existing functionObject, and dictionary changed
if (newDigs[nFunc] != digests_[oldIndex])
{
+ addProfiling
+ (
+ fo2,
+ "functionObject::" + objPtr->name() + "::read"
+ );
+
ok = objPtr->read(dict) && ok;
}
}
else
{
// New functionObject
+ addProfiling
+ (
+ fo2,
+ "functionObject::" + key + "::start"
+ );
+
objPtr = functionObject::New(key, time_, dict).ptr();
ok = objPtr->start() && ok;
}
diff --git a/src/OpenFOAM/global/foamDoc.H b/src/OpenFOAM/global/foamDoc.H
index 73210859be..1d251618f5 100644
--- a/src/OpenFOAM/global/foamDoc.H
+++ b/src/OpenFOAM/global/foamDoc.H
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -56,8 +56,22 @@ License
\section usingTheCode Using the code
+ Solvers
- \subpage pageSolvers
+
+ Modelling
+ - \subpage pageThermophsyicalModels
+ - \subpage pageTurbulenceModelling
+ - \subpage pageLagrangianIntermediate
+
+ Boundary conditions
- \subpage pageBoundaryConditions
+
+ Numerics
+ - \subpage pageFiniteVolumeSchemes
+ - \subpage pageMatrixSolvers
+
+ Post-processing
- \subpage pagePostProcessing
diff --git a/src/OpenFOAM/global/profiling/profiling.C b/src/OpenFOAM/global/profiling/profiling.C
new file mode 100644
index 0000000000..f1aec91820
--- /dev/null
+++ b/src/OpenFOAM/global/profiling/profiling.C
@@ -0,0 +1,562 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2009-2016 Bernhard Gschaider
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "profiling.H"
+#include "profilingSysInfo.H"
+#include "cpuInfo.H"
+#include "memInfo.H"
+#include "OSspecific.H"
+#include "IOstreams.H"
+#include "dictionary.H"
+#include "demandDrivenData.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+Foam::profiling* Foam::profiling::pool_(0);
+
+Foam::label Foam::profiling::Information::nextId_(0);
+
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+// file-scope function
+template
+inline static void writeEntry
+(
+ Foam::Ostream& os, const Foam::word& key, const T& value
+)
+{
+ os.writeKeyword(key) << value << Foam::token::END_STATEMENT << '\n';
+}
+
+
+Foam::label Foam::profiling::Information::getNextId()
+{
+ return nextId_++;
+}
+
+
+void Foam::profiling::Information::raiseID(label maxVal)
+{
+ if (nextId_ < maxVal)
+ {
+ nextId_ = maxVal;
+ }
+}
+
+
+bool Foam::profiling::active()
+{
+ return pool_;
+}
+
+
+bool Foam::profiling::writeNow()
+{
+ if (pool_)
+ {
+ Info<<"profiling::writeNow() at time = "
+ << pool_->owner().timeName() << endl;
+ return pool_->write();
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+void Foam::profiling::initialize
+(
+ const IOobject& ioObj,
+ const Time& owner
+)
+{
+ if (pool_)
+ {
+ WarningInFunction
+ << "Already initialized" << endl;
+ }
+ else
+ {
+ pool_ = new profiling(ioObj, owner);
+
+ Information *info = pool_->store
+ (
+ new Information()
+ );
+
+ pool_->push(info, pool_->clockTime_);
+ Info<< "profiling initialized" << nl;
+ }
+}
+
+
+void Foam::profiling::initialize
+(
+ const dictionary& dict,
+ const IOobject& ioObj,
+ const Time& owner
+)
+{
+ if (pool_)
+ {
+ WarningInFunction
+ << "Already initialized" << endl;
+ }
+ else
+ {
+ pool_ = new profiling(dict, ioObj, owner);
+
+ Information *info = pool_->store
+ (
+ new Information()
+ );
+
+ pool_->push(info, pool_->clockTime_);
+ Info<< "profiling initialized" << nl;
+ }
+}
+
+
+void Foam::profiling::stop(const Time& owner)
+{
+ if (pool_ && &owner == &(pool_->owner_))
+ {
+ delete pool_;
+ pool_ = 0;
+ }
+}
+
+
+Foam::profiling::Information* Foam::profiling::New
+(
+ const string& name,
+ clockTime& timer
+)
+{
+ Information *info = 0;
+
+ if (pool_)
+ {
+ info = pool_->find(name);
+ if (!info)
+ {
+ info = pool_->store
+ (
+ new Information(pool_->stack_.top(), name)
+ );
+ }
+
+ pool_->push(info, timer);
+
+ if (pool_->memInfo_)
+ {
+ info->maxMem_ = Foam::max
+ (
+ info->maxMem_,
+ pool_->memInfo_->update().size()
+ );
+ }
+ }
+
+ return info;
+}
+
+
+void Foam::profiling::unstack(const Information *info)
+{
+ if (pool_ && info)
+ {
+ Information *top = pool_->pop();
+
+ if (info->id() != top->id())
+ {
+ FatalErrorInFunction
+ << "The profiling information to unstack has different"
+ << " id than on the top of the profiling stack" << nl
+ << " info: " << info->id() << " (" << info->description()
+ << ")\n"
+ << " top: " << top->id() << " (" << top->description()
+ << ")\n" << endl
+ << abort(FatalError);
+ }
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::profiling::profiling
+(
+ const IOobject& io,
+ const Time& owner
+)
+:
+ regIOobject(io),
+ owner_(owner),
+ clockTime_(),
+ hash_(),
+ stack_(),
+ timers_(),
+ sysInfo_(new sysInfo()),
+ cpuInfo_(new cpuInfo()),
+ memInfo_(new memInfo())
+{}
+
+
+Foam::profiling::profiling
+(
+ const dictionary& dict,
+ const IOobject& io,
+ const Time& owner
+)
+:
+ regIOobject(io),
+ owner_(owner),
+ clockTime_(),
+ hash_(),
+ stack_(),
+ timers_(),
+ sysInfo_
+ (
+ dict.lookupOrDefault("sysInfo", true)
+ ? new sysInfo() : 0
+ ),
+ cpuInfo_
+ (
+ dict.lookupOrDefault("cpuInfo", true)
+ ? new cpuInfo() : 0
+ ),
+ memInfo_
+ (
+ dict.lookupOrDefault("memInfo", false)
+ ? new memInfo() : 0
+ )
+{}
+
+
+Foam::profiling::Information::Information()
+:
+ id_(getNextId()),
+ description_("application::main"),
+ parent_(this),
+ calls_(0),
+ totalTime_(0),
+ childTime_(0),
+ maxMem_(0),
+ onStack_(false)
+{}
+
+
+Foam::profiling::Information::Information
+(
+ Information *parent,
+ const string& descr
+)
+:
+ id_(getNextId()),
+ description_(descr),
+ parent_(parent),
+ calls_(0),
+ totalTime_(0),
+ childTime_(0),
+ maxMem_(0),
+ onStack_(false)
+{}
+
+
+Foam::profiling::Trigger::Trigger(const char* name)
+:
+ clock_(),
+ ptr_(profiling::New(name, clock_))
+{}
+
+
+Foam::profiling::Trigger::Trigger(const string& name)
+:
+ clock_(),
+ ptr_(profiling::New(name, clock_))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::profiling::~profiling()
+{
+ deleteDemandDrivenData(sysInfo_);
+ deleteDemandDrivenData(cpuInfo_);
+ deleteDemandDrivenData(memInfo_);
+
+ if (pool_ == this)
+ {
+ pool_ = 0;
+ Information::nextId_ = 0;
+ }
+}
+
+
+Foam::profiling::Information::~Information()
+{}
+
+
+Foam::profiling::Trigger::~Trigger()
+{
+ stop();
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+const Foam::Time& Foam::profiling::owner() const
+{
+ return owner_;
+}
+
+Foam::label Foam::profiling::size() const
+{
+ return stack_.size();
+}
+
+
+Foam::profiling::Information* Foam::profiling::find(const string& name)
+{
+ StorageContainer::iterator iter = hash_.find(name);
+ return (iter != hash_.end() ? iter() : 0);
+}
+
+
+void Foam::profiling::Information::update(const scalar& elapsed)
+{
+ ++calls_;
+ totalTime_ += elapsed;
+
+ if (id_ != parent().id())
+ {
+ parent().childTime_ += elapsed;
+ }
+}
+
+
+bool Foam::profiling::writeData(Ostream& os) const
+{
+ os << indent << "profiling" << nl
+ << indent << token::BEGIN_LIST << incrIndent << nl;
+
+ // write on-stack items
+ // newest is first on the stack, top-level is at the end
+ // this is how the child times are summed
+ {
+ scalar oldElapsed = 0;
+ forAllConstIter(StackContainer, stack_, iter)
+ {
+ const Information *info = *iter;
+ scalar elapsed = timers_[info->id()]->elapsedTime();
+
+ info->write(os, true, elapsed, oldElapsed);
+ oldElapsed = elapsed;
+ }
+ }
+
+
+ // write off-stack items
+ // using an additional Map to sort by Id
+ {
+ typedef Map LookupContainer;
+ LookupContainer lookup;
+
+ forAllConstIter(StorageContainer, hash_, iter)
+ {
+ const Information *info = iter();
+
+ if (!info->onStack())
+ {
+ lookup.set(info->id(), info);
+ }
+ }
+
+ forAllConstIter(LookupContainer, lookup, iter)
+ {
+ iter()->write(os);
+ }
+ }
+
+ os << decrIndent
+ << indent << token::END_LIST << token::END_STATEMENT << nl;
+
+
+ if (sysInfo_)
+ {
+ os << nl;
+ os.beginBlock("sysInfo") << nl; // FUTURE: without nl
+ sysInfo_->write(os);
+ os.endBlock() << nl; // FUTURE: without nl
+ }
+
+ if (cpuInfo_)
+ {
+ os << nl;
+ os.beginBlock("cpuInfo") << nl; // FUTURE: without nl
+ cpuInfo_->write(os);
+ os.endBlock() << nl; // FUTURE: without nl
+ }
+
+ if (memInfo_)
+ {
+ memInfo_->update();
+
+ os << nl;
+ os.beginBlock("memInfo") << nl; // FUTURE: without nl
+ memInfo_->write(os);
+ writeEntry(os, "units", "kB");
+ os.endBlock() << nl; // FUTURE: without nl
+ }
+
+ return os;
+}
+
+
+bool Foam::profiling::writeObject
+(
+ IOstream::streamFormat,
+ IOstream::versionNumber ver,
+ IOstream::compressionType
+) const
+{
+ return regIOobject::writeObject
+ (
+ IOstream::ASCII,
+ ver,
+ IOstream::UNCOMPRESSED
+ );
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::profiling::Information* Foam::profiling::store(Information *info)
+{
+ hash_.insert(info->description(), info);
+ return info;
+}
+
+
+void Foam::profiling::push(Information *info, clockTime& timer)
+{
+ stack_.push(info);
+ timers_.set(info->id(), &timer);
+ info->push(); // mark as on stack
+}
+
+
+Foam::profiling::Information* Foam::profiling::pop()
+{
+ Information *info = stack_.pop();
+ timers_.erase(info->id());
+ info->pop(); // mark as off stack
+
+ return info;
+}
+
+
+bool Foam::profiling::Trigger::running() const
+{
+ return ptr_;
+}
+
+
+void Foam::profiling::Trigger::stop()
+{
+ if (ptr_)
+ {
+ ptr_->update(clock_.elapsedTime());
+ profiling::unstack(ptr_);
+ // pointer is managed by pool storage -> thus no delete here
+ }
+ ptr_ = 0;
+}
+
+
+void Foam::profiling::Information::push() const
+{
+ onStack_ = true;
+}
+
+
+void Foam::profiling::Information::pop() const
+{
+ onStack_ = false;
+}
+
+
+Foam::Ostream& Foam::profiling::Information::write
+(
+ Ostream& os,
+ const bool offset,
+ const scalar& elapsedTime,
+ const scalar& childTimes
+) const
+{
+ // write in dictionary format
+
+ // os.beginBlock("_" + Foam::name(id_)) << nl;
+ os.beginBlock() << nl; // FUTURE: without nl
+
+ // FUTURE: os.writeEntry(key, value);
+
+ writeEntry(os, "id", id_);
+ if (id_ != parent().id())
+ {
+ writeEntry(os, "parentId", parent().id());
+ }
+ writeEntry(os, "description", description());
+ writeEntry(os, "calls", calls() + (offset ? 1 : 0));
+ writeEntry(os, "totalTime", totalTime() + elapsedTime);
+ writeEntry(os, "childTime", childTime() + childTimes);
+ if (maxMem_)
+ {
+ writeEntry(os, "maxMem", maxMem_);
+ }
+ writeEntry(os, "onStack", Switch(onStack()));
+
+ os.endBlock() << nl; // FUTURE: without nl
+
+ return os;
+}
+
+
+// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
+
+Foam::Ostream& Foam::operator<<
+(
+ Ostream& os,
+ const profiling::Information& info
+)
+{
+ return info.write(os);
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/global/profiling/profiling.H b/src/OpenFOAM/global/profiling/profiling.H
new file mode 100644
index 0000000000..4986a92168
--- /dev/null
+++ b/src/OpenFOAM/global/profiling/profiling.H
@@ -0,0 +1,486 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2009-2016 Bernhard Gschaider
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+Class
+ Foam::profiling
+
+Description
+ Code profiling.
+
+ This is typically activated from within the system/controlDict as follows
+ (defaults shown):
+ \code
+ profiling
+ {
+ active true;
+ cpuInfo true;
+ memInfo false;
+ sysInfo true;
+ }
+ \endcode
+ or simply using all defaults:
+ \code
+ profiling
+ {}
+ \endcode
+
+SourceFiles
+ profiling.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef profiling_H
+#define profiling_H
+
+#include "HashPtrTable.H"
+#include "LIFOStack.H"
+#include "Map.H"
+#include "Time.H"
+#include "clockTime.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class Ostream;
+class dictionary;
+class cpuInfo;
+class memInfo;
+
+/*---------------------------------------------------------------------------*\
+ Class profiling Declaration
+\*---------------------------------------------------------------------------*/
+
+class profiling
+:
+ public regIOobject
+{
+public:
+
+ // Forward declarations of components
+
+ class Information;
+ class Trigger;
+ class sysInfo;
+
+private:
+
+ // Private Static Data Members
+
+ //- Only one global pool object is possible
+ static profiling *pool_;
+
+
+ // Private Data Members
+
+ typedef HashPtrTable StorageContainer;
+ typedef LIFOStack StackContainer;
+
+
+ //- The owner of the profiling
+ const Time& owner_;
+
+ //- A global timer for the profiling
+ clockTime clockTime_;
+
+ //- Storage of profiling information
+ StorageContainer hash_;
+
+ //- Local stack of profiling information
+ StackContainer stack_;
+
+ //- Note the timers (by Id) for the correct stack-output
+ Map timers_;
+
+ //- General system information (optional)
+ sysInfo* sysInfo_;
+
+ //- CPU-Information (optional)
+ cpuInfo* cpuInfo_;
+
+ //- MEM-Information (optional)
+ memInfo* memInfo_;
+
+
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ profiling(const profiling&) = delete;
+
+ //- Disallow default bitwise assignment
+ void operator=(const profiling&) = delete;
+
+
+protected:
+
+ // Friendship
+
+ friend class Time;
+
+
+ // Constructors
+
+ //- Construct IO object, everything enabled
+ profiling(const IOobject&, const Time&);
+
+ //- Construct IO object with finer control over behaviour
+ profiling(const dictionary&, const IOobject&, const Time&);
+
+
+ //- Destructor
+ ~profiling();
+
+
+ // Protected Member Functions
+
+ //- Find profiling information element or null on failure
+ Information* find(const string& name);
+
+ //- Add to hashed storage,
+ // returns pointer to newly stored element for chaining
+ Information* store(Information*);
+
+ //- Add to stack and set timer lookup (based on Id)
+ void push(Information*, clockTime& timer);
+
+ //- Remove from stack and remove timer lookup (based on Id).
+ // Returns pointer to profiling information element
+ Information* pop();
+
+
+ // Static control elements
+
+ //- Singleton to initialize profiling pool, everything enabled
+ static void initialize(const IOobject&, const Time&);
+
+ //- Singleton to initialize profiling pool with finer control
+ static void initialize(const dictionary&, const IOobject&, const Time&);
+
+ //- Stop profiling, cleanup pool if possible
+ static void stop(const Time&);
+
+ //- Existing or new element on pool, add to stack.
+ // Returns null if profiling has not been initialized
+ static Information* New(const string& name, clockTime& timer);
+
+ //- Remove the information from the top of the stack
+ static void unstack(const Information*);
+
+public:
+
+ // Member Functions
+
+ //- True if profiling is active
+ static bool active();
+
+ //- Write profiling information now
+ static bool writeNow();
+
+ //- The owner of the profiling
+ const Time& owner() const;
+
+ //- The size of the current stack
+ Foam::label size() const;
+
+ //- writeData member function required by regIOobject
+ virtual bool writeData(Ostream&) const;
+
+ //- Write as uncompressed ASCII, using given format
+ virtual bool writeObject
+ (
+ IOstream::streamFormat ignoreAlwaysASCII,
+ IOstream::versionNumber ver,
+ IOstream::compressionType ignoreAlwaysUncompressed
+ ) const;
+
+};
+
+
+/*---------------------------------------------------------------------------*\
+ Class profiling::Information Declaration
+\*---------------------------------------------------------------------------*/
+
+class profiling::Information
+{
+ // Private Static Data Members
+
+ //- Counter to generate the ids
+ static label nextId_;
+
+ //- get a new ID and update the counter
+ static label getNextId();
+
+ //- raise the next possible ID (to avoid ID-clashes during reading)
+ static void raiseID(label maxVal);
+
+
+ // Private Data Members
+
+ //- Unique id to identify it
+ const label id_;
+
+ //- What this timer does
+ const string description_;
+
+ //- Pointer to the parent object (or self for top-level)
+ Information* parent_;
+
+ //- Nr of times this was called
+ label calls_;
+
+ //- Total time spent
+ scalar totalTime_;
+
+ //- Time spent in children
+ scalar childTime_;
+
+ //- Max memory usage on call.
+ // Only valid when the calling profiling has memInfo active.
+ mutable int maxMem_;
+
+ //- Is this information currently on the stack?
+ mutable bool onStack_;
+
+
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ Information(const Information&) = delete;
+
+ //- Disallow default bitwise assignment
+ void operator=(const Information&) = delete;
+
+
+protected:
+
+ // Friendship
+
+ friend class profiling;
+
+
+ // Constructors
+
+ //- Construct null - only the master-element
+ Information();
+
+
+ // Member Functions
+
+ //- Mark as being on the stack
+ void push() const;
+
+ //- Mark as being off the stack
+ void pop() const;
+
+
+ //- Write the profiling times, optionally with additional values
+ // Use dictionary format.
+ Ostream& write
+ (
+ Ostream& os,
+ const bool offset = false,
+ const scalar& elapsedTime = 0,
+ const scalar& childTime = 0
+ ) const;
+
+public:
+
+
+ // Constructors
+
+ //- Construct from components
+ Information(Information* parent, const string& descr);
+
+
+ //- Destructor
+ ~Information();
+
+
+ // Member Functions
+
+ // Access
+
+ inline label id() const
+ {
+ return id_;
+ }
+
+
+ inline const string& description() const
+ {
+ return description_;
+ }
+
+
+ inline Information& parent() const
+ {
+ return *parent_;
+ }
+
+
+ inline label calls() const
+ {
+ return calls_;
+ }
+
+
+ inline const scalar& totalTime() const
+ {
+ return totalTime_;
+ }
+
+
+ inline const scalar& childTime() const
+ {
+ return childTime_;
+ }
+
+
+ inline int maxMem() const
+ {
+ return maxMem_;
+ }
+
+
+ inline bool onStack() const
+ {
+ return onStack_;
+ }
+
+
+ // Edit
+
+ //- Update it with a new timing information
+ void update(const scalar& elapsedTime);
+
+
+ // IOstream Operators
+
+ friend Ostream& operator<<(Ostream&, const Information&);
+
+};
+
+
+/*---------------------------------------------------------------------------*\
+ Class profiling::Trigger Declaration
+\*---------------------------------------------------------------------------*/
+
+class profiling::Trigger
+{
+ // Private Data Members
+
+ //- The timer for the profiling information
+ clockTime clock_;
+
+ //- The profiling information
+ Information *ptr_;
+
+
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ Trigger(const Trigger&) = delete;
+
+ //- Disallow default bitwise assignment
+ void operator=(const Trigger&) = delete;
+
+
+public:
+
+ // Constructors
+
+ //- Construct profiling with given description.
+ // Descriptions beginning with 'application::' are reserved for
+ // internal use.
+ Trigger(const char* name);
+
+ //- Construct profiling with given description.
+ // Descriptions beginning with 'application::' are reserved for
+ // internal use.
+ Trigger(const string& name);
+
+
+ //- Destructor
+ ~Trigger();
+
+
+ // Member Functions
+
+ // Access
+
+ //- True if the triggered profiling is active
+ bool running() const;
+
+
+ // Edit
+
+ //- Stop triggered profiling
+ void stop();
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Macros
+
+//- Define profiling with specified name and description string
+// This is required if the description contains space, colons etc.
+// \sa addProfiling0
+// \sa endProfiling
+#define addProfiling(name,descr) \
+ ::Foam::profiling::Trigger profilingTriggerFor##name(descr)
+
+//- Define profiling with specified name and description correspond to the name
+// \sa addProfiling
+// \sa endProfiling
+#define addProfiling0(name) \
+ ::Foam::Profiling::Trigger profilingTriggerFor##name(#name)
+
+//- Define profiling with specified name and description correspond to the
+// compiler-defined function name string:
+// \sa addProfiling
+// \sa endProfiling
+#ifdef __GNUC__
+ #define addProfilingInFunction(name) \
+ ::Foam::profiling::Trigger profilingTriggerFor##name(__PRETTY_FUNCTION__)
+#else
+ #define addProfilingInFunction(name) \
+ ::Foam::profiling::Trigger profilingTriggerFor##name(__func__)
+#endif
+
+//- Remove profiling with specified name
+// \sa addProfiling
+// \sa addProfiling0
+#define endProfiling(name) profilingTriggerFor##name.stop()
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/global/profiling/profilingSysInfo.C b/src/OpenFOAM/global/profiling/profilingSysInfo.C
new file mode 100644
index 0000000000..9b6ff2f34b
--- /dev/null
+++ b/src/OpenFOAM/global/profiling/profilingSysInfo.C
@@ -0,0 +1,94 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "profilingSysInfo.H"
+#include "demandDrivenData.H"
+#include "foamVersion.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+// file-scope function
+template
+inline static void writeEntry
+(
+ Foam::Ostream& os, const Foam::word& key, const T& value
+)
+{
+ os.writeKeyword(key) << value << Foam::token::END_STATEMENT << '\n';
+}
+
+
+// file-scope function
+inline static void printEnv
+(
+ Foam::Ostream& os, const Foam::word& key, const Foam::word& envName
+)
+{
+ const std::string value = getEnv(envName);
+ if (!value.empty())
+ {
+ writeEntry(os, key, value);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::profiling::sysInfo::sysInfo()
+{}
+
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::profiling::sysInfo::~sysInfo()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::Ostream& Foam::profiling::sysInfo::write
+(
+ Ostream& os
+) const
+{
+ writeEntry(os, "host", hostName(false)); // short name
+ writeEntry(os, "date", clock::dateTime());
+
+ // compile-time information
+ writeEntry(os, "version", std::string(FOAMversion));
+ writeEntry(os, "build", std::string(FOAMbuild));
+
+ printEnv(os, "arch", "WM_ARCH");
+ printEnv(os, "compilerType", "WM_COMPILER_TYPE");
+ printEnv(os, "compiler", "WM_COMPILER");
+ printEnv(os, "mplib", "WM_MPLIB");
+ printEnv(os, "options", "WM_OPTIONS");
+
+ return os;
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/global/profiling/profilingSysInfo.H b/src/OpenFOAM/global/profiling/profilingSysInfo.H
new file mode 100644
index 0000000000..26201fac36
--- /dev/null
+++ b/src/OpenFOAM/global/profiling/profilingSysInfo.H
@@ -0,0 +1,114 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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 OpenFOAM. If not, see .
+
+Class
+ Foam::profiling::sysInfo
+
+Description
+ General system information
+
+SourceFiles
+ profilingSysInfo.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef profilingSysInfo_H
+#define profilingSysInfo_H
+
+#include "profiling.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class Ostream;
+
+/*---------------------------------------------------------------------------*\
+ Class profiling::sysInfo Declaration
+\*---------------------------------------------------------------------------*/
+
+class profiling::sysInfo
+{
+ // Private Static Data Members
+
+
+ // Private Data Members
+
+
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ sysInfo(const sysInfo&) = delete;
+
+ //- Disallow default bitwise assignment
+ void operator=(const sysInfo&) = delete;
+
+
+protected:
+
+ // Friendship
+
+ friend class profiling;
+
+
+ // Member Functions
+
+public:
+
+
+ // Constructors
+
+ //- Construct from components
+ sysInfo();
+
+
+ //- Destructor
+ ~sysInfo();
+
+
+ // Member Functions
+
+ // Access
+
+
+ // Edit
+
+ //- Update it with a new timing information
+ void update();
+
+ //- Write the profiling sys-info, use dictionary format.
+ Ostream& write(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/include/addProfilingOption.H b/src/OpenFOAM/include/addProfilingOption.H
new file mode 100644
index 0000000000..6c2374802d
--- /dev/null
+++ b/src/OpenFOAM/include/addProfilingOption.H
@@ -0,0 +1,5 @@
+Foam::argList::addBoolOption
+(
+ "profiling",
+ "activate application-level profiling"
+);
diff --git a/src/OpenFOAM/matrices/lduMatrix/doc/lduMatrix.dox b/src/OpenFOAM/matrices/lduMatrix/doc/lduMatrix.dox
new file mode 100644
index 0000000000..12e9bd033a
--- /dev/null
+++ b/src/OpenFOAM/matrices/lduMatrix/doc/lduMatrix.dox
@@ -0,0 +1,36 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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
+ OpenFOAM. If not, see .
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+\page pageMatrixSolvers Matrix solvers
+
+\section secSchemes Overview
+The available matrix solvers are grouped into the following categories:
+ - \ref grpLduMatrix
+ - \ref grpLduMatrixPreconditioners
+ - \ref grpLduMatrixSmoothers
+ - \ref grpLduMatrixSolvers
+
+
+\*---------------------------------------------------------------------------*/
diff --git a/src/OpenFOAM/matrices/lduMatrix/doc/lduMatrixDoc.H b/src/OpenFOAM/matrices/lduMatrix/doc/lduMatrixDoc.H
new file mode 100644
index 0000000000..c9da613b45
--- /dev/null
+++ b/src/OpenFOAM/matrices/lduMatrix/doc/lduMatrixDoc.H
@@ -0,0 +1,56 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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
+ OpenFOAM. If not, see .
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+\defgroup grpNumerics Numerics
+@{
+ This group contains numerics
+@}
+
+\defgroup grpLduMatrix Matrix manipulation and solvers
+@{
+ \ingroup grpNumerics
+ This group contains matrices
+@}
+
+\defgroup grpLduMatrixPreconditioners Preconditioners
+@{
+ \ingroup grpLduMatrix
+ This group contains matrix preconditioners
+@}
+
+\defgroup grpLduMatrixSmoothers Smoothers
+@{
+ \ingroup grpLduMatrix
+ This group contains matrix smoothers
+@}
+
+\defgroup grpLduMatrixSolvers Solvers
+@{
+ \ingroup grpLduMatrix
+ This group contains matrix solvers
+@}
+
+
+\*---------------------------------------------------------------------------*/
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H
index 771317ed72..811c8fe15d 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H
+++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -59,6 +59,7 @@ SourceFiles
#include "runTimeSelectionTables.H"
#include "solverPerformance.H"
#include "InfoProxy.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -116,6 +117,7 @@ public:
//- Convergence tolerance relative to the initial
scalar relTol_;
+ profiling::Trigger profiling_;
// Protected Member Functions
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixSolver.C b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixSolver.C
index 1f6bd82d11..bbd5969082 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixSolver.C
+++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixSolver.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -147,7 +147,8 @@ Foam::lduMatrix::solver::solver
interfaceBouCoeffs_(interfaceBouCoeffs),
interfaceIntCoeffs_(interfaceIntCoeffs),
interfaces_(interfaces),
- controlDict_(solverControls)
+ controlDict_(solverControls),
+ profiling_("lduMatrix::solver." + fieldName)
{
readControls();
}
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/smoothSolver/smoothSolver.C b/src/OpenFOAM/matrices/lduMatrix/solvers/smoothSolver/smoothSolver.C
index 1fa2ee70cf..31eb37add3 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/smoothSolver/smoothSolver.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/smoothSolver/smoothSolver.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -24,6 +24,7 @@ License
\*---------------------------------------------------------------------------*/
#include "smoothSolver.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@@ -87,6 +88,8 @@ Foam::solverPerformance Foam::smoothSolver::solve
// If the nSweeps_ is negative do a fixed number of sweeps
if (nSweeps_ < 0)
{
+ addProfiling(solve, "lduMatrix::smoother." + fieldName_);
+
autoPtr smootherPtr = lduMatrix::smoother::New
(
fieldName_,
@@ -144,6 +147,8 @@ Foam::solverPerformance Foam::smoothSolver::solve
|| !solverPerf.checkConvergence(tolerance_, relTol_)
)
{
+ addProfiling(solve, "lduMatrix::smoother." + fieldName_);
+
autoPtr smootherPtr = lduMatrix::smoother::New
(
fieldName_,
diff --git a/src/TurbulenceModels/turbulenceModels/doc/turbulenceModel.dox b/src/TurbulenceModels/turbulenceModels/doc/turbulenceModel.dox
new file mode 100644
index 0000000000..4aa49fd43a
--- /dev/null
+++ b/src/TurbulenceModels/turbulenceModels/doc/turbulenceModel.dox
@@ -0,0 +1,36 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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
+ OpenFOAM. If not, see .
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+\page pageTurbulenceModelling Turbulence modelling
+
+\section secSchemes Overview
+The available turbulence models are grouped into the following categories:
+ - \ref grpTurbulence
+ - \ref grpRASTurbulence
+ - \ref grpDESTurbulence
+ - \ref grpLESTurbulence
+
+
+\*---------------------------------------------------------------------------*/
diff --git a/src/finiteVolume/cfdTools/general/fvOptions/fvOptionListTemplates.C b/src/finiteVolume/cfdTools/general/fvOptions/fvOptionListTemplates.C
index 8b9c65856c..19e0f1a7b4 100644
--- a/src/finiteVolume/cfdTools/general/fvOptions/fvOptionListTemplates.C
+++ b/src/finiteVolume/cfdTools/general/fvOptions/fvOptionListTemplates.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -23,6 +23,8 @@ License
\*---------------------------------------------------------------------------*/
+#include "profiling.H"
+
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template
@@ -57,6 +59,8 @@ Foam::tmp> Foam::fv::optionList::operator()
if (fieldI != -1)
{
+ addProfiling(fvopt, "fvOption()." + source.name());
+
source.setApplied(fieldI);
if (source.isActive())
@@ -113,6 +117,8 @@ Foam::tmp> Foam::fv::optionList::operator()
if (fieldI != -1)
{
+ addProfiling(fvopt, "fvOption()." + source.name());
+
source.setApplied(fieldI);
if (source.isActive())
@@ -172,6 +178,8 @@ Foam::tmp> Foam::fv::optionList::operator()
if (fieldI != -1)
{
+ addProfiling(fvopt, "fvOption()." + source.name());
+
source.setApplied(fieldI);
if (source.isActive())
@@ -255,6 +263,8 @@ void Foam::fv::optionList::constrain(fvMatrix& eqn)
if (fieldI != -1)
{
+ addProfiling(fvopt, "fvOption::constrain." + eqn.psi().name());
+
source.setApplied(fieldI);
if (source.isActive())
@@ -288,6 +298,8 @@ void Foam::fv::optionList::correct
if (fieldI != -1)
{
+ addProfiling(fvopt, "fvOption::correct." + source.name());
+
source.setApplied(fieldI);
if (source.isActive())
diff --git a/src/finiteVolume/finiteVolume/doc/finiteVolumeSchemes.dox b/src/finiteVolume/finiteVolume/doc/finiteVolumeSchemes.dox
new file mode 100644
index 0000000000..fe019b8850
--- /dev/null
+++ b/src/finiteVolume/finiteVolume/doc/finiteVolumeSchemes.dox
@@ -0,0 +1,40 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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
+ OpenFOAM. If not, see .
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+\page pageFiniteVolumeSchemes Numerical schemes
+
+\section secSchemes Overview
+The available numerical schemes are grouped into the following categories:
+ - \ref grpFvGradSchemes
+ - \ref grpFvSnGradSchemes
+ - \ref grpFvDivSchemes
+ - \ref grpFvLaplacianSchemes
+ - \ref grpFvDdtSchemes
+ - \ref grpFvConvectionSchemes
+ - \ref grpFvSurfaceInterpolationSchemes
+ - \ref grpFvLimitedSurfaceInterpolationSchemes
+
+
+\*---------------------------------------------------------------------------*/
diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
index 26dab20b75..df56d919bd 100644
--- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
+++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -25,6 +25,7 @@ License
#include "LduMatrix.H"
#include "diagTensorField.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@@ -58,6 +59,8 @@ Foam::SolverPerformance Foam::fvMatrix::solve
const dictionary& solverControls
)
{
+ addProfiling(solve, "fvMatrix::solve." + psi_.name());
+
if (debug)
{
Info.masterStream(this->mesh().comm())
diff --git a/src/finiteVolume/fvMatrices/fvScalarMatrix/fvScalarMatrix.C b/src/finiteVolume/fvMatrices/fvScalarMatrix/fvScalarMatrix.C
index 46fa555289..5cec763e31 100644
--- a/src/finiteVolume/fvMatrices/fvScalarMatrix/fvScalarMatrix.C
+++ b/src/finiteVolume/fvMatrices/fvScalarMatrix/fvScalarMatrix.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -25,6 +25,7 @@ License
#include "fvScalarMatrix.H"
#include "extrapolatedCalculatedFvPatchFields.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@@ -59,6 +60,8 @@ Foam::fvMatrix::solver
const dictionary& solverControls
)
{
+ addProfiling(solve, "fvMatrix::solve." + psi_.name());
+
if (debug)
{
Info.masterStream(this->mesh().comm())
diff --git a/src/finiteVolume/fvMatrices/solvers/MULES/IMULES.C b/src/finiteVolume/fvMatrices/solvers/MULES/IMULES.C
index 2bc88decb5..62bda3abcb 100644
--- a/src/finiteVolume/fvMatrices/solvers/MULES/IMULES.C
+++ b/src/finiteVolume/fvMatrices/solvers/MULES/IMULES.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -24,6 +24,7 @@ License
\*---------------------------------------------------------------------------*/
#include "IMULES.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -36,6 +37,8 @@ void Foam::MULES::implicitSolve
const scalar psiMin
)
{
+ addProfiling(solve, "MULES::implicitSolve");
+
implicitSolve
(
geometricOneField(),
diff --git a/src/finiteVolume/fvMatrices/solvers/MULES/IMULESTemplates.C b/src/finiteVolume/fvMatrices/solvers/MULES/IMULESTemplates.C
index 4cc8cd128c..37a730db9b 100644
--- a/src/finiteVolume/fvMatrices/solvers/MULES/IMULESTemplates.C
+++ b/src/finiteVolume/fvMatrices/solvers/MULES/IMULESTemplates.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -29,6 +29,7 @@ License
#include "fvmDdt.H"
#include "fvmSup.H"
#include "fvcDiv.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -65,6 +66,8 @@ void Foam::MULES::implicitSolve
const scalar psiMin
)
{
+ addProfiling(solve, "MULES::implicitSolve");
+
const fvMesh& mesh = psi.mesh();
const dictionary& MULEScontrols = mesh.solverDict(psi.name());
diff --git a/src/finiteVolume/fvMatrices/solvers/MULES/MULES.C b/src/finiteVolume/fvMatrices/solvers/MULES/MULES.C
index f9fb29f17e..97ade8ef3e 100644
--- a/src/finiteVolume/fvMatrices/solvers/MULES/MULES.C
+++ b/src/finiteVolume/fvMatrices/solvers/MULES/MULES.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -24,6 +24,7 @@ License
\*---------------------------------------------------------------------------*/
#include "MULES.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -36,6 +37,8 @@ void Foam::MULES::explicitSolve
const scalar psiMin
)
{
+ addProfiling(solve, "MULES::explicitSolve");
+
explicitSolve
(
geometricOneField(),
diff --git a/src/fvOptions/doc/fvOptionsDoc.H b/src/fvOptions/doc/fvOptionsDoc.H
new file mode 100644
index 0000000000..574618b612
--- /dev/null
+++ b/src/fvOptions/doc/fvOptionsDoc.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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
+ OpenFOAM. If not, see .
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+\defgroup grpFvOptions Finite volume Options
+@{
+ \ingroup grpNumerics
+ This group contains finite volume options
+@}
+
+\defgroup grpFvOptionsSources Sources
+@{
+ \ingroup grpFvOptions
+ This group contains finite volume sources
+@}
+
+\defgroup grpFvOptionsCorrections Corrections
+@{
+ \ingroup grpFvOptions
+ This group contains finite volume corrections
+@}
+
+\defgroup grpFvOptionsConstraints Constraints
+@{
+ \ingroup grpFvOptions
+ This group contains finite volume constraints
+@}
+
+
+\*---------------------------------------------------------------------------*/
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index aa72f933dc..dff1907178 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation |
+ \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -33,6 +33,7 @@ License
#include "PatchInteractionModel.H"
#include "StochasticCollisionModel.H"
#include "SurfaceFilmModel.H"
+#include "profiling.H"
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
@@ -90,6 +91,8 @@ template
template
void Foam::KinematicCloud::solve(TrackData& td)
{
+ addProfiling(prof, "cloud::solve");
+
if (solution_.steadyState())
{
td.cloud().storeState();
diff --git a/src/lagrangian/intermediate/doc/lagrangianIntermediate.dox b/src/lagrangian/intermediate/doc/lagrangianIntermediate.dox
new file mode 100644
index 0000000000..a314c0c60b
--- /dev/null
+++ b/src/lagrangian/intermediate/doc/lagrangianIntermediate.dox
@@ -0,0 +1,41 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM 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.
+
+ OpenFOAM 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
+ OpenFOAM. If not, see .
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+\page pageLagrangianIntermediate Lagrangian modelling
+
+\section secSchemes Overview
+The available Lagrangian models are grouped into the following categories:
+ - \ref grpLagrangianIntermediateClouds
+ - \ref grpLagrangianIntermediateParcels
+ - \ref grpLagrangianIntermediateSubModels
+ - \ref grpLagrangianIntermediateKinematicSubModels
+ - \ref grpLagrangianIntermediateThermoSubModels
+ - \ref grpLagrangianIntermediateReactingSubModels
+ - \ref grpLagrangianIntermediateReactingMultiphaseSubModels
+ - \ref grpLagrangianIntermediateMPPICSubModels
+ - \ref grpLagrangianIntermediateFunctionObjects
+
+
+\*---------------------------------------------------------------------------*/
diff --git a/src/lagrangian/intermediate/doc/finiteVolumeSchemesDoc.H b/src/lagrangian/intermediate/doc/lagrangianIntermediateDoc.H
similarity index 100%
rename from src/lagrangian/intermediate/doc/finiteVolumeSchemesDoc.H
rename to src/lagrangian/intermediate/doc/lagrangianIntermediateDoc.H
diff --git a/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyLayerDriver.C b/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyLayerDriver.C
index cfbb7c3de8..154526895d 100644
--- a/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyLayerDriver.C
+++ b/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyLayerDriver.C
@@ -57,6 +57,7 @@ Description
#include "localPointRegion.H"
#include "externalDisplacementMeshMover.H"
#include "scalarIOField.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@@ -3399,6 +3400,7 @@ void Foam::snappyLayerDriver::addLayers
// extrudeStatus
//);
+ addProfiling(grow, "snappyHexMesh::layers::grow");
// Grow out region of non-extrusion
for (label i = 0; i < layerParams.nGrow(); i++)
@@ -3749,7 +3751,10 @@ void Foam::snappyLayerDriver::addLayers
);
fvMesh& newMesh = newMeshPtr();
- //?neccesary? Update fields
+ // get timing, but more importantly get memory information
+ addProfiling(grow, "snappyHexMesh::layers::updateMesh");
+
+ //?necessary? Update fields
newMesh.updateMesh(map);
newMesh.setInstance(meshRefiner_.timeName());
@@ -4219,6 +4224,7 @@ void Foam::snappyLayerDriver::doLayers
fvMeshDistribute& distributor
)
{
+ addProfiling(layers, "snappyHexMesh::layers");
const fvMesh& mesh = meshRefiner_.mesh();
Info<< nl
diff --git a/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyRefineDriver.C b/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyRefineDriver.C
index d5e45f3d47..b3ff9dff0a 100644
--- a/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyRefineDriver.C
+++ b/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyRefineDriver.C
@@ -39,6 +39,7 @@ License
#include "localPointRegion.H"
#include "IOmanip.H"
#include "labelVector.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@@ -79,6 +80,7 @@ Foam::label Foam::snappyRefineDriver::featureEdgeRefine
const label minRefine
)
{
+ addProfiling(edge, "snappyHexMesh::refine::edge");
const fvMesh& mesh = meshRefiner_.mesh();
label iter = 0;
@@ -188,6 +190,7 @@ Foam::label Foam::snappyRefineDriver::smallFeatureRefine
const label maxIter
)
{
+ addProfiling(feature, "snappyHexMesh::refine::smallFeature");
const fvMesh& mesh = meshRefiner_.mesh();
@@ -310,6 +313,7 @@ Foam::label Foam::snappyRefineDriver::surfaceOnlyRefine
const label maxIter
)
{
+ addProfiling(surface, "snappyHexMesh::refine::surface");
const fvMesh& mesh = meshRefiner_.mesh();
// Determine the maximum refinement level over all surfaces. This
@@ -807,6 +811,7 @@ Foam::label Foam::snappyRefineDriver::danglingCellRefine
const label maxIter
)
{
+ addProfiling(dangling, "snappyHexMesh::refine::danglingCell");
const fvMesh& mesh = meshRefiner_.mesh();
label iter;
@@ -952,6 +957,7 @@ Foam::label Foam::snappyRefineDriver::refinementInterfaceRefine
const label maxIter
)
{
+ addProfiling(interface, "snappyHexMesh::refine::transition");
const fvMesh& mesh = meshRefiner_.mesh();
label iter = 0;
@@ -1342,6 +1348,7 @@ Foam::label Foam::snappyRefineDriver::shellRefine
const label maxIter
)
{
+ addProfiling(shell, "snappyHexMesh::refine::shell");
const fvMesh& mesh = meshRefiner_.mesh();
// Mark current boundary faces with 0. Have meshRefiner maintain them.
@@ -1517,6 +1524,7 @@ void Foam::snappyRefineDriver::baffleAndSplitMesh
const dictionary& motionDict
)
{
+ addProfiling(split, "snappyHexMesh::refine::splitting");
Info<< nl
<< "Splitting mesh at surface intersections" << nl
<< "---------------------------------------" << nl
@@ -1841,6 +1849,7 @@ void Foam::snappyRefineDriver::mergePatchFaces
const dictionary& motionDict
)
{
+ addProfiling(merge, "snappyHexMesh::refine::merge");
Info<< nl
<< "Merge refined boundary faces" << nl
<< "----------------------------" << nl
@@ -1895,6 +1904,7 @@ void Foam::snappyRefineDriver::doRefine
const dictionary& motionDict
)
{
+ addProfiling(refine, "snappyHexMesh::refine");
Info<< nl
<< "Refinement phase" << nl
<< "----------------" << nl
diff --git a/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappySnapDriver.C b/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappySnapDriver.C
index 95178d2881..d429f77b6b 100644
--- a/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappySnapDriver.C
+++ b/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappySnapDriver.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
- \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -45,6 +45,7 @@ Description
#include "localPointRegion.H"
#include "PatchTools.H"
#include "refinementFeatures.H"
+#include "profiling.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@@ -832,6 +833,7 @@ void Foam::snappySnapDriver::preSmoothPatch
motionSmoother& meshMover
)
{
+ addProfiling(smooth, "snappyHexMesh::snap::smoothing");
const fvMesh& mesh = meshRefiner.mesh();
labelList checkFaces;
@@ -2168,6 +2170,7 @@ bool Foam::snappySnapDriver::scaleMesh
motionSmoother& meshMover
)
{
+ addProfiling(scale, "snappyHexMesh::snap::scale");
const fvMesh& mesh = meshRefiner_.mesh();
// Relax displacement until correct mesh
@@ -2534,6 +2537,7 @@ void Foam::snappySnapDriver::doSnap
const snapParameters& snapParams
)
{
+ addProfiling(snap, "snappyHexMesh::snap");
fvMesh& mesh = meshRefiner_.mesh();
Info<< nl
diff --git a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C
index b6b133b68e..5d9153c65b 100644
--- a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C
+++ b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -1062,7 +1062,7 @@ void Foam::AMIInterpolation::update
);
// weights normalisation
- normaliseWeights(AMIPtr->conformal(), true);
+ AMIPtr->normaliseWeights(true, *this);
// cache maps and reset addresses
List