FIBaseIncompressible.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 
30 #include "FIBaseIncompressible.H"
32 
33 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 
35 namespace Foam
36 {
37 
38 namespace incompressible
39 {
40 
41 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
42 
43 defineTypeNameAndDebug(FIBase, 0);
44 
45 
46 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
47 
49 {
52  (
53  "includeDistance",
54  adjointVars_.adjointTurbulence().ref().includeDistance()
55  );
56 
57  // Allocate distance solver if needed
58  if (includeDistance_ && eikonalSolver_.empty())
59  {
60  eikonalSolver_.reset
61  (
63  (
64  mesh_,
65  dict_,
68  sensitivityPatchIDs_
69  )
70  );
71  }
72 }
73 
74 
75 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
76 
77 FIBase::FIBase
78 (
79  const fvMesh& mesh,
80  const dictionary& dict,
81  incompressibleVars& primalVars,
82  incompressibleAdjointVars& adjointVars,
85 )
86 :
88  (
89  mesh,
90  dict,
91  primalVars,
92  adjointVars,
95  ),
97  gradDxDbMult_
98  (
99  IOobject
100  (
101  "gradDxDbMult",
102  mesh_.time().timeName(),
103  mesh_,
106  ),
107  mesh_,
109  ),
110  divDxDbMult_(mesh_.nCells(), Zero),
111  optionsDxDbMult_(mesh_.nCells(), Zero),
112  dSfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
113  dnfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
114  dxdbDirectMult_(createZeroBoundaryPtr<vector>(mesh_)),
115 
116  includeDistance_(false),
117  eikonalSolver_(nullptr)
118 {
119  read();
120 }
121 
122 
123 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
124 
126 {
128  {
129  if (eikonalSolver_.valid())
130  {
131  eikonalSolver_().readDict(dict);
132  }
133 
134  return true;
135  }
136 
137  return false;
138 }
139 
140 
141 void FIBase::accumulateIntegrand(const scalar dt)
142 {
143  // Accumulate multiplier of grad(dxdb)
145 
146  // Accumulate multiplier of div(dxdb)
148  for (objective& func : functions)
149  {
150  divDxDbMult_ +=
151  func.weight()*func.divDxDbMultiplier().primitiveField()*dt;
152  }
153 
154  // Terms from fvOptions
155  for (fv::optionAdjoint& optionAdj : fvOptionsAdjoint_)
156  {
158  optionAdj.dxdbMult(adjointVars_)().primitiveField()*dt;
159  }
160 
161  // Accumulate source for the adjoint to the eikonal equation
162  if (includeDistance_)
163  {
164  eikonalSolver_->accumulateIntegrand(dt);
165  }
166 
167  // Accumulate direct sensitivities
168  for (const label patchI : sensitivityPatchIDs_)
169  {
170  const scalarField magSfDt(mesh_.boundary()[patchI].magSf()*dt);
171  for (objective& func : functions)
172  {
173  const scalar wei = func.weight();
174  dSfdbMult_()[patchI] += wei*func.dSdbMultiplier(patchI)*dt;
175  dnfdbMult_()[patchI] += wei*func.dndbMultiplier(patchI)*magSfDt;
176  dxdbDirectMult_()[patchI] +=
177  wei*func.dxdbDirectMultiplier(patchI)*magSfDt;
178  }
179  }
180 }
181 
182 
184 {
186  divDxDbMult_ = Zero;
191 
192  if (includeDistance_)
193  {
194  eikonalSolver_->reset();
195  }
196 
199 }
200 
201 
202 void FIBase::write(const word& baseName)
203 {
204  adjointSensitivity::write(baseName);
206 }
207 
208 
209 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
210 
211 } // End namespace incompressible
212 } // End namespace Foam
213 
214 // ************************************************************************* //
Foam::sensitivity::dict
const dictionary & dict() const
Return the construction dictionary.
Definition: sensitivity.C:57
Foam::incompressible::FIBase::optionsDxDbMult_
vectorField optionsDxDbMult_
dx/db multiplier coming from fvOptions
Definition: FIBaseIncompressible.H:73
Foam::IOobject::NO_WRITE
Definition: IOobject.H:130
Foam::objectiveManager
class for managing incompressible objective functions.
Definition: objectiveManager.H:54
Foam::IOobject
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition: IOobject.H:104
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:62
Foam::incompressible::FIBase::write
virtual void write(const word &baseName=word::null)
Write sensitivity fields.
Definition: FIBaseIncompressible.C:202
Foam::incompressible::FIBase::clearSensitivities
virtual void clearSensitivities()
Zero sensitivity fields and their constituents.
Definition: FIBaseIncompressible.C:183
Foam::incompressible::adjointSensitivity::fvOptionsAdjoint_
fv::optionAdjointList & fvOptionsAdjoint_
Definition: adjointSensitivityIncompressible.H:88
Foam::incompressible::defineTypeNameAndDebug
defineTypeNameAndDebug(adjointEikonalSolver, 0)
Foam::dimLength
const dimensionSet dimLength(0, 1, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:53
Foam::Zero
static constexpr const zero Zero
Global zero.
Definition: zero.H:128
Foam::read
bool read(const char *buf, int32_t &val)
Same as readInt32.
Definition: int32.H:108
Foam::incompressible::FIBase::gradDxDbMult_
volTensorField gradDxDbMult_
grad(dx/db) multiplier
Definition: FIBaseIncompressible.H:67
Foam::incompressible::FIBase::read
void read()
Read options and update solver pointers if necessary.
Definition: FIBaseIncompressible.C:48
Foam::incompressible::FIBase::divDxDbMult_
scalarField divDxDbMult_
div(dx/db) multiplier
Definition: FIBaseIncompressible.H:70
Foam::incompressible::FIBase::dSfdbMult_
autoPtr< boundaryVectorField > dSfdbMult_
Fields related to direct sensitivities.
Definition: FIBaseIncompressible.H:76
Foam::dictionary::lookupOrDefault
T lookupOrDefault(const word &keyword, const T &deflt, enum keyType::option matchOpt=keyType::REGEX) const
Definition: dictionary.H:1241
Foam::incompressibleAdjointVars
Class including all adjoint fields for incompressible flows.
Definition: incompressibleAdjointVars.H:52
Foam::fv::optionAdjointList
Definition: fvOptionAdjointList.H:59
Foam::incompressibleVars::RASModelVariables
const autoPtr< incompressible::RASModelVariables > & RASModelVariables() const
Return const reference to the turbulence model variables.
Definition: incompressibleVars.C:444
Foam::shapeSensitivitiesBase
Definition: shapeSensitivitiesBase.H:63
Foam::incompressible::FIBase::eikonalSolver_
autoPtr< adjointEikonalSolver > eikonalSolver_
Adjoint eikonal equation solver.
Definition: FIBaseIncompressible.H:84
Foam::incompressible::adjointEikonalSolver
Solver of the adjoint to the eikonal PDE.
Definition: adjointEikonalSolverIncompressible.H:146
Foam::dimTime
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
Definition: dimensionSets.H:54
Foam::shapeSensitivitiesBase::write
void write()
Write sensitivity fields.
Definition: shapeSensitivitiesBase.C:216
Foam::incompressible::adjointSensitivity
Abstract base class for adjoint-based sensitivities in incompressible flows.
Definition: adjointSensitivityIncompressible.H:76
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< scalar >
Foam::incompressible::FIBase::dnfdbMult_
autoPtr< boundaryVectorField > dnfdbMult_
Definition: FIBaseIncompressible.H:77
Foam::pow3
dimensionedScalar pow3(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:89
Foam::sensitivity::readDict
virtual bool readDict(const dictionary &dict)
Read dictionary if changed.
Definition: sensitivity.C:63
Foam::fv::optionAdjoint
Similar to fv::option but with additional functionality to contribute to the sensitivity deriavtives.
Definition: fvOptionAdjoint.H:58
Foam::T
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
Definition: FieldFieldFunctions.C:58
Foam::incompressible::FIBase::readDict
virtual bool readDict(const dictionary &dict)
Read dict if changed.
Definition: FIBaseIncompressible.C:125
Foam::PtrList
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers....
Definition: List.H:65
Foam::incompressible::adjointSensitivity::clearSensitivities
virtual void clearSensitivities()
Zero sensitivity fields and their constituents.
Definition: adjointSensitivityIncompressible.C:124
Foam::func
void func(FieldField< Field, Type > &f, const FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
FIBaseIncompressible.H
dict
dictionary dict
Definition: searchingEngine.H:14
Foam::shapeSensitivitiesBase::clear
void clear()
Zero sensitivity fields and their constituents.
Definition: shapeSensitivitiesBase.C:175
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::incompressible::FIBase::dxdbDirectMult_
autoPtr< boundaryVectorField > dxdbDirectMult_
Definition: FIBaseIncompressible.H:78
Foam::incompressible::adjointSensitivity::primalVars_
incompressibleVars & primalVars_
Definition: adjointSensitivityIncompressible.H:85
Foam::fvMesh::boundary
const fvBoundaryMesh & boundary() const
Return reference to boundary mesh.
Definition: fvMesh.C:589
Foam::sensitivity::dict_
dictionary dict_
Definition: sensitivity.H:70
Foam::sqr
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Definition: dimensionedSymmTensor.C:51
Foam::incompressible::FIBase::includeDistance_
bool includeDistance_
Include distance variation in sens computation.
Definition: FIBaseIncompressible.H:81
Foam::incompressibleAdjointVars::adjointTurbulence
const autoPtr< incompressibleAdjoint::adjointRASModel > & adjointTurbulence() const
Return const reference to the adjointRASModel.
Definition: incompressibleAdjointVars.C:70
Foam::incompressible::FIBase::accumulateIntegrand
virtual void accumulateIntegrand(const scalar dt)
Accumulate sensitivity integrands.
Definition: FIBaseIncompressible.C:141
Foam::VectorSpace< Vector< scalar >, scalar, 3 >::zero
static const Vector< scalar > zero
Definition: VectorSpace.H:115
Foam::IOobject::NO_READ
Definition: IOobject.H:123
fvOptionsAdjoint
fv::IOoptionListAdjoint fvOptionsAdjoint(mesh)
Foam::objective
Abstract base class for objective functions. No point in making this runTime selectable since its chi...
Definition: objective.H:58
Foam::dimensionedTensor
dimensioned< tensor > dimensionedTensor
Dimensioned tensor obtained from generic dimensioned type.
Definition: dimensionedTensor.H:51
Foam::incompressible::adjointSensitivity::computeGradDxDbMultiplier
tmp< volTensorField > computeGradDxDbMultiplier()
Definition: adjointSensitivityIncompressible.C:140
Foam::incompressibleVars
Base class for solution control classes.
Definition: incompressibleVars.H:54
Foam::incompressible::adjointSensitivity::write
virtual void write(const word &baseName=word::null)
Write sensitivity fields.
Definition: adjointSensitivityIncompressible.C:134
Foam::objectiveManager::getObjectiveFunctions
PtrList< objective > & getObjectiveFunctions()
Return reference to objective functions.
Definition: objectiveManager.C:243
Foam::incompressible::adjointSensitivity::objectiveManager_
objectiveManager & objectiveManager_
Definition: adjointSensitivityIncompressible.H:87