Skip to content

Commit c2cd211

Browse files
committed
Remove nested class definitions in CDiscAdjSinglezoneDriver
1 parent a3dd117 commit c2cd211

File tree

2 files changed

+47
-39
lines changed

2 files changed

+47
-39
lines changed

SU2_CFD/include/drivers/CDiscAdjSinglezoneDriver.hpp

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@
3333
#include "../../../Common/include/linear_algebra/CMatrixVectorProduct.hpp"
3434
#include "../../../Common/include/linear_algebra/CSysSolve.hpp"
3535

36+
#ifdef CODI_FORWARD_TYPE
37+
using Scalar = su2double;
38+
#else
39+
using Scalar = su2mixedfloat;
40+
#endif
41+
42+
class LinOperator;
43+
class LinPreconditioner;
44+
3645
/*!
3746
* \class CDiscAdjSinglezoneDriver
3847
* \ingroup DiscAdj
@@ -42,11 +51,6 @@
4251
*/
4352
class CDiscAdjSinglezoneDriver : public CSinglezoneDriver {
4453
protected:
45-
#ifdef CODI_FORWARD_TYPE
46-
using Scalar = su2double;
47-
#else
48-
using Scalar = su2mixedfloat;
49-
#endif
5054

5155
unsigned long nAdjoint_Iter; /*!< \brief The number of adjoint iterations that are run on the fixed-point solver.*/
5256
RECORDING RecordingState; /*!< \brief The kind of recording the tape currently holds.*/
@@ -79,27 +83,8 @@ class CDiscAdjSinglezoneDriver : public CSinglezoneDriver {
7983
CSysVector<Scalar> AdjSol;
8084
CPreconditioner<Scalar>* PrimalPreconditioner = nullptr;
8185
CSysMatrixVectorProduct<Scalar>* PrimalJacobian = nullptr;
82-
83-
class LinOperator : public CMatrixVectorProduct<Scalar> {
84-
public:
85-
CDiscAdjSinglezoneDriver* const driver;
86-
LinOperator(CDiscAdjSinglezoneDriver* d) : driver(d) { }
87-
88-
inline void operator()(const CSysVector<Scalar> & u, CSysVector<Scalar> & v) const override {
89-
driver->ApplyOperator(u, v);
90-
}
91-
};
92-
93-
class LinPreconditioner : public CPreconditioner<Scalar> {
94-
public:
95-
CDiscAdjSinglezoneDriver* const driver;
96-
97-
LinPreconditioner(CDiscAdjSinglezoneDriver* d): driver(d) { }
98-
99-
inline void operator()(const CSysVector<Scalar> & u, CSysVector<Scalar> & v) const override {
100-
driver->ApplyPreconditioner(u, v);
101-
}
102-
};
86+
LinOperator* AdjOperator = nullptr;
87+
LinPreconditioner* AdjPreconditioner = nullptr;
10388

10489
/*!
10590
* \brief Record one iteration of a flow iteration in within multiple zones.
@@ -149,16 +134,6 @@ class CDiscAdjSinglezoneDriver : public CSinglezoneDriver {
149134
*/
150135
void UpdateAdjointsResidual();
151136

152-
/*!
153-
* \brief Adjoint problem Jacobian-vector product.
154-
*/
155-
void ApplyOperator(const CSysVector<Scalar>& u, CSysVector<Scalar>& v);
156-
157-
/*!
158-
* \brief Adjoint problem preconditioner (based on the transpose approximate Jacobian of the primal problem).
159-
*/
160-
void ApplyPreconditioner(const CSysVector<Scalar>& u, CSysVector<Scalar>& v);
161-
162137
/*!
163138
* \brief Initialize the adjoint value of the objective function.
164139
*/
@@ -318,4 +293,34 @@ class CDiscAdjSinglezoneDriver : public CSinglezoneDriver {
318293
offset += solver->GetnVar();
319294
}
320295
}
296+
297+
/*!
298+
* \brief Adjoint problem Jacobian-vector product.
299+
*/
300+
void ApplyOperator(const CSysVector<Scalar>& u, CSysVector<Scalar>& v);
301+
302+
/*!
303+
* \brief Adjoint problem preconditioner (based on the transpose approximate Jacobian of the primal problem).
304+
*/
305+
void ApplyPreconditioner(const CSysVector<Scalar>& u, CSysVector<Scalar>& v);
306+
};
307+
308+
class LinOperator : public CMatrixVectorProduct<Scalar> {
309+
public:
310+
CDiscAdjSinglezoneDriver* const driver;
311+
LinOperator(CDiscAdjSinglezoneDriver* d) : driver(d) { }
312+
313+
inline void operator()(const CSysVector<Scalar> & u, CSysVector<Scalar> & v) const override {
314+
driver->ApplyOperator(u, v);
315+
}
316+
};
317+
318+
class LinPreconditioner : public CPreconditioner<Scalar> {
319+
public:
320+
CDiscAdjSinglezoneDriver* const driver;
321+
LinPreconditioner(CDiscAdjSinglezoneDriver* d) : driver(d) { }
322+
323+
inline void operator()(const CSysVector<Scalar> & u, CSysVector<Scalar> & v) const override {
324+
driver->ApplyPreconditioner(u, v);
325+
}
321326
};

SU2_CFD/src/drivers/CDiscAdjSinglezoneDriver.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ CDiscAdjSinglezoneDriver::~CDiscAdjSinglezoneDriver() {
126126
delete direct_iteration;
127127
delete direct_output;
128128
delete PrimalJacobian;
129+
delete PrimalPreconditioner;
130+
delete AdjOperator;
131+
delete AdjPreconditioner;
129132

130133
}
131134

@@ -260,8 +263,8 @@ void CDiscAdjSinglezoneDriver::RunResidual() {
260263
AdjSolver.SetMonitoringFrequency(wrtFreq);
261264

262265
/*--- Initialize the linear solver iterations ---*/
263-
const auto AdjOperator = LinOperator(this);
264-
const auto AdjPreconditioner = LinPreconditioner(this);
266+
AdjOperator = new LinOperator(this);
267+
AdjPreconditioner = new LinPreconditioner(this);
265268

266269
Scalar eps = 1.0;
267270

@@ -273,7 +276,7 @@ void CDiscAdjSinglezoneDriver::RunResidual() {
273276
Scalar eps_l = 0.0;
274277
Scalar tol_l = KrylovSysTol / eps;
275278

276-
nIter = AdjSolver.FGMRES_LinSolver(AdjRHS, AdjSol, AdjOperator, AdjPreconditioner, tol_l, nIter, eps_l, monitor,
279+
nIter = AdjSolver.FGMRES_LinSolver(AdjRHS, AdjSol, *AdjOperator, *AdjPreconditioner, tol_l, nIter, eps_l, monitor,
277280
config_container[ZONE_0]);
278281
nKrylov_Iter -= nIter + 1;
279282

0 commit comments

Comments
 (0)