Skip to content

Commit b1147bd

Browse files
author
rois1995
committed
Merge remote-tracking branch 'origin/develop' into feature_Trans_SLM
2 parents 5fb0cb9 + 02be3f6 commit b1147bd

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
@@ -1141,41 +1141,54 @@ void CFVMFlowSolverBase<V, FlowRegime>::BC_Sym_Plane(CGeometry* geometry, CSolve
11411141
for (auto iDim = 0u; iDim < nDim; iDim++) UnitNormal[iDim] = Normal[iDim] / Area;
11421142
}
11431143

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

1146-
/*--- Grid movement ---*/
1147-
if (dynamic_grid)
1148-
conv_numerics->SetGridVel(geometry->nodes->GetGridVel(iPoint), geometry->nodes->GetGridVel(iPoint));
1148+
conv_numerics->SetGridVel(geometry->nodes->GetGridVel(iPoint),
1149+
geometry->nodes->GetGridVel(iPoint));
11491150

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

1154-
for (auto iVar = 0u; iVar < nPrimVar; iVar++)
1155-
V_reflected[iVar] = nodes->GetPrimitive(iPoint, iVar);
1155+
for (auto iVar = 0u; iVar < nPrimVar; iVar++)
1156+
V_reflected[iVar] = nodes->GetPrimitive(iPoint, iVar);
11561157

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

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

1165-
/*--- Get current solution at this boundary node ---*/
1166-
const su2double* V_domain = nodes->GetPrimitive(iPoint);
1165+
/*--- Get current solution at this boundary node. ---*/
1166+
const su2double* V_domain = nodes->GetPrimitive(iPoint);
11671167

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

1172-
/*--- Compute the residual using an upwind scheme. ---*/
1173-
auto residual = conv_numerics->ComputeResidual(config);
1172+
/*--- Compute the residual using an upwind scheme. ---*/
1173+
auto residual = conv_numerics->ComputeResidual(config);
11741174

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

11811194
/*--- Explicitly set the velocity components normal to the symmetry plane to zero.
@@ -1184,7 +1197,7 @@ void CFVMFlowSolverBase<V, FlowRegime>::BC_Sym_Plane(CGeometry* geometry, CSolve
11841197

11851198
su2double* solutionOld = nodes->GetSolution_Old(iPoint);
11861199

1187-
su2double gridVel[MAXNVAR] = {};
1200+
su2double gridVel[MAXNDIM] = {};
11881201
if (dynamic_grid) {
11891202
for (auto iDim = 0u; iDim < nDim; iDim++) {
11901203
gridVel[iDim] = geometry->nodes->GetGridVel(iPoint)[iDim];
@@ -1215,7 +1228,30 @@ void CFVMFlowSolverBase<V, FlowRegime>::BC_Sym_Plane(CGeometry* geometry, CSolve
12151228

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

12211257
/*--- 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)