@@ -234,10 +234,13 @@ bool CFluidIteration::Monitor(COutput* output, CIntegration**** integration, CGe
234234 }
235235 /* --- Update ramps, grid first then outlet boundary ---*/
236236 if (config[val_iZone]->GetRampMotionFrame ())
237- TurboRamp (geometry, config, config[val_iZone]->GetInnerIter (), val_iZone, TURBO_RAMP_TYPE::GRID);
238- if (config[val_iZone]->GetRampOutflow ())
239- TurboRamp (geometry, config, config[val_iZone]->GetInnerIter (), val_iZone, TURBO_RAMP_TYPE::BOUNDARY);
237+ UpdateRamp (geometry, config, config[val_iZone]->GetInnerIter (), val_iZone, RAMP_TYPE::GRID);
240238 }
239+
240+ // Outside turbo scope as Riemann boundaries can be ramped (pressure only)
241+ if (config[val_iZone]->GetRampOutflow ())
242+ UpdateRamp (geometry, config, config[val_iZone]->GetInnerIter (), val_iZone, RAMP_TYPE::BOUNDARY);
243+
241244 output->SetHistoryOutput (geometry[val_iZone][val_iInst][MESH_0], solver[val_iZone][val_iInst][MESH_0],
242245 config[val_iZone], config[val_iZone]->GetTimeIter (), config[val_iZone]->GetOuterIter (),
243246 config[val_iZone]->GetInnerIter ());
@@ -254,6 +257,81 @@ bool CFluidIteration::Monitor(COutput* output, CIntegration**** integration, CGe
254257 return StopCalc;
255258}
256259
260+ void CFluidIteration::UpdateRamp (CGeometry**** geometry_container, CConfig** config_container, unsigned long iter, unsigned short iZone, RAMP_TYPE ramp_flag) {
261+ /* --- Generic function for handling ramps ---*/
262+ // Grid updates (i.e. rotation/translation) handled seperately to boundary (i.e. pressure/mass flow) updates
263+ auto * config = config_container[iZone];
264+ auto * geometry = geometry_container[iZone][INST_0][ZONE_0];
265+
266+ std::string msg = " \n Updated rotating frame grid velocities for zone " ;
267+ if (ramp_flag == RAMP_TYPE::GRID && config->GetKind_GridMovement () == ENUM_GRIDMOVEMENT::STEADY_TRANSLATION)
268+ msg = " \n Updated translation frame grid velocities for zone " ;
269+
270+ if (config_container[ZONE_0]->GetMultizone_Problem ())
271+ iter = config_container[ZONE_0]->GetOuterIter ();
272+
273+ /* -- Update grid velocities (ROTATING_FRAME, STEADY_TRANSLATION)*/
274+ if (ramp_flag == RAMP_TYPE::GRID && config->GetGrid_Movement ()) {
275+ const auto ini_vel = config->GetRamp_Coeff (ramp_flag, RAMP_COEFF::INITIAL_VALUE);
276+ const auto unsigned rampFreq = SU2_TYPE::Int (config->GetRamp_Coeff (ramp_flag, RAMP_COEFF::UPDATE_FREQ));
277+ const auto unsigned finalRamp_Iter = SU2_TYPE::Int (config->GetRamp_Coeff (ramp_flag, RAMP_COEFF::FINAL_ITER));
278+
279+ // Two options needed as if finalRamp_Iter % rampFreq != 0 final value is not set correctly
280+ if ((iter % rampFreq == 0 && iter < finalRamp_Iter) || (iter == finalRamp_Iter)){
281+ const auto final_vel = config->GetFinalValue (ramp_flag);
282+ if (fabs (final_vel) > 0.0 ) {
283+ const auto vel = ini_vel + iter * (final_vel - ini_vel)/finalRamp_Iter;
284+ config->SetRate (vel);
285+ if (rank == MASTER_NODE && iter > 0 ) cout << msg << iZone << " .\n " ;
286+ geometry->SetVelocity (config, true );
287+ geometry->SetShroudVelocity (config);
288+ }
289+ // Update average turbo values
290+ geometry->SetAvgTurboValue (config, iZone, INFLOW, false );
291+ geometry->SetAvgTurboValue (config, iZone, OUTFLOW, false );
292+ geometry->GatherInOutAverageValues (config, false );
293+
294+ if (iZone < nZone - 1 ) {
295+ geometry_container[nZone-1 ][INST_0][MESH_0]->SetAvgTurboGeoValues (config ,geometry_container[iZone][INST_0][MESH_0], iZone);
296+ }
297+ }
298+ }
299+
300+ // Boundary ramps (pressure/mass flow)
301+ if (ramp_flag == RAMP_TYPE::BOUNDARY){
302+ const auto outVal_ini = config->GetRamp_Coeff (ramp_flag, RAMP_COEFF::INITIAL_VALUE);
303+ const long unsigned rampFreq = SU2_TYPE::Int (config->GetRamp_Coeff (ramp_flag, RAMP_COEFF::UPDATE_FREQ));
304+ const long unsigned finalRamp_Iter = SU2_TYPE::Int (config->GetRamp_Coeff (ramp_flag, RAMP_COEFF::FINAL_ITER));
305+ const auto outVal_final = config->GetFinalValue (ramp_flag);
306+
307+ if ((iter % rampFreq == 0 && iter < finalRamp_Iter) || (iter == finalRamp_Iter)) {
308+ const su2double outVal = outVal_ini + iter * (outVal_final - outVal_ini) / finalRamp_Iter;
309+ if (rank == MASTER_NODE) config->SetMonitorValue (outVal);
310+
311+ for (auto iMarker = 0 ; iMarker < config->GetnMarker_All (); iMarker++) {
312+ const auto KindBC = config->GetMarker_All_KindBC (iMarker);
313+ const auto Marker_Tag = config->GetMarker_All_TagBound (iMarker);
314+ unsigned short KindBCOption;
315+ switch (KindBC) {
316+ case RIEMANN_BOUNDARY:
317+ KindBCOption = config->GetKind_Data_Riemann (Marker_Tag);
318+ if (KindBCOption == STATIC_PRESSURE || KindBCOption == RADIAL_EQUILIBRIUM) {
319+ SU2_MPI::Error (" Outlet pressure ramp only implemented for NRBC" , CURRENT_FUNCTION);
320+ }
321+ break ;
322+ case GILES_BOUNDARY:
323+ KindBCOption = config->GetKind_Data_Giles (Marker_Tag);
324+ if (KindBCOption == STATIC_PRESSURE || KindBCOption == STATIC_PRESSURE_1D ||
325+ KindBCOption == RADIAL_EQUILIBRIUM || KindBCOption == MASS_FLOW_OUTLET) {
326+ config->SetGiles_Var1 (outVal, Marker_Tag);
327+ }
328+ break ;
329+ }
330+ }
331+ }
332+ }
333+ }
334+
257335void CFluidIteration::ComputeTurboPerformance (CSolver***** solver, CGeometry**** geometry_container, CConfig** config_container, unsigned long ExtIter) {
258336 unsigned short nDim = geometry_container[ZONE_0][INST_0][MESH_0]->GetnDim ();
259337 unsigned short nBladesRow = config_container[ZONE_0]->GetnMarker_Turbomachinery ();
0 commit comments