diff --git a/applications/solvers/incompressible/adjointOptimisationFoam/adjointOptimisationFoam.C b/applications/solvers/incompressible/adjointOptimisationFoam/adjointOptimisationFoam.C
index 44f5ef61ab..3ba1833051 100644
--- a/applications/solvers/incompressible/adjointOptimisationFoam/adjointOptimisationFoam.C
+++ b/applications/solvers/incompressible/adjointOptimisationFoam/adjointOptimisationFoam.C
@@ -55,10 +55,6 @@ int main(int argc, char *argv[])
for (om++; !om.end(); om++)
{
- Info<< "* * * * * * * * * * * * * * * * * * *" << endl;
- Info<< "Time = " << runTime.timeName() << endl;
- Info<< "* * * * * * * * * * * * * * * * * * *" << endl;
-
if (om.update())
{
// Update design variables and solve all primal equations
diff --git a/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/Make/files b/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/Make/files
new file mode 100644
index 0000000000..d3bd51a25a
--- /dev/null
+++ b/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/Make/files
@@ -0,0 +1,3 @@
+cumulativeDisplacement.C
+
+EXE = $(FOAM_APPBIN)/cumulativeDisplacement
diff --git a/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/Make/options b/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/Make/options
new file mode 100644
index 0000000000..7e96f0b932
--- /dev/null
+++ b/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/Make/options
@@ -0,0 +1,11 @@
+EXE_INC = \
+ -I$(LIB_SRC)/dynamicMesh/dynamicFvMesh/lnInclude \
+ -I$(LIB_SRC)/dynamicMesh/dynamicMesh/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/lnInclude
+
+EXE_LIBS = \
+ -ldynamicFvMesh \
+ -ldynamicMesh \
+ -lmeshTools \
+ -lfiniteVolume
diff --git a/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/createFields.H b/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/createFields.H
new file mode 100644
index 0000000000..0fee3dd334
--- /dev/null
+++ b/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/createFields.H
@@ -0,0 +1,16 @@
+ pointField points0
+ (
+ pointIOField
+ (
+ IOobject
+ (
+ "points",
+ mesh.time().constant(),
+ polyMesh::meshSubDir,
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::NO_WRITE,
+ false
+ )
+ )
+ );
diff --git a/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/cumulativeDisplacement.C b/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/cumulativeDisplacement.C
new file mode 100644
index 0000000000..703c8c40fe
--- /dev/null
+++ b/applications/utilities/postProcessing/optimisation/cumulativeDisplacement/cumulativeDisplacement.C
@@ -0,0 +1,161 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | www.openfoam.com
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+ Copyright (C) 2007-2019 PCOpt/NTUA
+ Copyright (C) 2013-2019 FOSS GP
+ Copyright (C) 2019 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 .
+
+Application
+ cumulativeDisplacement
+
+Description
+ Computes and writes the difference between the mesh points in each time
+ instance and the ones in the constant folder. Additionally, the projection
+ of this difference to the normal point vectors of the initial mesh is also
+ written
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "emptyFvPatch.H"
+#include "coupledFvPatch.H"
+#include "pointMesh.H"
+#include "pointPatchField.H"
+#include "pointPatchFieldsFwd.H"
+#include "syncTools.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+ timeSelector::addOptions();
+
+ #include "addRegionOption.H"
+
+ #include "setRootCase.H"
+ #include "createTime.H"
+ instantList timeDirs = timeSelector::select0(runTime, args);
+ #include "createNamedMesh.H"
+ #include "createFields.H"
+
+ // polyPatch::pointNormals will give the wrong result for points
+ // belonging to multiple patches or patch-processorPatch intersections.
+ // Keeping a mesh-wide field to allow easy reduction using syncTools.
+ // A bit expensive? Better way?
+ vectorField pointNormals(mesh.nPoints(), vector::zero);
+ for (const fvPatch& patch : mesh.boundary())
+ {
+ // Each local patch point belongs to these local patch faces.
+ // Local numbering
+ const labelListList& patchPointFaces = patch.patch().pointFaces();
+ if (!isA(patch) && !isA(patch))
+ {
+ const labelList& meshPoints = patch.patch().meshPoints();
+ const vectorField nf(patch.nf());
+ forAll(meshPoints, ppI)
+ {
+ const labelList& pointFaces = patchPointFaces[ppI];
+ forAll(pointFaces, pfI)
+ {
+ const label& localFaceIndex = pointFaces[pfI];
+ pointNormals[meshPoints[ppI]] += nf[localFaceIndex];
+ }
+ }
+ }
+ }
+ // Sum from all processors
+ syncTools::syncPointList
+ (
+ mesh, pointNormals, plusEqOp(), vector::zero
+ );
+ pointNormals /= mag(pointNormals) + VSMALL;
+
+ forAll(timeDirs, timeI)
+ {
+ runTime.setTime(timeDirs[timeI], timeI);
+ Info<< "Time = " << runTime.timeName() << endl;
+ mesh.readUpdate();
+
+ const pointMesh& pMesh(pointMesh::New(mesh));
+ // Point displacement projected to the
+ // unit point normal of the initial geometry
+ pointScalarField normalDisplacement
+ (
+ IOobject
+ (
+ "normalDisplacement",
+ runTime.timeName(),
+ mesh,
+ IOobject::NO_READ,
+ IOobject::AUTO_WRITE
+ ),
+ pMesh,
+ dimensionedScalar(dimless, Zero)
+ );
+ // Point displacement as a vector
+ pointVectorField displacement
+ (
+ IOobject
+ (
+ "displacement",
+ runTime.timeName(),
+ mesh,
+ IOobject::NO_READ,
+ IOobject::AUTO_WRITE
+ ),
+ pMesh,
+ dimensionedVector(dimless, Zero)
+ );
+
+ Info<< "Calculating cumulative mesh movement for time "
+ << runTime.timeName() << endl;
+ // Normal displacement
+ const pointField& meshPoints = mesh.points();
+ forAll(mesh.boundary(), pI)
+ {
+ const polyPatch& patch = mesh.boundaryMesh()[pI];
+ const labelList& localPoints = patch.meshPoints();
+ forAll(localPoints, ppI)
+ {
+ label pointI = localPoints[ppI];
+ normalDisplacement[pointI] =
+ (meshPoints[pointI] - points0[pointI])
+ & pointNormals[pointI];
+ }
+ }
+ normalDisplacement.write();
+ // Vectorial displacement
+ displacement.primitiveFieldRef() = meshPoints - points0;
+ displacement.write();
+ }
+
+ // Print execution time
+ mesh.time().printExecutionTime(Info);
+
+ Info<< "End\n" << endl;
+
+ return(0);
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/Make/files b/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/Make/files
new file mode 100644
index 0000000000..c6e8c8fb9d
--- /dev/null
+++ b/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/Make/files
@@ -0,0 +1,3 @@
+writeActiveDesignVariables.C
+
+EXE = $(FOAM_APPBIN)/writeActiveDesignVariables
diff --git a/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/Make/options b/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/Make/options
new file mode 100644
index 0000000000..f5b51c5ca7
--- /dev/null
+++ b/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/Make/options
@@ -0,0 +1,14 @@
+EXE_INC = \
+ -I$(LIB_SRC)/finiteVolume/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/cfdTools \
+ -I$(LIB_SRC)/dynamicMesh/lnInclude \
+ -I$(LIB_SRC)/optimisation/adjointOptimisation/adjoint/lnInclude
+
+EXE_LIBS = \
+ -lfiniteVolume \
+ -lmeshTools \
+ -lfvOptions \
+ -ldynamicMesh \
+ -lfvMotionSolvers \
+ -ladjointOptimisation
diff --git a/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/writeActiveDesignVariables.C b/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/writeActiveDesignVariables.C
new file mode 100644
index 0000000000..753130420a
--- /dev/null
+++ b/applications/utilities/preProcessing/optimisation/writeActiveDesignVariables/writeActiveDesignVariables.C
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | www.openfoam.com
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+ Copyright (C) 2007-2019 PCOpt/NTUA
+ Copyright (C) 2013-2019 FOSS GP
+ Copyright (C) 2019 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 .
+
+Application
+ writeActiveDesignVariables
+
+Description
+ Writes the active design variables based on the selected parameterisation
+ scheme, as read from the meshMovement part of optimisationDict.
+ Keeps a back-up of the original optimisationDict in
+ system/optimisationDict.org, as comments in the dict will be lost.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "optMeshMovement.H"
+#include "updateMethod.H"
+#include "OFstream.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+ #include "setRootCase.H"
+ #include "createTime.H"
+ #include "createMesh.H"
+
+ IOdictionary optDict
+ (
+ IOobject
+ (
+ "optimisationDict",
+ mesh.time().caseSystem(),
+ mesh,
+ IOobject::MUST_READ_IF_MODIFIED,
+ IOobject::NO_WRITE
+ )
+ );
+
+ // Back-up old optimisationDict, to maintain potential comments in it
+ if (Pstream::master())
+ {
+ cp(optDict.objectPath(), optDict.objectPath() + ".org");
+ }
+
+ // Construct mesh movement object and grab active design variables
+ // Will exit with error if not implemented for this type
+ const dictionary& movementDict =
+ optDict.subDict("optimisation").subDict("meshMovement");
+ // Empty patch list will do
+ labelList patchIDs(0);
+ autoPtr movementPtr
+ (optMeshMovement::New(mesh, movementDict, patchIDs));
+ const labelList activeDesignVariables =
+ movementPtr().getActiveDesignVariables();
+
+ // Construct update method to grab the type
+ dictionary& updateMethodDict =
+ optDict.subDict("optimisation").subDict("updateMethod");
+ autoPtr updMethod(updateMethod::New(mesh, updateMethodDict));
+
+ // Add to appropriate dictionary (creates it if it does not exist)
+ dictionary& coeffsDict = updateMethodDict.subDictOrAdd(updMethod().type());
+ coeffsDict.add
+ (
+ "activeDesignVariables",
+ activeDesignVariables,
+ true
+ );
+
+ // Write modified dictionary
+ optDict.regIOobject::writeObject
+ (
+ IOstream::ASCII,
+ IOstream::currentVersion,
+ IOstream::UNCOMPRESSED,
+ true
+ );
+
+ Info<< "End\n" << endl;
+
+ return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/preProcessing/optimisation/writeMorpherCPs/Make/files b/applications/utilities/preProcessing/optimisation/writeMorpherCPs/Make/files
new file mode 100644
index 0000000000..335b32e0e3
--- /dev/null
+++ b/applications/utilities/preProcessing/optimisation/writeMorpherCPs/Make/files
@@ -0,0 +1,3 @@
+writeMorpherCPs.C
+
+EXE = $(FOAM_APPBIN)/writeMorpherCPs
diff --git a/applications/utilities/preProcessing/optimisation/writeMorpherCPs/Make/options b/applications/utilities/preProcessing/optimisation/writeMorpherCPs/Make/options
new file mode 100644
index 0000000000..b434e5669b
--- /dev/null
+++ b/applications/utilities/preProcessing/optimisation/writeMorpherCPs/Make/options
@@ -0,0 +1,13 @@
+EXE_INC = \
+ -I$(LIB_SRC)/finiteVolume/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/cfdTools \
+ -I$(LIB_SRC)/optimisation/adjointOptimisation/adjoint/lnInclude
+
+EXE_LIBS = \
+ -lfiniteVolume \
+ -lmeshTools \
+ -lfvOptions \
+ -ldynamicMesh \
+ -lfvMotionSolvers \
+ -ladjointOptimisation
diff --git a/applications/utilities/preProcessing/optimisation/writeMorpherCPs/writeMorpherCPs.C b/applications/utilities/preProcessing/optimisation/writeMorpherCPs/writeMorpherCPs.C
new file mode 100644
index 0000000000..2b70f30568
--- /dev/null
+++ b/applications/utilities/preProcessing/optimisation/writeMorpherCPs/writeMorpherCPs.C
@@ -0,0 +1,83 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | www.openfoam.com
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+ Copyright (C) 2007-2019 PCOpt/NTUA
+ Copyright (C) 2013-2019 FOSS GP
+ Copyright (C) 2019 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 .
+
+Application
+ writeMorpherCPs
+
+Description
+ Writes the NURBS3DVolume control points corresponding to dynamicMeshDict
+ to csv files. Parametric coordinates are not computed.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "NURBS3DVolume.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+ #include "setRootCase.H"
+ #include "createTime.H"
+ #include "createMesh.H"
+
+ IOdictionary dict
+ (
+ IOobject
+ (
+ "dynamicMeshDict",
+ mesh.time().constant(),
+ mesh,
+ IOobject::MUST_READ_IF_MODIFIED,
+ IOobject::NO_WRITE
+ )
+ );
+
+ const dictionary& coeffDict =
+ dict.subDict("volumetricBSplinesMotionSolverCoeffs");
+
+ wordList controlBoxes(coeffDict.get("controlBoxes"));
+
+ forAll(controlBoxes, iNURB)
+ {
+ // Creating an object writes the control points in the
+ // constructor
+ NURBS3DVolume::New
+ (
+ coeffDict.subDict(controlBoxes[iNURB]),
+ mesh,
+ false // do not compute parametric coordinates
+ );
+ }
+
+ Info<< "End\n" << endl;
+
+ return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/ATCModel/zeroATCcells/pointCells/pointCells.C b/src/optimisation/adjointOptimisation/adjoint/ATCModel/zeroATCcells/pointCells/pointCells.C
index 17db910b4c..b46ae6c328 100644
--- a/src/optimisation/adjointOptimisation/adjoint/ATCModel/zeroATCcells/pointCells/pointCells.C
+++ b/src/optimisation/adjointOptimisation/adjoint/ATCModel/zeroATCcells/pointCells/pointCells.C
@@ -52,6 +52,9 @@ pointCells::pointCells
:
zeroATCcells(mesh, dict)
{
+ boolList isZeroed(mesh_.nCells(), false);
+ labelList zeroedIDs(mesh_.nCells(), -1);
+ label i(0);
forAll(mesh_.boundary(), patchI)
{
const fvPatch& patch = mesh_.boundary()[patchI];
@@ -65,7 +68,14 @@ pointCells::pointCells
for (const label pointI : meshPoints)
{
const labelList& pointCells = mesh_.pointCells()[pointI];
- zeroATCcells_.append(pointCells);
+ for (const label cellI : pointCells)
+ {
+ if (!isZeroed[cellI])
+ {
+ zeroedIDs[i++] = cellI;
+ isZeroed[cellI] = true;
+ }
+ }
}
}
}
@@ -76,14 +86,22 @@ pointCells::pointCells
if (zoneID != -1)
{
const labelList& zoneCells = mesh_.cellZones()[zoneID];
- zeroATCcells_.append(zoneCells);
+ for (const label cellI : zoneCells)
+ {
+ if (!isZeroed[cellI])
+ {
+ zeroedIDs[i++] = cellI;
+ isZeroed[cellI] = true;
+ }
+ }
}
}
- /*
+ zeroedIDs.setSize(i);
+ zeroATCcells_ = zeroedIDs;
+
label size = zeroATCcells_.size();
reduce(size, sumOp