Skip to content

Commit d85d1fd

Browse files
committed
Merge branch 'develop' into feature_custom_source
2 parents a5013c6 + 02be3f6 commit d85d1fd

File tree

37 files changed

+938
-575
lines changed

37 files changed

+938
-575
lines changed

SU2_CFD/include/solvers/CFVMFlowSolverBase.inl

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,41 +1143,54 @@ void CFVMFlowSolverBase<V, FlowRegime>::BC_Sym_Plane(CGeometry* geometry, CSolve
11431143
for (auto iDim = 0u; iDim < nDim; iDim++) UnitNormal[iDim] = Normal[iDim] / Area;
11441144
}
11451145

1146-
su2double* V_reflected = GetCharacPrimVar(val_marker, iVertex);
1146+
/*--- Energy terms due to grid movement (aka work of pressure forces). ---*/
1147+
if (dynamic_grid) {
1148+
su2double* V_reflected = GetCharacPrimVar(val_marker, iVertex);
11471149

1148-
/*--- Grid movement ---*/
1149-
if (dynamic_grid)
1150-
conv_numerics->SetGridVel(geometry->nodes->GetGridVel(iPoint), geometry->nodes->GetGridVel(iPoint));
1150+
conv_numerics->SetGridVel(geometry->nodes->GetGridVel(iPoint),
1151+
geometry->nodes->GetGridVel(iPoint));
11511152

1152-
/*--- Normal vector for this vertex (negate for outward convention). ---*/
1153-
for (auto iDim = 0u; iDim < nDim; iDim++) Normal[iDim] = -Normal[iDim];
1154-
conv_numerics->SetNormal(Normal);
1153+
/*--- Normal vector for this vertex (negate for outward convention). ---*/
1154+
for (auto iDim = 0u; iDim < nDim; iDim++) Normal[iDim] = -Normal[iDim];
1155+
conv_numerics->SetNormal(Normal);
11551156

1156-
for (auto iVar = 0u; iVar < nPrimVar; iVar++)
1157-
V_reflected[iVar] = nodes->GetPrimitive(iPoint, iVar);
1157+
for (auto iVar = 0u; iVar < nPrimVar; iVar++)
1158+
V_reflected[iVar] = nodes->GetPrimitive(iPoint, iVar);
11581159

1159-
su2double ProjVelocity_i = nodes->GetProjVel(iPoint, UnitNormal);
1160-
/*--- Adjustment to v.n due to grid movement. ---*/
1161-
if (dynamic_grid)
1160+
su2double ProjVelocity_i = nodes->GetProjVel(iPoint, UnitNormal);
1161+
/*--- Adjustment to v.n due to grid movement. ---*/
11621162
ProjVelocity_i -= GeometryToolbox::DotProduct(nDim, geometry->nodes->GetGridVel(iPoint), UnitNormal);
11631163

1164-
for (auto iDim = 0u; iDim < nDim; iDim++)
1165-
V_reflected[iDim + iVel] = nodes->GetVelocity(iPoint, iDim) - ProjVelocity_i * UnitNormal[iDim];
1164+
for (auto iDim = 0u; iDim < nDim; iDim++)
1165+
V_reflected[iDim + iVel] = nodes->GetVelocity(iPoint, iDim) - ProjVelocity_i * UnitNormal[iDim];
11661166

1167-
/*--- Get current solution at this boundary node ---*/
1168-
const su2double* V_domain = nodes->GetPrimitive(iPoint);
1167+
/*--- Get current solution at this boundary node. ---*/
1168+
const su2double* V_domain = nodes->GetPrimitive(iPoint);
11691169

1170-
/*--- Set Primitive and Secondary for numerics class. ---*/
1171-
conv_numerics->SetPrimitive(V_domain, V_reflected);
1172-
conv_numerics->SetSecondary(nodes->GetSecondary(iPoint), nodes->GetSecondary(iPoint));
1170+
/*--- Set Primitive and Secondary for numerics class. ---*/
1171+
conv_numerics->SetPrimitive(V_domain, V_reflected);
1172+
conv_numerics->SetSecondary(nodes->GetSecondary(iPoint), nodes->GetSecondary(iPoint));
11731173

1174-
/*--- Compute the residual using an upwind scheme. ---*/
1175-
auto residual = conv_numerics->ComputeResidual(config);
1174+
/*--- Compute the residual using an upwind scheme. ---*/
1175+
auto residual = conv_numerics->ComputeResidual(config);
11761176

1177-
/*--- We include an update of the continuity and energy here, this is important for stability since
1178-
* these fluxes include numerical diffusion. ---*/
1179-
for (auto iVar = 0u; iVar < nVar; iVar++) {
1180-
if (iVar < iVel || iVar >= iVel + nDim) LinSysRes(iPoint, iVar) += residual.residual[iVar];
1177+
/*--- Use just the energy fluxes to update the residual, adding the others would
1178+
* increase numerical diffusion which we wish to avoid if possible. ---*/
1179+
for (auto iVar = iVel + nDim; iVar < nVar; iVar++) {
1180+
LinSysRes(iPoint, iVar) += residual.residual[iVar];
1181+
}
1182+
if (implicit) {
1183+
auto* block = Jacobian.GetBlock(iPoint, iPoint);
1184+
/*--- But in the Jacobian we also include the mass flux, this allows some cases with
1185+
* motion to use larger CFL, for example pywrapper_translating_naca0012. ---*/
1186+
for (auto iVar = 0u; iVar < nVar; iVar++) {
1187+
if (iVar < iVel || iVar >= iVel + nDim) {
1188+
for (auto jVar = 0u; jVar < nVar; jVar++) {
1189+
block[iVar * nVar + jVar] += SU2_TYPE::GetValue(residual.jacobian_i[iVar][jVar]);
1190+
}
1191+
}
1192+
}
1193+
}
11811194
}
11821195

11831196
/*--- Explicitly set the velocity components normal to the symmetry plane to zero.
@@ -1186,7 +1199,7 @@ void CFVMFlowSolverBase<V, FlowRegime>::BC_Sym_Plane(CGeometry* geometry, CSolve
11861199

11871200
su2double* solutionOld = nodes->GetSolution_Old(iPoint);
11881201

1189-
su2double gridVel[MAXNVAR] = {};
1202+
su2double gridVel[MAXNDIM] = {};
11901203
if (dynamic_grid) {
11911204
for (auto iDim = 0u; iDim < nDim; iDim++) {
11921205
gridVel[iDim] = geometry->nodes->GetGridVel(iPoint)[iDim];
@@ -1217,7 +1230,30 @@ void CFVMFlowSolverBase<V, FlowRegime>::BC_Sym_Plane(CGeometry* geometry, CSolve
12171230

12181231
/*--- Jacobian contribution for implicit integration. ---*/
12191232
if (implicit) {
1220-
Jacobian.AddBlock2Diag(iPoint, residual.jacobian_i);
1233+
/*--- Modify the Jacobians according to the modification of the residual
1234+
* J_new = (I - n * n^T) * J where n = {0, nx, ny, nz, 0, ...} ---*/
1235+
su2double mat[MAXNVAR * MAXNVAR] = {};
1236+
1237+
for (auto iVar = 0u; iVar < nVar; iVar++)
1238+
mat[iVar * nVar + iVar] = 1;
1239+
for (auto iDim = 0u; iDim < nDim; iDim++)
1240+
for (auto jDim = 0u; jDim < nDim; jDim++)
1241+
mat[(iDim + iVel) * nVar + jDim + iVel] -= UnitNormal[iDim] * UnitNormal[jDim];
1242+
1243+
auto ModifyJacobian = [&](const unsigned long jPoint) {
1244+
su2double jac[MAXNVAR * MAXNVAR], newJac[MAXNVAR * MAXNVAR];
1245+
auto* block = Jacobian.GetBlock(iPoint, jPoint);
1246+
for (auto iVar = 0u; iVar < nVar * nVar; iVar++) jac[iVar] = block[iVar];
1247+
1248+
CBlasStructure().gemm(nVar, nVar, nVar, mat, jac, newJac, config);
1249+
1250+
for (auto iVar = 0u; iVar < nVar * nVar; iVar++)
1251+
block[iVar] = SU2_TYPE::GetValue(newJac[iVar]);
1252+
};
1253+
ModifyJacobian(iPoint);
1254+
for (size_t iNeigh = 0; iNeigh < geometry->nodes->GetnPoint(iPoint); ++iNeigh) {
1255+
ModifyJacobian(geometry->nodes->GetPoint(iPoint, iNeigh));
1256+
}
12211257
}
12221258

12231259
/*--- Correction for multigrid. ---*/

SU2_CFD/include/solvers/CTurbSolver.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,11 @@ class CTurbSolver : public CScalarSolver<CTurbVariable> {
140140
Inlet_TurbVars[val_marker][val_vertex][val_dim] = val_turb_var;
141141
}
142142

143+
/*!
144+
* \brief Register additional In- or Outputs for RANS.
145+
* \param[in] input - Boolean whether In- or Output should be registered.
146+
* \param[in] config - The particular config.
147+
* \returns The number of extra variables.
148+
*/
149+
unsigned long RegisterSolutionExtra(bool input, const CConfig* config) final;
143150
};

SU2_CFD/include/variables/CTurbVariable.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,9 @@ class CTurbVariable : public CScalarVariable {
100100
*/
101101
inline void SetIntermittency(unsigned long iPoint, su2double val_intermittency) final { intermittency(iPoint) = val_intermittency; }
102102

103+
/*!
104+
* \brief Register eddy viscosity (muT) as Input or Output of an AD recording.
105+
* \param[in] input - Boolean whether In- or Output should be registered.
106+
*/
107+
void RegisterEddyViscosity(bool input);
103108
};
104-

SU2_CFD/include/variables/CVariable.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,20 @@ class CVariable {
137137
RegisterContainer(input, variable, &ad_index);
138138
}
139139

140+
void RegisterContainer(bool input, su2activevector& variable, su2vector<int>* ad_index = nullptr) {
141+
const auto nPoint = variable.rows();
142+
SU2_OMP_FOR_STAT(roundUpDiv(nPoint,omp_get_num_threads()))
143+
for (unsigned long iPoint = 0; iPoint < nPoint; ++iPoint) {
144+
145+
if (input) AD::RegisterInput(variable(iPoint));
146+
else AD::RegisterOutput(variable(iPoint));
147+
148+
if (ad_index) AD::SetIndex((*ad_index)(iPoint), variable(iPoint));
149+
150+
}
151+
END_SU2_OMP_FOR
152+
}
153+
140154
public:
141155
/*--- Disable copy and assignment. ---*/
142156
CVariable(const CVariable&) = delete;

SU2_CFD/src/solvers/CDiscAdjSolver.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ void CDiscAdjSolver::RegisterSolution(CGeometry *geometry, CConfig *config) {
162162
/*--- Boolean true indicates that an input is registered ---*/
163163
direct_solver->GetNodes()->RegisterSolution(true);
164164

165+
/*--- Register quantities that are no solver variables but further inputs/outputs of the (outer) iteration. ---*/
165166
direct_solver->RegisterSolutionExtra(true, config);
166167

167168
if (time_n_needed)

SU2_CFD/src/solvers/CSpeciesFlameletSolver.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ void CSpeciesFlameletSolver::Preprocessing(CGeometry* geometry, CSolver** solver
7777
auto* flowNodes = su2staticcast_p<CFlowVariable*>(solver_container[FLOW_SOL]->GetNodes());
7878

7979
/*--- Retrieve spark ignition parameters for spark-type ignition. ---*/
80-
if ((flamelet_config_options.ignition_method == FLAMELET_INIT_TYPE::SPARK) && !config->GetRestart()) {
80+
if ((flamelet_config_options.ignition_method == FLAMELET_INIT_TYPE::SPARK)) {
8181
auto spark_init = flamelet_config_options.spark_init;
8282
spark_iter_start = ceil(spark_init[4]);
8383
spark_duration = ceil(spark_init[5]);
8484
unsigned long iter = config->GetMultizone_Problem() ? config->GetOuterIter() : config->GetInnerIter();
85-
ignition = ((iter >= spark_iter_start) && (iter <= (spark_iter_start + spark_duration)) && !config->GetRestart());
85+
ignition = ((iter >= spark_iter_start) && (iter <= (spark_iter_start + spark_duration)));
8686
}
8787

8888
SU2_OMP_SAFE_GLOBAL_ACCESS(config->SetGlobalParam(config->GetKind_Solver(), RunTime_EqSystem);)
@@ -100,7 +100,7 @@ void CSpeciesFlameletSolver::Preprocessing(CGeometry* geometry, CSolver** solver
100100
/*--- Apply source terms within spark radius. ---*/
101101
su2double dist_from_center = 0,
102102
spark_radius = flamelet_config_options.spark_init[3];
103-
dist_from_center = GeometryToolbox::SquaredDistance(nDim, geometry->nodes->GetCoord(i_point), flamelet_config_options.flame_init.data());
103+
dist_from_center = GeometryToolbox::SquaredDistance(nDim, geometry->nodes->GetCoord(i_point), flamelet_config_options.spark_init.data());
104104
if (dist_from_center < pow(spark_radius,2)) {
105105
for (auto iVar = 0u; iVar < nVar; iVar++)
106106
nodes->SetScalarSource(i_point, iVar, nodes->GetScalarSources(i_point)[iVar] + flamelet_config_options.spark_reaction_rates[iVar]);

SU2_CFD/src/solvers/CTurbSolver.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,3 +236,12 @@ void CTurbSolver::Impose_Fixed_Values(const CGeometry *geometry, const CConfig *
236236
}
237237

238238
}
239+
240+
unsigned long CTurbSolver::RegisterSolutionExtra(bool input, const CConfig* config) {
241+
242+
/*--- Register muT as input/output of a RANS iteration. ---*/
243+
nodes->RegisterEddyViscosity(input);
244+
245+
/*--- We don't need to save adjoint values for muT. ---*/
246+
return 0;
247+
}

SU2_CFD/src/variables/CNSVariable.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ void CNSVariable::SetRoe_Dissipation_FD(unsigned long iPoint, su2double val_wall
114114
AD::SetPreaccIn(Primitive(iPoint, indices.EddyViscosity()));
115115
/*--- Laminar viscosity --- */
116116
AD::SetPreaccIn(Primitive(iPoint, indices.LaminarViscosity()));
117+
/*--- Density; GetDensity reads from Solution (not Primitive) at index 0 ---*/
118+
AD::SetPreaccIn(Solution(iPoint, 0));
117119

118120
su2double uijuij = 0.0;
119121

SU2_CFD/src/variables/CTurbVariable.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,7 @@ CTurbVariable::CTurbVariable(unsigned long npoint, unsigned long ndim, unsigned
3636
intermittency.resize(nPoint) = su2double(1.0);
3737

3838
}
39+
40+
void CTurbVariable::RegisterEddyViscosity(bool input) {
41+
RegisterContainer(input, muT);
42+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
ITER, avg_dp
2-
1, 63.82289754521027
2+
1, 64.90301114659223

0 commit comments

Comments
 (0)