2626 */
2727
2828#include " ../../include/iteration/CDiscAdjFEAIteration.hpp"
29+ #include " ../../include/iteration/CDiscAdjHeatIteration.hpp"
2930#include " ../../include/iteration/CFEAIteration.hpp"
3031#include " ../../include/solvers/CFEASolver.hpp"
3132#include " ../../include/output/COutput.hpp"
3233
33- CDiscAdjFEAIteration::CDiscAdjFEAIteration (const CConfig *config) : CIteration(config), CurrentRecording(NONE) {}
34+ CDiscAdjFEAIteration::CDiscAdjFEAIteration (const CConfig *config) : CIteration(config), CurrentRecording(NONE) {
35+ if (config->GetWeakly_Coupled_Heat ()) {
36+ DiscAdjHeatIteration = new CDiscAdjHeatIteration (config);
37+ }
38+ }
3439
35- CDiscAdjFEAIteration::~CDiscAdjFEAIteration () {}
40+ CDiscAdjFEAIteration::~CDiscAdjFEAIteration () {
41+ delete DiscAdjHeatIteration;
42+ }
3643
3744void CDiscAdjFEAIteration::Preprocess (COutput* output, CIntegration**** integration, CGeometry**** geometry,
3845 CSolver***** solver, CNumerics****** numerics, CConfig** config,
@@ -90,6 +97,10 @@ void CDiscAdjFEAIteration::Preprocess(COutput* output, CIntegration**** integrat
9097
9198 solvers0[ADJFEA_SOL]->Preprocessing (geometry0, solvers0, config[iZone], MESH_0, 0 , RUNTIME_ADJFEA_SYS, false );
9299
100+ if (DiscAdjHeatIteration) {
101+ DiscAdjHeatIteration->Preprocess (output, integration, geometry, solver, numerics, config, surface_movement,
102+ grid_movement, FFDBox, iZone, iInst);
103+ }
93104}
94105
95106void CDiscAdjFEAIteration::LoadDynamic_Solution (CGeometry**** geometry, CSolver***** solver, CConfig** config,
@@ -115,23 +126,23 @@ void CDiscAdjFEAIteration::IterateDiscAdj(CGeometry**** geometry, CSolver***** s
115126 unsigned short iZone, unsigned short iInst, bool CrossTerm) {
116127
117128 /* --- Extract the adjoints of the conservative input variables and store them for the next iteration ---*/
118-
119- solver[iZone][iInst][MESH_0][ADJFEA_SOL]->ExtractAdjoint_Solution (geometry[iZone][iInst][MESH_0], config[iZone],
120- CrossTerm);
121-
122- solver[iZone][iInst][MESH_0][ADJFEA_SOL]->ExtractAdjoint_Variables (geometry[iZone][iInst][MESH_0], config[iZone]);
129+ for (const auto iSol : {ADJFEA_SOL, ADJHEAT_SOL}) {
130+ if (auto * sol = solver[iZone][iInst][MESH_0][iSol]; sol != nullptr ) {
131+ sol->ExtractAdjoint_Solution (geometry[iZone][iInst][MESH_0], config[iZone], CrossTerm);
132+ sol->ExtractAdjoint_Variables (geometry[iZone][iInst][MESH_0], config[iZone]);
133+ }
134+ }
123135}
124136
125137void CDiscAdjFEAIteration::RegisterInput (CSolver***** solver, CGeometry**** geometry, CConfig** config,
126138 unsigned short iZone, unsigned short iInst, RECORDING kind_recording) {
127139 if (kind_recording != RECORDING::MESH_COORDS) {
128- /* --- Register structural displacements as input ---*/
129-
130- solver[iZone][iInst][MESH_0][ADJFEA_SOL]->RegisterSolution (geometry[iZone][iInst][MESH_0], config[iZone]);
131-
132- /* --- Register variables as input ---*/
133-
134- solver[iZone][iInst][MESH_0][ADJFEA_SOL]->RegisterVariables (geometry[iZone][iInst][MESH_0], config[iZone]);
140+ for (const auto iSol : {ADJFEA_SOL, ADJHEAT_SOL}) {
141+ if (auto * sol = solver[iZone][iInst][MESH_0][iSol]; sol != nullptr ) {
142+ sol->RegisterSolution (geometry[iZone][iInst][MESH_0], config[iZone]);
143+ sol->RegisterVariables (geometry[iZone][iInst][MESH_0], config[iZone]);
144+ }
145+ }
135146 } else {
136147 /* --- Register topology optimization densities (note direct solver) ---*/
137148
@@ -146,6 +157,10 @@ void CDiscAdjFEAIteration::RegisterInput(CSolver***** solver, CGeometry**** geom
146157void CDiscAdjFEAIteration::SetDependencies (CSolver***** solver, CGeometry**** geometry, CNumerics****** numerics,
147158 CConfig** config, unsigned short iZone, unsigned short iInst,
148159 RECORDING kind_recording) {
160+ if (DiscAdjHeatIteration) {
161+ DiscAdjHeatIteration->SetDependencies (solver, geometry, numerics, config, iZone, iInst, kind_recording);
162+ }
163+
149164 auto dir_solver = solver[iZone][iInst][MESH_0][FEA_SOL];
150165 auto adj_solver = solver[iZone][iInst][MESH_0][ADJFEA_SOL];
151166 auto structural_geometry = geometry[iZone][iInst][MESH_0];
@@ -263,18 +278,25 @@ void CDiscAdjFEAIteration::SetDependencies(CSolver***** solver, CGeometry**** ge
263278
264279void CDiscAdjFEAIteration::RegisterOutput (CSolver***** solver, CGeometry**** geometry, CConfig** config,
265280 unsigned short iZone, unsigned short iInst) {
266- /* --- Register conservative variables as output of the iteration ---*/
267-
268- solver[iZone][iInst][MESH_0][ADJFEA_SOL]->RegisterOutput (geometry[iZone][iInst][MESH_0], config[iZone]);
281+ /* --- Register solution variables as output of the iteration. ---*/
282+ for (const auto iSol : {ADJFEA_SOL, ADJHEAT_SOL}) {
283+ if (auto * sol = solver[iZone][iInst][MESH_0][iSol]; sol != nullptr ) {
284+ sol->RegisterOutput (geometry[iZone][iInst][MESH_0], config[iZone]);
285+ }
286+ }
269287}
270288
271289void CDiscAdjFEAIteration::InitializeAdjoint (CSolver***** solver, CGeometry**** geometry, CConfig** config,
272290 unsigned short iZone, unsigned short iInst) {
273- /* --- Initialize the adjoints the conservative variables ---*/
291+ /* --- Initialize the adjoints of the solution variables. ---*/
274292
275293 AD::ResizeAdjoints ();
276294 AD::BeginUseAdjoints ();
277- solver[iZone][iInst][MESH_0][ADJFEA_SOL]->SetAdjoint_Output (geometry[iZone][iInst][MESH_0], config[iZone]);
295+ for (const auto iSol : {ADJFEA_SOL, ADJHEAT_SOL}) {
296+ if (auto * sol = solver[iZone][iInst][MESH_0][iSol]; sol != nullptr ) {
297+ sol->SetAdjoint_Output (geometry[iZone][iInst][MESH_0], config[iZone]);
298+ }
299+ }
278300 AD::EndUseAdjoints ();
279301}
280302
@@ -285,8 +307,8 @@ bool CDiscAdjFEAIteration::Monitor(COutput* output, CIntegration**** integration
285307 /* --- Write the convergence history (only screen output) ---*/
286308
287309 output->SetHistoryOutput (geometry[iZone][INST_0][MESH_0], solver[iZone][INST_0][MESH_0], config[iZone],
288- config[iZone]->GetTimeIter (), config[iZone]->GetOuterIter (),
289- config[iZone]->GetInnerIter ());
310+ config[iZone]->GetTimeIter (), config[iZone]->GetOuterIter (),
311+ config[iZone]->GetInnerIter ());
290312
291313 return output->GetConvergence ();
292314}
0 commit comments