sensitivityBezierIncompressible.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2007-2019 PCOpt/NTUA
9  Copyright (C) 2013-2019 FOSS GP
10  Copyright (C) 2019 OpenCFD Ltd.
11 -------------------------------------------------------------------------------
12 License
13  This file is part of OpenFOAM.
14 
15  OpenFOAM is free software: you can redistribute it and/or modify it
16  under the terms of the GNU General Public License as published by
17  the Free Software Foundation, either version 3 of the License, or
18  (at your option) any later version.
19 
20  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
21  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
22  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23  for more details.
24 
25  You should have received a copy of the GNU General Public License
26  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
27 
28 \*---------------------------------------------------------------------------*/
29 
32 #include "IOmanip.H"
33 
34 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
35 
36 namespace Foam
37 {
38 
39 namespace incompressible
40 {
41 
42 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
43 
44 defineTypeNameAndDebug(sensitivityBezier, 0);
46 (
47  adjointSensitivity,
48  sensitivityBezier,
49  dictionary
50 );
51 
52 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
53 
54 sensitivityBezier::sensitivityBezier
55 (
56  const fvMesh& mesh,
57  const dictionary& dict,
58  incompressibleVars& primalVars,
59  incompressibleAdjointVars& adjointVars,
62 )
63 :
64  SIBase
65  (
66  mesh,
67  dict,
68  primalVars,
69  adjointVars,
72  ),
73  //Bezier_(mesh, dict), // AJH Read locally?
74  Bezier_(mesh, mesh.lookupObject<IOdictionary>("optimisationDict")),
75  sens_(Bezier_.nBezier(), Zero),
76  flowSens_(Bezier_.nBezier(), Zero),
77  dSdbSens_(Bezier_.nBezier(), Zero),
78  dndbSens_(Bezier_.nBezier(), Zero),
79  dxdbDirectSens_(Bezier_.nBezier(), Zero),
80  derivativesFolder_("optimisation"/type() + "Derivatives")
81 {
82  derivatives_ = scalarField(3*Bezier_.nBezier(), Zero);
83  // Create folder to store sensitivities
84  mkDir(derivativesFolder_);
85 }
86 
87 
88 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
89 
91 {
92  // Assemble the sensitivity map
93  // Solves for the post-processing equations and adds their contribution to
94  // the sensitivity map
96 
97  forAll(sens_, iCP)
98  {
99  // Face-based summation. More robust since the result is independent of
100  // the number of processors (does not hold for a point-based summation)
101  for (const label patchI : sensitivityPatchIDs_)
102  {
103  // Interpolate parameterization info to faces
104  tmp<tensorField> tdxidXj = Bezier_.dxdbFace(patchI, iCP);
105  const tensorField& dxidXj = tdxidXj();
106 
107  // Patch sensitivity map
108  const vectorField& patchSensMap =
109  surfaceSensitivity_.getWallFaceSensVecBoundary()[patchI];
110  flowSens_[iCP] += gSum(patchSensMap & dxidXj);
111 
112  if (includeObjective_)
113  {
114  // Contribution from objective function
115  // term from delta( n dS ) / delta b and
116  // term from delta( n ) / delta b
117  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118  tmp<tensorField> tdSdb
119  (
120  Bezier_.dndbBasedSensitivities(patchI, iCP)
121  );
122  const tensorField& dSdb = tdSdb();
123  dSdbSens_[iCP] += gSum(dSfdbMult_()[patchI] & dSdb);
124 
125  tmp<tensorField> tdndb
126  (
127  Bezier_.dndbBasedSensitivities(patchI, iCP, false)
128  );
129  const tensorField& dndb = tdndb();
130  dndbSens_[iCP] += gSum((dnfdbMult_()[patchI] & dndb));
131 
132  // Contribution from objective function
133  // term from delta( x ) / delta b
134  // Only for objectives directly including
135  // x, like moments
136  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
137  dxdbDirectSens_[iCP] +=
138  gSum((dxdbDirectMult_()[patchI] & dxidXj));
139  }
140  }
141  }
143 
144  // Transform sensitivities to scalarField in order to cooperate with
145  // updateMethod
146  label nBezier = Bezier_.nBezier();
147  forAll(sens_, cpI)
148  {
149  derivatives_[cpI] = sens_[cpI].x();
150  derivatives_[cpI + nBezier] = sens_[cpI].y();
151  derivatives_[cpI + 2*nBezier] = sens_[cpI].z();
152  const boolList& confineXmovement = Bezier_.confineXmovement();
153  const boolList& confineYmovement = Bezier_.confineYmovement();
154  const boolList& confineZmovement = Bezier_.confineZmovement();
155  if (confineXmovement[cpI])
156  {
157  derivatives_[cpI] *= scalar(0);
158  flowSens_[cpI].x() = Zero;
159  dSdbSens_[cpI].x() = Zero;
160  dndbSens_[cpI].x() = Zero;
161  dxdbDirectSens_[cpI].x() = Zero;
162  }
163  if (confineYmovement[cpI])
164  {
165  derivatives_[cpI + nBezier] *= scalar(0);
166  flowSens_[cpI].y() = Zero;
167  dSdbSens_[cpI].y() = Zero;
168  dndbSens_[cpI].y() = Zero;
169  dxdbDirectSens_[cpI].y() = Zero;
170  }
171  if (confineZmovement[cpI])
172  {
173  derivatives_[cpI + 2*nBezier] *= scalar(0);
174  flowSens_[cpI].z() = Zero;
175  dSdbSens_[cpI].z() = Zero;
176  dndbSens_[cpI].z() = Zero;
177  dxdbDirectSens_[cpI].z() = Zero;
178  }
179  }
180 }
181 
182 
184 {
185  sens_ = Zero;
186  flowSens_ = Zero;
187  dSdbSens_ = Zero;
188  dndbSens_ = Zero;
190 
192 }
193 
194 
195 void sensitivityBezier::write(const word& baseName)
196 {
197  Info<< "Writing control point sensitivities to file" << endl;
198  if (Pstream::master())
199  {
200  OFstream derivFile
201  (
203  baseName + adjointVars_.solverName() + mesh_.time().timeName()
204  );
205  unsigned int widthDV = max(int(name(sens_.size()).size()), int(3));
206  unsigned int width = IOstream::defaultPrecision() + 7;
207  derivFile
208  << setw(widthDV) << "#dv" << " "
209  << setw(width) << "total" << " "
210  << setw(width) << "flow" << " "
211  << setw(width) << "dSdb" << " "
212  << setw(width) << "dndb" << " "
213  << setw(width) << "dxdbDirect" << endl;
214  label nDV = derivatives_.size();
215  label nBezier = Bezier_.nBezier();
216  const boolListList& confineMovement = Bezier_.confineMovement();
217  label lastActive(-1);
218  for (label iDV = 0; iDV < nDV; iDV++)
219  {
220  label iCP = iDV%nBezier;
221  label idir = iDV/nBezier;
222  if (!confineMovement[idir][iCP])
223  {
224  if (iDV!=lastActive + 1) derivFile << "\n";
225  lastActive = iDV;
226  derivFile
227  << setw(widthDV) << iDV << " "
228  << setw(width) << derivatives_[iDV] << " "
229  << setw(width) << flowSens_[iCP].component(idir) << " "
230  << setw(width) << dSdbSens_[iCP].component(idir) << " "
231  << setw(width) << dndbSens_[iCP].component(idir) << " "
232  << setw(width) << dxdbDirectSens_[iCP].component(idir)
233  << endl;
234  }
235  }
236  }
237 }
238 
239 
240 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
241 
242 } // End namespace incompressible
243 } // End namespace Foam
244 
245 // ************************************************************************* //
Foam::incompressible::SIBase::dxdbDirectMult_
autoPtr< boundaryVectorField > dxdbDirectMult_
Definition: SIBaseIncompressible.H:73
Foam::incompressible::adjointSensitivity::derivatives_
scalarField derivatives_
Definition: adjointSensitivityIncompressible.H:84
Foam::IOdictionary
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
Definition: IOdictionary.H:54
Foam::scalarField
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
Definition: primitiveFieldsFwd.H:52
Foam::objectiveManager
class for managing incompressible objective functions.
Definition: objectiveManager.H:54
Foam::incompressible::sensitivitySurface::assembleSensitivities
virtual void assembleSensitivities()
Assemble sensitivities.
Definition: sensitivitySurfaceIncompressible.C:610
Foam::variablesSet::solverName
const word & solverName() const
Return solver name.
Definition: variablesSet.C:84
Foam::Bezier::confineXmovement
const boolList & confineXmovement() const
Confine x movement.
Definition: Bezier.C:139
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:62
Foam::incompressible::sensitivityBezier::clearSensitivities
virtual void clearSensitivities()
Zero sensitivity fields and their constituents.
Definition: sensitivityBezierIncompressible.C:183
Foam::incompressible::defineTypeNameAndDebug
defineTypeNameAndDebug(adjointEikonalSolver, 0)
Foam::tmp
A class for managing temporary objects.
Definition: PtrList.H:59
Foam::Zero
static constexpr const zero Zero
Global zero.
Definition: zero.H:128
Foam::Time::timeName
static word timeName(const scalar t, const int precision=precision_)
Definition: Time.C:764
Foam::incompressible::SIBase
Base class for Surface Integral-based sensitivity derivatives.
Definition: SIBaseIncompressible.H:58
Foam::incompressible::sensitivityBezier::write
virtual void write(const word &baseName=word::null)
Write sensitivities to file.
Definition: sensitivityBezierIncompressible.C:195
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:337
Foam::incompressible::sensitivityBezier::dndbSens_
vectorField dndbSens_
Definition: sensitivityBezierIncompressible.H:78
Foam::incompressible::SIBase::surfaceSensitivity_
sensitivitySurface surfaceSensitivity_
Surface sensitivities.
Definition: SIBaseIncompressible.H:68
Foam::incompressible::sensitivityBezier::Bezier_
Bezier Bezier_
Definition: sensitivityBezierIncompressible.H:73
Foam::gSum
Type gSum(const FieldField< Field, Type > &f)
Definition: FieldFieldFunctions.C:594
Foam::Bezier::confineZmovement
const boolList & confineZmovement() const
Confine z movement.
Definition: Bezier.C:151
Foam::incompressible::sensitivityBezier::dSdbSens_
vectorField dSdbSens_
Definition: sensitivityBezierIncompressible.H:77
Foam::incompressibleAdjointVars
Class including all adjoint fields for incompressible flows.
Definition: incompressibleAdjointVars.H:52
Foam::incompressible::sensitivityBezier::assembleSensitivities
virtual void assembleSensitivities()
Assemble sensitivities.
Definition: sensitivityBezierIncompressible.C:90
Foam::fv::optionAdjointList
Definition: fvOptionAdjointList.H:59
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:290
Foam::incompressible::SIBase::clearSensitivities
virtual void clearSensitivities()
Zero sensitivity fields and their constituents.
Definition: SIBaseIncompressible.C:164
Foam::Bezier::nBezier
label nBezier() const
Number of Bezier control points.
Definition: Bezier.C:127
Foam::incompressible::addToRunTimeSelectionTable
addToRunTimeSelectionTable(adjointSensitivity, sensitivityBezier, dictionary)
Foam::sensitivity::mesh_
const fvMesh & mesh_
Definition: sensitivity.H:69
Foam::label
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:62
Foam::Field< tensor >
Foam::Info
messageStream Info
Information stream (uses stdout - output is on the master only)
Foam::name
word name(const complex &c)
Return string representation of complex.
Definition: complex.C:76
IOmanip.H
Istream and Ostream manipulators taking arguments.
Foam::max
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:47
Foam::Bezier::dxdbFace
tmp< tensorField > dxdbFace(const label patchI, const label cpI, bool useChainRule=true) const
dxdb tensor for a Bezier parameterized patch
Definition: Bezier.C:281
dict
dictionary dict
Definition: searchingEngine.H:14
Foam::dictionary
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:121
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:6
addToRunTimeSelectionTable.H
Macros for easy insertion into run-time selection tables.
Foam::incompressible::adjointSensitivity::adjointVars_
incompressibleAdjointVars & adjointVars_
Definition: adjointSensitivityIncompressible.H:86
Foam::fvMesh
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:84
Foam
Namespace for OpenFOAM.
Definition: atmBoundaryLayer.C:33
Foam::setw
Omanip< int > setw(const int i)
Definition: IOmanip.H:199
Foam::Field::component
tmp< Field< cmptType > > component(const direction) const
Return a component field of the field.
Definition: Field.C:562
Foam::OFstream
Output to file stream, using an OSstream.
Definition: OFstream.H:99
Foam::UPstream::master
static bool master(const label communicator=0)
Am I the master process.
Definition: UPstream.H:438
Foam::incompressible::SIBase::includeObjective_
bool includeObjective_
Definition: SIBaseIncompressible.H:75
Foam::incompressible::SIBase::dSfdbMult_
autoPtr< boundaryVectorField > dSfdbMult_
Fields related to direct sensitivities.
Definition: SIBaseIncompressible.H:71
Foam::IOstream::defaultPrecision
static unsigned int defaultPrecision()
Return the default precision.
Definition: IOstream.H:325
Foam::List< bool >
Foam::type
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
Definition: MSwindows.C:590
Foam::incompressible::SIBase::dnfdbMult_
autoPtr< boundaryVectorField > dnfdbMult_
Definition: SIBaseIncompressible.H:72
Foam::fvMesh::time
const Time & time() const
Return the top-level database.
Definition: fvMesh.H:246
Foam::Bezier::confineYmovement
const boolList & confineYmovement() const
Confine y movement.
Definition: Bezier.C:145
sensitivityBezierIncompressible.H
Foam::Bezier::confineMovement
const boolListList & confineMovement() const
Info about confining movement in all directions.
Definition: Bezier.C:157
Foam::incompressible::sensitivityBezier::flowSens_
vectorField flowSens_
Definition: sensitivityBezierIncompressible.H:76
fvOptionsAdjoint
fv::IOoptionListAdjoint fvOptionsAdjoint(mesh)
Foam::mkDir
bool mkDir(const fileName &pathName, mode_t mode=0777)
Make a directory and return an error if it could not be created.
Definition: MSwindows.C:507
Foam::incompressible::sensitivityBezier::sens_
vectorField sens_
Definition: sensitivityBezierIncompressible.H:75
Foam::incompressibleVars
Base class for solution control classes.
Definition: incompressibleVars.H:54
Foam::incompressible::sensitivityBezier::dxdbDirectSens_
vectorField dxdbDirectSens_
Definition: sensitivityBezierIncompressible.H:79
Foam::incompressible::sensitivityBezier::derivativesFolder_
fileName derivativesFolder_
Definition: sensitivityBezierIncompressible.H:81
Foam::Bezier::dndbBasedSensitivities
tmp< tensorField > dndbBasedSensitivities(const label patchI, const label cpI, bool returnDimensionedNormalSens=true) const
Definition: Bezier.C:164