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