Skip to content

Commit 1549d45

Browse files
committed
checkpoint fixing AD index issues in the flow tractions
1 parent 7548083 commit 1549d45

11 files changed

Lines changed: 121 additions & 30 deletions

File tree

Common/include/option_structure.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1439,7 +1439,7 @@ enum class STRUCT_TIME_INT {
14391439
};
14401440
static const MapType<std::string, STRUCT_TIME_INT> Time_Int_Map_FEA = {
14411441
MakePair("NEWMARK_IMPLICIT", STRUCT_TIME_INT::NEWMARK_IMPLICIT)
1442-
MakePair("GENERALIZED_ALPHA", STRUCT_TIME_INT::GENERALIZED_ALPHA)
1442+
// MakePair("GENERALIZED_ALPHA", STRUCT_TIME_INT::GENERALIZED_ALPHA) Not fully implemented.
14431443
};
14441444

14451445
/*!

SU2_CFD/include/drivers/CDriverBase.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,15 @@ class CDriverBase {
499499
main_geometry->GetnVertex(iMarker), "MarkerPrimitives", false);
500500
}
501501

502+
/*!
503+
* \brief Get a read-only view of the geometry sensitivity of a discrete adjoint solver.
504+
*/
505+
inline CPyWrapperMatrixView Sensitivity(unsigned short iSolver) {
506+
auto* solver = GetSolverAndCheckMarker(iSolver);
507+
auto& sensitivity = const_cast<su2activematrix&>(solver->GetNodes()->GetSensitivity());
508+
return CPyWrapperMatrixView(sensitivity, "Sensitivity", true);
509+
}
510+
502511
/*!
503512
* \brief Set the temperature of a vertex on a specified marker (MARKER_PYTHON_CUSTOM).
504513
* \note This can be the input of a heat or flow solver in a CHT setting.

SU2_CFD/include/variables/CDiscAdjVariable.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class CDiscAdjVariable : public CVariable {
7272
inline su2double GetSensitivity(unsigned long iPoint, unsigned long iDim) const final {
7373
return Sensitivity(iPoint,iDim);
7474
}
75+
inline const MatrixType& GetSensitivity() const final { return Sensitivity; }
7576

7677
/*!
7778
* \brief Set/store the dual time contributions to the adjoint variable.

SU2_CFD/include/variables/CFEABoundVariable.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,15 @@ class CFEABoundVariable final : public CFEAVariable {
159159
*/
160160
void RegisterFlowTraction() override;
161161

162+
/*!
163+
* \brief Resets the AD indices of the flow tractions.
164+
*/
165+
void ResetInputFlowTraction() override;
166+
162167
/*!
163168
* \brief Extract the flow traction derivatives.
164169
*/
165-
inline su2double ExtractFlowTraction_Sensitivity(unsigned long iPoint, unsigned long iDim) const override {
170+
inline su2double ExtractFlowTractionSensitivity(unsigned long iPoint, unsigned long iDim) const override {
166171
if (!fsi_analysis) return 0.0;
167172
if (!VertexMap.GetVertexIndex(iPoint)) return 0.0;
168173
return SU2_TYPE::GetDerivative(FlowTraction(iPoint,iDim));

SU2_CFD/include/variables/CVariable.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2165,7 +2165,12 @@ class CVariable {
21652165
/*!
21662166
* \brief A virtual member.
21672167
*/
2168-
inline virtual su2double ExtractFlowTraction_Sensitivity(unsigned long iPoint, unsigned long iDim) const { return 0.0; }
2168+
inline virtual void ResetInputFlowTraction() { }
2169+
2170+
/*!
2171+
* \brief A virtual member.
2172+
*/
2173+
inline virtual su2double ExtractFlowTractionSensitivity(unsigned long iPoint, unsigned long iDim) const { return 0.0; }
21692174

21702175
/*!
21712176
* \brief Register the variables in the solution array as input/output variable.
@@ -2224,6 +2229,7 @@ class CVariable {
22242229
* \return value of the Sensitivity
22252230
*/
22262231
inline virtual su2double GetSensitivity(unsigned long iPoint, unsigned long iDim) const { return 0.0; }
2232+
inline virtual const MatrixType& GetSensitivity() const { AssertOverride(); return Solution; }
22272233

22282234
inline virtual void SetTau_Wall(unsigned long iPoint, su2double tau_wall) {}
22292235

SU2_CFD/src/output/CAdjElasticityOutput.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,23 @@ void CAdjElasticityOutput::LoadVolumeData(CConfig *config, CGeometry *geometry,
193193
SetVolumeOutputValue("SENSITIVITY-Y", iPoint, Node_Struc->GetSensitivity(iPoint, 1));
194194
if (nDim == 3)
195195
SetVolumeOutputValue("SENSITIVITY-Z", iPoint, Node_Struc->GetSensitivity(iPoint, 2));
196+
197+
if (!config->GetTime_Domain()) return;
198+
199+
SetVolumeOutputValue("SENS_DISP-X", iPoint, Node_Struc->GetSolution_time_n(iPoint, 0));
200+
SetVolumeOutputValue("SENS_DISP-Y", iPoint, Node_Struc->GetSolution_time_n(iPoint, 1));
201+
if (nDim == 3)
202+
SetVolumeOutputValue("SENS_DISP-Z", iPoint, Node_Struc->GetSolution_time_n(iPoint, 2));
203+
204+
SetVolumeOutputValue("SENS_VEL-X", iPoint, Node_Struc->GetSolution_time_n(iPoint, nDim));
205+
SetVolumeOutputValue("SENS_VEL-Y", iPoint, Node_Struc->GetSolution_time_n(iPoint, nDim + 1));
206+
if (nDim == 3)
207+
SetVolumeOutputValue("SENS_VEL-Z", iPoint, Node_Struc->GetSolution_time_n(iPoint, 5));
208+
209+
SetVolumeOutputValue("SENS_ACCEL-X", iPoint, Node_Struc->GetSolution_time_n(iPoint, 2 * nDim));
210+
SetVolumeOutputValue("SENS_ACCEL-Y", iPoint, Node_Struc->GetSolution_time_n(iPoint, 2 * nDim + 1));
211+
if (nDim == 3)
212+
SetVolumeOutputValue("SENS_ACCEL-Z", iPoint, Node_Struc->GetSolution_time_n(iPoint, 8));
196213
}
197214

198215
void CAdjElasticityOutput::SetVolumeOutputFields(CConfig *config){
@@ -223,4 +240,23 @@ void CAdjElasticityOutput::SetVolumeOutputFields(CConfig *config){
223240
AddVolumeOutput("SENSITIVITY-Z", "Sensitivity_z", "SENSITIVITY", "geometric sensitivity in the z direction");
224241
/// END_GROUP
225242

243+
if (!config->GetTime_Domain()) return;
244+
245+
/*--- Sensitivities with respect to initial conditions. ---*/
246+
247+
AddVolumeOutput("SENS_DISP-X", "SensInitialDisp_x", "SENSITIVITY_T0", "sensitivity to the initial x displacement");
248+
AddVolumeOutput("SENS_DISP-Y", "SensInitialDisp_y", "SENSITIVITY_T0", "sensitivity to the initial y displacement");
249+
if (nDim == 3)
250+
AddVolumeOutput("SENS_DISP-Z", "SensInitialDisp_z", "SENSITIVITY_T0", "sensitivity to the initial z displacement");
251+
252+
AddVolumeOutput("SENS_VEL-X", "SensInitialVel_x", "SENSITIVITY_T0", "sensitivity to the initial x velocity");
253+
AddVolumeOutput("SENS_VEL-Y", "SensInitialVel_y", "SENSITIVITY_T0", "sensitivity to the initial y velocity");
254+
if (nDim == 3)
255+
AddVolumeOutput("SENS_VEL-Z", "SensInitialVel_z", "SENSITIVITY_T0", "sensitivity to the initial z velocity");
256+
257+
AddVolumeOutput("SENS_ACCEL-X", "SensInitialAccel_x", "SENSITIVITY_T0", "sensitivity to the initial x acceleration");
258+
AddVolumeOutput("SENS_ACCEL-Y", "SensInitialAccel_y", "SENSITIVITY_T0", "sensitivity to the initial y acceleration");
259+
if (nDim == 3)
260+
AddVolumeOutput("SENS_ACCEL-Z", "SensInitialAccel_z", "SENSITIVITY_T0", "sensitivity to the initial z acceleration");
261+
226262
}

SU2_CFD/src/output/CFlowOutput.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -873,8 +873,8 @@ void CFlowOutput::SetCustomOutputs(const CSolver* const* solver, const CGeometry
873873
const auto varIdx = i % CustomOutput::MAX_VARS_PER_SOLVER;
874874
if (solIdx == FLOW_SOL) {
875875
return flowNodes->GetPrimitive(iPoint, varIdx);
876-
} return solver[solIdx]->GetNodes()->GetSolution(iPoint, varIdx);
877-
876+
}
877+
return solver[solIdx]->GetNodes()->GetSolution(iPoint, varIdx);
878878
} else {
879879
return *output.otherOutputs[i - CustomOutput::NOT_A_VARIABLE];
880880
}

SU2_CFD/src/solvers/CDiscAdjFEASolver.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,18 @@ CDiscAdjFEASolver::~CDiscAdjFEASolver() { delete nodes; }
125125
void CDiscAdjFEASolver::SetRecording(CGeometry* geometry, CConfig *config){
126126

127127
unsigned long iPoint;
128-
unsigned short iVar;
128+
unsigned short iDim, iVar;
129129

130130
/*--- Reset the solution to the initial (converged) solution ---*/
131131

132-
for (iPoint = 0; iPoint < nPoint; iPoint++)
132+
for (iPoint = 0; iPoint < nPoint; iPoint++) {
133133
for (iVar = 0; iVar < nVar; iVar++)
134134
direct_solver->GetNodes()->SetSolution(iPoint, iVar, nodes->GetSolution_Direct(iPoint)[iVar]);
135135

136+
auto Coord = geometry->nodes->GetCoord(iPoint);
137+
for (iDim = 0; iDim < nDim; iDim++) AD::ResetInput(Coord[iDim]);
138+
}
139+
136140
/*--- Reset the input for time n ---*/
137141

138142
if (config->GetTime_Domain()) {
@@ -198,6 +202,8 @@ void CDiscAdjFEASolver::RegisterVariables(CGeometry *geometry, CConfig *config,
198202
for (iVar = 0; iVar < nDV; iVar++) AD::ResetInput(DV[iVar]);
199203
}
200204

205+
direct_solver->GetNodes()->ResetInputFlowTraction();
206+
201207
if (!reset) {
202208
E.Register();
203209
Nu.Register();
@@ -294,7 +300,7 @@ void CDiscAdjFEASolver::ExtractAdjoint_Variables(CGeometry *geometry, CConfig *c
294300
if (config->GetnMarker_Fluid_Load() > 0) {
295301
for (unsigned long iPoint = 0; iPoint < nPoint; iPoint++){
296302
for (unsigned short iDim = 0; iDim < nDim; iDim++){
297-
su2double val_sens = direct_solver->GetNodes()->ExtractFlowTraction_Sensitivity(iPoint,iDim);
303+
su2double val_sens = direct_solver->GetNodes()->ExtractFlowTractionSensitivity(iPoint,iDim);
298304
nodes->SetFlowTractionSensitivity(iPoint, iDim, val_sens);
299305
}
300306
}
@@ -366,12 +372,12 @@ void CDiscAdjFEASolver::SetSensitivity(CGeometry *geometry, CConfig *config, CSo
366372

367373
for (unsigned long iPoint = 0; iPoint < nPoint; iPoint++) {
368374

369-
auto Coord = geometry->nodes->GetCoord(iPoint);
375+
//auto Coord = geometry->nodes->GetCoord(iPoint);
370376

371377
for (unsigned short iDim = 0; iDim < nDim; iDim++) {
372378

373379
su2double Sensitivity = geometry->nodes->GetAdjointSolution(iPoint, iDim);
374-
AD::ResetInput(Coord[iDim]);
380+
//AD::ResetInput(Coord[iDim]);
375381

376382
if (!time_domain) {
377383
nodes->SetSensitivity(iPoint, iDim, Sensitivity);

SU2_CFD/src/variables/CFEABoundVariable.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,10 @@ void CFEABoundVariable::RegisterFlowTraction() {
7575
for (unsigned long iVar = 0; iVar < nVar; iVar++)
7676
AD::RegisterInput(FlowTraction(iVertex,iVar));
7777
}
78+
79+
void CFEABoundVariable::ResetInputFlowTraction() {
80+
if (!fsi_analysis) return;
81+
for (unsigned long iVertex = 0; iVertex < FlowTraction.rows(); iVertex++)
82+
for (unsigned long iVar = 0; iVar < nVar; iVar++)
83+
AD::ResetInput(FlowTraction(iVertex,iVar));
84+
}

TestCases/parallel_regression_AD.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def main():
276276
discadj_fsi2.cfg_dir = "disc_adj_fsi/Airfoil_2d"
277277
discadj_fsi2.cfg_file = "config.cfg"
278278
discadj_fsi2.test_iter = 8
279-
discadj_fsi2.test_vals = [-4.349377, 0.128475, -1.303589, 7.5407e-09, 2.3244]
279+
discadj_fsi2.test_vals = [-4.349377, 0.189968, -1.303589, 7.5407e-09, 2.3244]
280280
discadj_fsi2.test_vals_aarch64 = [-3.479505, 0.127953, -1.303589, 7.5407e-09, 2.3244]
281281
discadj_fsi2.tol = 0.00001
282282
test_list.append(discadj_fsi2)
@@ -413,7 +413,7 @@ def main():
413413
pywrapper_Unst_FEA_AD.cfg_dir = "py_wrapper/custom_load_fea"
414414
pywrapper_Unst_FEA_AD.cfg_file = "config.cfg"
415415
pywrapper_Unst_FEA_AD.test_iter = 100
416-
pywrapper_Unst_FEA_AD.test_vals = [0.256684, 0.256684, 0.031988, 0.032015]
416+
pywrapper_Unst_FEA_AD.test_vals = [0.256684, 0.256684, 0.031988, 0.032015, -18.44906, -18.45085]
417417
pywrapper_Unst_FEA_AD.command = TestCase.Command("mpirun -n 2", "python", "run_ad.py")
418418
pywrapper_Unst_FEA_AD.timeout = 1600
419419
pywrapper_Unst_FEA_AD.tol = 0.00001

0 commit comments

Comments
 (0)