Skip to content

Commit

Permalink
can now parse parameteric curve coefficients. refs #14258
Browse files Browse the repository at this point in the history
  • Loading branch information
namdre committed Feb 26, 2024
1 parent 2d88a4b commit abafd35
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 17 deletions.
59 changes: 50 additions & 9 deletions src/microsim/cfmodels/MSCFModel_Rail.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,20 @@

double
MSCFModel_Rail::TrainParams::getResistance(double speed) const {
if (resistance.size() > 1) {
return getInterpolatedValueFromLookUpMap(speed, &resistance); // kN
if (resCoef_constant != INVALID_DOUBLE) {
return (resCoef_quadratic * speed * speed + resCoef_linear * speed + resCoef_constant) / 1000; // kN
} else {
return 0;
return getInterpolatedValueFromLookUpMap(speed, &resistance); // kN
}
}


double
MSCFModel_Rail::TrainParams::getTraction(double speed) const {
if (traction.size() > 1) {
return getInterpolatedValueFromLookUpMap(speed, &traction); // kN
if (maxPower != INVALID_DOUBLE) {
return MIN2(maxPower / speed * 3.6, maxTraction); // kN
} else {
return 0;
return getInterpolatedValueFromLookUpMap(speed, &traction); // kN
}
}

Expand Down Expand Up @@ -81,6 +81,8 @@ MSCFModel_Rail::MSCFModel_Rail(const MSVehicleType* vtype) :
myTrainParams = initMireoPlusB2TParams();
} else if (trainType.compare("MireoPlusH") == 0) {
myTrainParams = initMireoPlusH2TParams();
} else if (trainType.compare("custom") == 0) {
myTrainParams = initCustomParams();
} else {
WRITE_ERRORF(TL("Unknown train type: %. Exiting!"), trainType);
throw ProcessError();
Expand All @@ -96,19 +98,22 @@ MSCFModel_Rail::MSCFModel_Rail(const MSVehicleType* vtype) :
// kg to tons
myTrainParams.weight = vtype->getMass() / 1000;
}
myTrainParams.mf = vtype->getParameter().getCFParam(SUMO_ATTR_MASSFACTOR, myTrainParams.mf);
myTrainParams.decl = vtype->getParameter().getCFParam(SUMO_ATTR_DECEL, myTrainParams.decl);
setMaxDecel(myTrainParams.decl);
setEmergencyDecel(vtype->getParameter().getCFParam(SUMO_ATTR_EMERGENCYDECEL, myTrainParams.decl + 0.3));
// update type parameters so they are shown correctly in the gui (if defaults from trainType are used)
const_cast<MSVehicleType*>(vtype)->setMaxSpeed(myTrainParams.vmax);
const_cast<MSVehicleType*>(vtype)->setLength(myTrainParams.length);

// init curves
// init tabular curves
std::vector<double> speedTable = getValueTable(vtype, SUMO_ATTR_SPEED_TABLE);
std::vector<double> tractionTable = getValueTable(vtype, SUMO_ATTR_TRACTION_TABLE);
std::vector<double> resistanceTable = getValueTable(vtype, SUMO_ATTR_RESISTANCE_TABLE);
if (speedTable.size() > 0) {
if (speedTable.size() != tractionTable.size()) {
if (speedTable.size() > 0 || tractionTable.size() > 0 || resistanceTable.size() > 0) {
if (speedTable.size() == 1) {
throw ProcessError(TLF("Invalid size of speedTable for vType '%' (at least 2 values are required).", vtype->getID()));
} else if (speedTable.size() != tractionTable.size()) {
throw ProcessError(TLF("Mismatching size of speedTable and tractionTable for vType '%'.", vtype->getID()));
} else if (speedTable.size() != resistanceTable.size()) {
throw ProcessError(TLF("Mismatching size of speedTable and resistanceTable for vType '%'.", vtype->getID()));
Expand All @@ -120,8 +125,44 @@ MSCFModel_Rail::MSCFModel_Rail(const MSVehicleType* vtype) :
myTrainParams.resistance[speedTable[i]] = resistanceTable[i];
}
}

// init parametric curves
myTrainParams.maxPower = vtype->getParameter().getCFParam(SUMO_ATTR_MAXPOWER, INVALID_DOUBLE);
myTrainParams.maxTraction = vtype->getParameter().getCFParam(SUMO_ATTR_MAXTRACTION, INVALID_DOUBLE);
myTrainParams.resCoef_constant = vtype->getParameter().getCFParam(SUMO_ATTR_RESISTANCE_COEFFICIENT_CONSTANT, INVALID_DOUBLE);
myTrainParams.resCoef_linear = vtype->getParameter().getCFParam(SUMO_ATTR_RESISTANCE_COEFFICIENT_LINEAR, INVALID_DOUBLE);
myTrainParams.resCoef_quadratic = vtype->getParameter().getCFParam(SUMO_ATTR_RESISTANCE_COEFFICIENT_QUADRATIC, INVALID_DOUBLE);

if (myTrainParams.maxPower != INVALID_DOUBLE && myTrainParams.maxTraction == INVALID_DOUBLE) {
throw ProcessError(TLF("Undefined maxPower for vType '%'.", vtype->getID()));
} else if (myTrainParams.maxPower == INVALID_DOUBLE && myTrainParams.maxTraction != INVALID_DOUBLE) {
throw ProcessError(TLF("Undefined maxTraction for vType '%'.", vtype->getID()));
}
if (myTrainParams.maxPower != INVALID_DOUBLE && tractionTable.size() > 0) {
WRITE_WARNING(TLF("Ignoring tractionTable because maxPower and maxTraction are set for vType '%'.", vtype->getID()));
}
const bool hasSomeResCoef = (myTrainParams.resCoef_constant != INVALID_DOUBLE
|| myTrainParams.resCoef_linear != INVALID_DOUBLE
|| myTrainParams.resCoef_quadratic != INVALID_DOUBLE);
const bool hasAllResCoef = (myTrainParams.resCoef_constant != INVALID_DOUBLE
&& myTrainParams.resCoef_linear != INVALID_DOUBLE
&& myTrainParams.resCoef_quadratic != INVALID_DOUBLE);
if (hasSomeResCoef && !hasAllResCoef) {
throw ProcessError(TLF("Some undefined resistance coefficients for vType '%' (requires resCoef_constant, resCoef_linear and resCoef_quadratic)", vtype->getID()));
}
if (myTrainParams.resCoef_constant != INVALID_DOUBLE && resistanceTable.size() > 0) {
WRITE_WARNING(TLF("Ignoring resistanceTable because resistance coefficents are set for vType '%'.", vtype->getID()));
}

if (myTrainParams.traction.empty() && myTrainParams.maxPower == INVALID_DOUBLE) {
throw ProcessError(TLF("Either tractionTable or maxPower must be defined for vType '%' with Rail model type '%'.", vtype->getID(), trainType));
}
if (myTrainParams.resistance.empty() && myTrainParams.resCoef_constant == INVALID_DOUBLE) {
throw ProcessError(TLF("Either resistanceTable or resCoef_constant must be defined for vType '%' with Rail model type '%'.", vtype->getID(), trainType));
}
}


MSCFModel_Rail::~MSCFModel_Rail() { }


Expand Down
16 changes: 16 additions & 0 deletions src/microsim/cfmodels/MSCFModel_Rail.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ class MSCFModel_Rail : public MSCFModel {
double recovery;
LookUpMap traction;
LookUpMap resistance;
double maxPower;
double maxTraction;
double resCoef_constant;
double resCoef_linear;
double resCoef_quadratic;

double getRotWeight() const {
return weight * mf;
Expand Down Expand Up @@ -851,6 +856,17 @@ class MSCFModel_Rail : public MSCFModel {
params.resistance = initMireoPlusH2TResistance();
return params;
}

TrainParams initCustomParams() const {
TrainParams params;
params.weight = 100;
params.mf = 1.05;
params.length = 100;
params.decl = 1;
params.vmax = 200 / 3.6;
params.recovery = 0.3;
return params;
}
// void initVehicleVariables(const MSVehicle *const pVehicle, MSCFModel_Rail::VehicleVariables *pVariables)const;

};
6 changes: 6 additions & 0 deletions src/utils/vehicle/SUMOVehicleParserHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1400,6 +1400,12 @@ SUMOVehicleParserHelper::getAllowedCFModelAttrs() {
railParams.insert(SUMO_ATTR_SPEED_TABLE);
railParams.insert(SUMO_ATTR_TRACTION_TABLE);
railParams.insert(SUMO_ATTR_RESISTANCE_TABLE);
railParams.insert(SUMO_ATTR_MASSFACTOR);
railParams.insert(SUMO_ATTR_MAXPOWER);
railParams.insert(SUMO_ATTR_MAXTRACTION);
railParams.insert(SUMO_ATTR_RESISTANCE_COEFFICIENT_CONSTANT);
railParams.insert(SUMO_ATTR_RESISTANCE_COEFFICIENT_LINEAR);
railParams.insert(SUMO_ATTR_RESISTANCE_COEFFICIENT_QUADRATIC);
allowedCFModelAttrs[SUMO_TAG_CF_RAIL] = railParams;
allParams.insert(railParams.begin(), railParams.end());
// ACC
Expand Down
25 changes: 20 additions & 5 deletions src/utils/xml/SUMOXMLDefinitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,7 @@ StringBijection<int>::Entry SUMOXMLDefinitions::attrs[] = {
{ "shutOffAutoDuration", SUMO_ATTR_SHUT_OFF_AUTO },
{ "loading", SUMO_ATTR_LOADING },

/// @name carFollow model attributes
{ "sigma", SUMO_ATTR_SIGMA },
{ "sigmaStep", SUMO_ATTR_SIGMA_STEP },
{ "startupDelay", SUMO_ATTR_STARTUP_DELAY },
Expand Down Expand Up @@ -644,11 +645,20 @@ StringBijection<int>::Entry SUMOXMLDefinitions::attrs[] = {
{ "speedControlMinGap", SUMO_ATTR_SC_MIN_GAP },
{ "applyDriverState", SUMO_ATTR_APPLYDRIVERSTATE },

{ "trainType", SUMO_ATTR_TRAIN_TYPE },
{ "speedTable", SUMO_ATTR_SPEED_TABLE },
{ "tractionTable", SUMO_ATTR_TRACTION_TABLE },
{ "resistanceTable", SUMO_ATTR_RESISTANCE_TABLE },

{ "trainType", SUMO_ATTR_TRAIN_TYPE },
{ "speedTable", SUMO_ATTR_SPEED_TABLE },
{ "tractionTable", SUMO_ATTR_TRACTION_TABLE },
{ "resistanceTable", SUMO_ATTR_RESISTANCE_TABLE },
{ "massFactor", SUMO_ATTR_MASSFACTOR },
{ "maxPower", SUMO_ATTR_MAXPOWER },
{ "maxTraction", SUMO_ATTR_MAXTRACTION },
{ "resCoef_constant", SUMO_ATTR_RESISTANCE_COEFFICIENT_CONSTANT },
{ "resCoef_linear", SUMO_ATTR_RESISTANCE_COEFFICIENT_LINEAR },
{ "resCoef_quadratic", SUMO_ATTR_RESISTANCE_COEFFICIENT_QUADRATIC },
/// @}

/// @name Lane changing model attributes
/// @{
{ "lcStrategic", SUMO_ATTR_LCA_STRATEGIC_PARAM },
{ "lcCooperative", SUMO_ATTR_LCA_COOPERATIVE_PARAM },
{ "lcSpeedGain", SUMO_ATTR_LCA_SPEEDGAIN_PARAM },
Expand Down Expand Up @@ -676,7 +686,10 @@ StringBijection<int>::Entry SUMOXMLDefinitions::attrs[] = {
{ "lcKeepRightAcceptanceTime", SUMO_ATTR_LCA_KEEPRIGHT_ACCEPTANCE_TIME },
{ "lcOvertakeDeltaSpeedFactor", SUMO_ATTR_LCA_OVERTAKE_DELTASPEED_FACTOR },
{ "lcExperimental1", SUMO_ATTR_LCA_EXPERIMENTAL1 },
/// @}

/// @name junction model attributes
/// @{
{ "jmCrossingGap", SUMO_ATTR_JM_CROSSING_GAP },
{ "jmDriveAfterYellowTime", SUMO_ATTR_JM_DRIVE_AFTER_YELLOW_TIME },
{ "jmDriveAfterRedTime", SUMO_ATTR_JM_DRIVE_AFTER_RED_TIME },
Expand All @@ -692,6 +705,7 @@ StringBijection<int>::Entry SUMOXMLDefinitions::attrs[] = {
{ "junctionModel.ignoreTypes", SUMO_ATTR_JM_IGNORE_TYPES },
{ "carFollowModel.ignoreIDs", SUMO_ATTR_CF_IGNORE_IDS },
{ "carFollowModel.ignoreTypes", SUMO_ATTR_CF_IGNORE_TYPES },
/// @}

{ "last", SUMO_ATTR_LAST },
{ "cost", SUMO_ATTR_COST },
Expand Down Expand Up @@ -1297,6 +1311,7 @@ StringBijection<LaneChangeAction>::Entry SUMOXMLDefinitions::laneChangeActionVal
};

StringBijection<TrainType>::Entry SUMOXMLDefinitions::trainTypeValues[] = {
{ "custom", TrainType::CUSTOM },
{ "NGT400", TrainType::NGT400 },
{ "NGT400_16", TrainType::NGT400_16 },
{ "RB425", TrainType::RB425 },
Expand Down
10 changes: 7 additions & 3 deletions src/utils/xml/SUMOXMLDefinitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -955,10 +955,13 @@ enum SumoXMLAttr {
SUMO_ATTR_SPEED_TABLE, // list of speeds for traction and resistance value tables
SUMO_ATTR_TRACTION_TABLE, // list of traction values for the speeds table
SUMO_ATTR_RESISTANCE_TABLE, // list of resistance values for the speeds table
/// @}
SUMO_ATTR_MASSFACTOR,
SUMO_ATTR_MAXPOWER,
SUMO_ATTR_MAXTRACTION,
SUMO_ATTR_RESISTANCE_COEFFICIENT_CONSTANT,
SUMO_ATTR_RESISTANCE_COEFFICIENT_LINEAR,
SUMO_ATTR_RESISTANCE_COEFFICIENT_QUADRATIC,

/// @name Lane changing model attributes
/// @{
SUMO_ATTR_LCA_STRATEGIC_PARAM,
SUMO_ATTR_LCA_COOPERATIVE_PARAM,
SUMO_ATTR_LCA_SPEEDGAIN_PARAM,
Expand Down Expand Up @@ -1870,6 +1873,7 @@ enum class LaneChangeModel {

/// @enum train types
enum class TrainType {
CUSTOM,
NGT400,
NGT400_16,
RB425,
Expand Down

0 comments on commit abafd35

Please sign in to comment.