mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 03:59:19 +02:00
state_manager: Optimize computation of pressure flow for Oerlikon ESt valves
TNESt3::GetPF() is a *major* hotspot in simulation state update. The leading cause is the use of typeid (RTTI) which is implemented in the C++ runtime essentially as a string compare. This change eliminates the use of typeid and instead caches statically typed pointers for the few TPrzekladnik subclass objects that need their parameters adjusted in TNESt3::GetPF(). As a bonus some virtual methods on TPrzekladnik can now be removed. Overall this change reduces the TNESt3::GetPF() contribution from about 25% to 16%.
This commit is contained in:
@@ -237,26 +237,24 @@ double TNESt3::GetPF( double const PP, double const dt, double const Vel ) // pr
|
|||||||
BrakeRes->Flow(dV);
|
BrakeRes->Flow(dV);
|
||||||
|
|
||||||
for (int i = 1; i < 4; ++i)
|
for (int i = 1; i < 4; ++i)
|
||||||
{
|
|
||||||
Przekladniki[i]->Update(dt);
|
Przekladniki[i]->Update(dt);
|
||||||
if (typeid(*Przekladniki[i]) == typeid(TRapid))
|
|
||||||
{
|
if( PrzekRapid != nullptr ) {
|
||||||
RapidStatus = (BrakeDelayFlag & bdelay_R) == bdelay_R && (std::abs(Vel) > 70.0 || (std::abs(Vel) > 50.0 && RapidStatus) || RapidStaly);
|
RapidStatus = (BrakeDelayFlag & bdelay_R) == bdelay_R && (std::abs(Vel) > 70.0 || (std::abs(Vel) > 50.0 && RapidStatus) || RapidStaly);
|
||||||
Przekladniki[i]->SetRapidStatus(RapidStatus);
|
PrzekRapid->SetRapidStatus(RapidStatus);
|
||||||
}
|
|
||||||
else if( typeid( *Przekladniki[i] ) == typeid( TPrzeciwposlizg ) )
|
|
||||||
Przekladniki[i]->SetPoslizg((BrakeStatus & b_asb) == b_asb);
|
|
||||||
else if( typeid( *Przekladniki[ i ] ) == typeid( TPrzekED ) ) {
|
|
||||||
if( Vel < -15.0 )
|
|
||||||
Przekladniki[ i ]->SetP( 0.0 );
|
|
||||||
else
|
|
||||||
Przekladniki[ i ]->SetP( MaxBP * 3.0 );
|
|
||||||
}
|
|
||||||
else if( typeid( *Przekladniki[i] ) == typeid( TPrzekCiagly ) )
|
|
||||||
Przekladniki[i]->SetMult(LoadC);
|
|
||||||
else if( typeid( *Przekladniki[i] ) == typeid( TPrzek_PZZ ) )
|
|
||||||
Przekladniki[i]->SetLBP(LBP);
|
|
||||||
}
|
}
|
||||||
|
if( PrzekPoslizg != nullptr )
|
||||||
|
PrzekPoslizg->SetPoslizg((BrakeStatus & b_asb) == b_asb);
|
||||||
|
if( PrzekED != nullptr ) {
|
||||||
|
if( Vel < -15.0 )
|
||||||
|
PrzekED->SetP( 0.0 );
|
||||||
|
else
|
||||||
|
PrzekED->SetP( MaxBP * 3.0 );
|
||||||
|
}
|
||||||
|
if( PrzekCiagly != nullptr )
|
||||||
|
PrzekCiagly->SetMult(LoadC);
|
||||||
|
if( PrzekPZZ != nullptr )
|
||||||
|
PrzekPZZ->SetLBP(LBP);
|
||||||
|
|
||||||
// przeplyw testowy miedzypojemnosci
|
// przeplyw testowy miedzypojemnosci
|
||||||
dV = PF(MPP, VVP, BVs(BCP)) + PF(MPP, CVP, CVs(BCP));
|
dV = PF(MPP, VVP, BVs(BCP)) + PF(MPP, CVP, CVs(BCP));
|
||||||
@@ -458,6 +456,12 @@ void TNESt3::SetSize( int const size, std::string const ¶ms ) // ustawianie
|
|||||||
static double const dOO1l = 0.907;
|
static double const dOO1l = 0.907;
|
||||||
static double const dOT1l = 0.524;
|
static double const dOT1l = 0.524;
|
||||||
|
|
||||||
|
PrzekRapid.reset();
|
||||||
|
PrzekPoslizg.reset();
|
||||||
|
PrzekED.reset();
|
||||||
|
PrzekCiagly.reset();
|
||||||
|
PrzekPZZ.reset();
|
||||||
|
|
||||||
if (contains( params, "ESt3" ) )
|
if (contains( params, "ESt3" ) )
|
||||||
{
|
{
|
||||||
Podskok = 0.7;
|
Podskok = 0.7;
|
||||||
@@ -467,23 +471,27 @@ void TNESt3::SetSize( int const size, std::string const ¶ms ) // ustawianie
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Podskok = -1.0;
|
Podskok = -1.0;
|
||||||
Przekladniki[1] = std::make_shared<TRapid>();
|
Przekladniki[1] = PrzekRapid = std::make_shared<TRapid>();
|
||||||
if (contains( params, "-s216" ) )
|
|
||||||
Przekladniki[1]->SetRapidParams(2, 16);
|
|
||||||
else
|
|
||||||
Przekladniki[1]->SetRapidParams(2, 0);
|
|
||||||
Przekladniki[3] = std::make_shared<TPrzeciwposlizg>();
|
|
||||||
if (contains( params,"-ED") )
|
if (contains( params,"-ED") )
|
||||||
{
|
{
|
||||||
Przekladniki[1]->SetRapidParams(2, 18);
|
PrzekRapid->SetRapidParams(2, 18);
|
||||||
Przekladniki[3] = std::make_shared<TPrzekED>();
|
Przekladniki[3] = PrzekED = std::make_shared<TPrzekED>();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (contains( params, "-s216" ) )
|
||||||
|
PrzekRapid->SetRapidParams(2, 16);
|
||||||
|
else
|
||||||
|
PrzekRapid->SetRapidParams(2, 0);
|
||||||
|
Przekladniki[3] = PrzekPoslizg = std::make_shared<TPrzeciwposlizg>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (contains(params,"AL2") )
|
if (contains(params,"AL2") )
|
||||||
Przekladniki[2] = std::make_shared<TPrzekCiagly>();
|
Przekladniki[2] = PrzekCiagly = std::make_shared<TPrzekCiagly>();
|
||||||
else if (contains(params,"PZZ") )
|
else if (contains(params,"PZZ") )
|
||||||
Przekladniki[2] = std::make_shared<TPrzek_PZZ>();
|
Przekladniki[2] = PrzekPZZ = std::make_shared<TPrzek_PZZ>();
|
||||||
else
|
else
|
||||||
Przekladniki[2] = std::make_shared<TRura>();
|
Przekladniki[2] = std::make_shared<TRura>();
|
||||||
|
|
||||||
|
|||||||
@@ -76,12 +76,6 @@ class TPrzekladnik : public TReservoir // przekladnik (powtarzacz)
|
|||||||
|
|
||||||
TPrzekladnik() : TReservoir() {};
|
TPrzekladnik() : TReservoir() {};
|
||||||
virtual void Update(double dt);
|
virtual void Update(double dt);
|
||||||
virtual void SetPoslizg(bool flag) {};
|
|
||||||
virtual void SetP(double P) {};
|
|
||||||
virtual void SetMult(double m) {};
|
|
||||||
virtual void SetLBP(double P) {};
|
|
||||||
virtual void SetRapidParams(double mult, double size) {};
|
|
||||||
virtual void SetRapidStatus(bool rs) {};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class TRura : public TPrzekladnik // nieprzekladnik, rura laczaca
|
class TRura : public TPrzekladnik // nieprzekladnik, rura laczaca
|
||||||
@@ -185,7 +179,13 @@ class TNESt3 : public TBrake {
|
|||||||
private:
|
private:
|
||||||
std::shared_ptr<TReservoir> CntrlRes; // zbiornik sterujacy
|
std::shared_ptr<TReservoir> CntrlRes; // zbiornik sterujacy
|
||||||
std::shared_ptr<TReservoir> Miedzypoj; // pojemnosc posrednia (urojona) do napelniania ZP i ZS
|
std::shared_ptr<TReservoir> Miedzypoj; // pojemnosc posrednia (urojona) do napelniania ZP i ZS
|
||||||
std::shared_ptr<TPrzekladnik> Przekladniki[ 4 ];
|
std::shared_ptr<TPrzekladnik> Przekladniki[ 4 ]; // indeksowane od 1, indeks jest zarazem pojemnoscia
|
||||||
|
// bezposrednie wskazniki do przekladnikow dostrajanych w GetPF, inicjowane przy tworzeniu
|
||||||
|
std::shared_ptr<TRapid> PrzekRapid;
|
||||||
|
std::shared_ptr<TPrzeciwposlizg> PrzekPoslizg;
|
||||||
|
std::shared_ptr<TPrzekED> PrzekED;
|
||||||
|
std::shared_ptr<TPrzekCiagly> PrzekCiagly;
|
||||||
|
std::shared_ptr<TPrzek_PZZ> PrzekPZZ;
|
||||||
double Nozzles[ dMAX ]; // dysze
|
double Nozzles[ dMAX ]; // dysze
|
||||||
double BVM = 0.0; // przelozenie PG-CH
|
double BVM = 0.0; // przelozenie PG-CH
|
||||||
// ValveFlag: byte; //polozenie roznych zaworkow
|
// ValveFlag: byte; //polozenie roznych zaworkow
|
||||||
|
|||||||
Reference in New Issue
Block a user