shapeSensitivitiesIncompressible.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) 2020 PCOpt/NTUA
9  Copyright (C) 2020 FOSS GP
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
31 
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
33 
34 namespace Foam
35 {
36 
37 namespace incompressible
38 {
39 
40 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 
42 defineTypeNameAndDebug(shapeSensitivities, 0);
43 
44 
45 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
46 
48 {
49  // Accumulate direct sensitivities
51  for (const label patchI : sensitivityPatchIDs_)
52  {
53  const scalarField magSfDt(mesh_.boundary()[patchI].magSf()*dt);
54  for (objective& func : functions)
55  {
56  const scalar wei(func.weight());
57  dSfdbMult_()[patchI] += wei*func.dSdbMultiplier(patchI)*dt;
58  dnfdbMult_()[patchI] += wei*func.dndbMultiplier(patchI)*magSfDt;
59  dxdbDirectMult_()[patchI] +=
60  wei*func.dxdbDirectMultiplier(patchI)*magSfDt;
61  }
62  }
63 }
64 
65 
67 {
68  auto& UaBoundary = adjointVars_.Ua().boundaryFieldRef();
70 
71  // Accumulate sensitivities due to boundary conditions
72  for (const label patchI : sensitivityPatchIDs_)
73  {
74  const scalarField magSfDt(mesh_.boundary()[patchI].magSf()*dt);
75  fvPatchVectorField& Uab = UaBoundary[patchI];
76  if (isA<adjointVectorBoundaryCondition>(Uab))
77  {
78  bcDxDbMult_()[patchI] +=
79  (
80  DvDbMult()[patchI]
81  & refCast<adjointVectorBoundaryCondition>(Uab).dxdbMult()
82  )*magSfDt;
83  }
84  }
85 }
86 
87 
89 {
91  tres(createZeroBoundaryPtr<vector>(meshShape_).ptr());
92  boundaryVectorField& res = tres.ref();
93 
94  // Grab references
95  const volScalarField& pa = adjointVars_.pa();
96  const volVectorField& Ua = adjointVars_.Ua();
97  const autoPtr<incompressibleAdjoint::adjointRASModel>& adjointTurbulence =
99 
100  // Fields needed to calculate adjoint sensitivities
102  turbVars = primalVars_.RASModelVariables();
104  volScalarField nuEff(lamTransp.nu() + turbVars->nutRef());
105  volTensorField gradUa(fvc::grad(Ua));
106 
107  for (const label patchI : sensitivityPatchIDs_)
108  {
109  const fvPatch& patch = meshShape_.boundary()[patchI];
110  tmp<vectorField> tnf = patch.nf();
111  const vectorField& nf = tnf();
112 
113  res[patchI] =
114  (
115  nuEff.boundaryField()[patchI]
116  * (
117  Ua.boundaryField()[patchI].snGrad()
118  + (gradUa.boundaryField()[patchI] & nf)
119  )
120  )
121  - (nf*pa.boundaryField()[patchI])
122  + adjointTurbulence().adjointMomentumBCSource()[patchI];
123  }
124 
125  return tres;
126 }
127 
128 
129 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
130 
131 shapeSensitivities::shapeSensitivities
132 (
133  const fvMesh& mesh,
134  const dictionary& dict,
135  incompressibleVars& primalVars,
136  incompressibleAdjointVars& adjointVars,
138 )
139 :
141  (
142  mesh,
143  dict,
144  primalVars,
145  adjointVars,
147  ),
149  dSfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
150  dnfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
151  dxdbDirectMult_(createZeroBoundaryPtr<vector>(mesh_)),
152  bcDxDbMult_(createZeroBoundaryPtr<vector>(mesh_))
153 {}
154 
155 
156 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
157 
159 {
164 
167 }
168 
169 
170 void shapeSensitivities::write(const word& baseName)
171 {
172  adjointSensitivity::write(baseName);
174 }
175 
176 
177 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
178 
179 } // End namespace incompressible
180 } // End namespace Foam
181 
182 // ************************************************************************* //
Foam::fvPatchField< vector >
Foam::objectiveManager
class for managing incompressible objective functions.
Definition: objectiveManager.H:54
Foam::fvc::grad
tmp< GeometricField< typename outerProduct< vector, Type >::type, fvPatchField, volMesh >> grad(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
Definition: fvcGrad.C:54
Foam::incompressible::shapeSensitivities::bcDxDbMult_
autoPtr< boundaryVectorField > bcDxDbMult_
Definition: shapeSensitivitiesIncompressible.H:68
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:65
Foam::incompressible::defineTypeNameAndDebug
defineTypeNameAndDebug(adjointEikonalSolver, 0)
Foam::tmp
A class for managing temporary objects.
Definition: PtrList.H:61
Foam::incompressible::shapeSensitivities::accumulateBCSensitivityIntegrand
virtual void accumulateBCSensitivityIntegrand(const scalar dt)
Accumulate sensitivities enamating from the boundary conditions.
Definition: shapeSensitivitiesIncompressible.C:66
Foam::singlePhaseTransportModel
A simple single-phase transport model based on viscosityModel.
Definition: singlePhaseTransportModel.H:57
Foam::incompressible::shapeSensitivities::write
virtual void write(const word &baseName=word::null)
Write sensitivity fields.
Definition: shapeSensitivitiesIncompressible.C:170
Foam::incompressibleAdjointVars
Class including all adjoint fields for incompressible flows.
Definition: incompressibleAdjointVars.H:52
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::shapeSensitivities::dSfdbMult_
autoPtr< boundaryVectorField > dSfdbMult_
Fields related to direct sensitivities.
Definition: shapeSensitivitiesIncompressible.H:65
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:75
Foam::tmp::ref
T & ref() const
Definition: tmpI.H:227
Foam::sensitivity::mesh_
const fvMesh & mesh_
Definition: sensitivity.H:69
Foam::Field< scalar >
Foam::fvPatch
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition: fvPatch.H:65
Foam::incompressibleVars::laminarTransport
const singlePhaseTransportModel & laminarTransport() const
Return const reference to transport model.
Definition: incompressibleVars.C:418
Foam::incompressibleAdjointMeanFlowVars::pa
const volScalarField & pa() const
Return const reference to pressure.
Definition: incompressibleAdjointMeanFlowVars.C:147
Foam::PtrList
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers....
Definition: List.H:59
Foam::incompressible::adjointSensitivity::clearSensitivities
virtual void clearSensitivities()
Zero sensitivity fields and their constituents.
Definition: adjointSensitivityIncompressible.C:127
Foam::func
void func(FieldField< Field, Type > &f, const FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
Foam::incompressible::shapeSensitivities::accumulateDirectSensitivityIntegrand
virtual void accumulateDirectSensitivityIntegrand(const scalar dt)
Accumulate direct sensitivities.
Definition: shapeSensitivitiesIncompressible.C:47
Foam::incompressibleAdjointMeanFlowVars::Ua
const volVectorField & Ua() const
Return const reference to velocity.
Definition: incompressibleAdjointMeanFlowVars.C:173
Foam::incompressible::shapeSensitivities::dvdbMult
tmp< boundaryVectorField > dvdbMult() const
Compute multiplier of dv_i/db.
Definition: shapeSensitivitiesIncompressible.C:88
dict
dictionary dict
Definition: searchingEngine.H:14
adjointBoundaryConditions.H
Foam::dictionary
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:123
Foam::incompressible::shapeSensitivities::dxdbDirectMult_
autoPtr< boundaryVectorField > dxdbDirectMult_
Definition: shapeSensitivitiesIncompressible.H:67
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:6
Foam::incompressible::adjointSensitivity::adjointVars_
incompressibleAdjointVars & adjointVars_
Definition: adjointSensitivityIncompressible.H:85
Foam::fvMesh
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:85
Foam
Namespace for OpenFOAM.
Definition: atmBoundaryLayer.C:33
Foam::incompressible::adjointSensitivity::primalVars_
incompressibleVars & primalVars_
Definition: adjointSensitivityIncompressible.H:84
Foam::fvMesh::boundary
const fvBoundaryMesh & boundary() const
Return reference to boundary mesh.
Definition: fvMesh.C:685
shapeSensitivitiesIncompressible.H
Foam::autoPtr
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
Definition: HashPtrTable.H:53
Foam::GeometricField::Boundary
The boundary fields.
Definition: GeometricField.H:115
Foam::singlePhaseTransportModel::nu
virtual tmp< volScalarField > nu() const
Return the laminar viscosity.
Definition: singlePhaseTransportModel.C:72
Foam::foamVersion::patch
const std::string patch
OpenFOAM patch number as a std::string.
Foam::GeometricField::boundaryFieldRef
Boundary & boundaryFieldRef(const bool updateAccessTime=true)
Return a reference to the boundary field.
Definition: GeometricField.C:783
Foam::incompressibleAdjointVars::adjointTurbulence
const autoPtr< incompressibleAdjoint::adjointRASModel > & adjointTurbulence() const
Return const reference to the adjointRASModel.
Definition: incompressibleAdjointVars.C:70
Foam::shapeSensitivitiesBase::clearSensitivities
void clearSensitivities()
Zero sensitivity fields and their constituents.
Definition: shapeSensitivitiesBase.C:175
Foam::VectorSpace< Vector< scalar >, scalar, 3 >::zero
static const Vector< scalar > zero
Definition: VectorSpace.H:115
Foam::incompressible::shapeSensitivities::clearSensitivities
virtual void clearSensitivities()
Zero sensitivity fields and their constituents.
Definition: shapeSensitivitiesIncompressible.C:158
Foam::incompressible::shapeSensitivities::dnfdbMult_
autoPtr< boundaryVectorField > dnfdbMult_
Definition: shapeSensitivitiesIncompressible.H:66
Foam::GeometricField< scalar, fvPatchField, volMesh >
Foam::objective
Abstract base class for objective functions. No point in making this runTime selectable since its chi...
Definition: objective.H:59
Foam::incompressibleVars
Base class for solution control classes.
Definition: incompressibleVars.H:54
Foam::GeometricField::boundaryField
const Boundary & boundaryField() const
Return const-reference to the boundary field.
Definition: GeometricFieldI.H:62
Foam::incompressible::adjointSensitivity::write
virtual void write(const word &baseName=word::null)
Write sensitivity fields.
Definition: adjointSensitivityIncompressible.C:137
Foam::objectiveManager::getObjectiveFunctions
PtrList< objective > & getObjectiveFunctions()
Return reference to objective functions.
Definition: objectiveManager.C:296
Foam::incompressible::adjointSensitivity::objectiveManager_
objectiveManager & objectiveManager_
Definition: adjointSensitivityIncompressible.H:86