@@ -870,7 +870,9 @@ namespace dsf::mobility {
870870 " mean_speed_kph REAL, "
871871 " std_speed_kph REAL, "
872872 " mean_density_vpk REAL NOT NULL, "
873- " std_density_vpk REAL NOT NULL)" );
873+ " std_density_vpk REAL NOT NULL, "
874+ " mean_travel_time_s REAL, "
875+ " mean_queue_length REAL NOT NULL)" );
874876
875877 spdlog::info (" Initialized avg_stats table in the database." );
876878 }
@@ -1412,7 +1414,8 @@ namespace dsf::mobility {
14121414
14131415 void FirstOrderDynamics::evolve (bool const reinsert_agents) {
14141416 auto const n_threads{std::max<std::size_t >(1 , this ->concurrency ())};
1415- std::atomic<double > mean_speed{0 .}, mean_density{0 .};
1417+ std::atomic<double > mean_speed{0 .}, mean_density{0 .}, mean_traveltime{0 .},
1418+ mean_queue_length{0 .};
14161419 std::atomic<double > std_speed{0 .}, std_density{0 .};
14171420 std::atomic<std::size_t > nValidEdges{0 };
14181421 bool const bComputeStats = this ->database () != nullptr &&
@@ -1466,6 +1469,7 @@ namespace dsf::mobility {
14661469 m_evolveStreet (pStreet, reinsert_agents);
14671470 if (bComputeStats) {
14681471 auto const & density{pStreet->density () * 1e3 };
1472+ auto const & queueLength{pStreet->nExitingAgents ()};
14691473
14701474 auto const speedMeasure = pStreet->meanSpeed (true );
14711475 if (speedMeasure.is_valid ) {
@@ -1475,13 +1479,15 @@ namespace dsf::mobility {
14751479 mean_speed.fetch_add (speed, std::memory_order_relaxed);
14761480 std_speed.fetch_add (speed * speed + speed_std * speed_std,
14771481 std::memory_order_relaxed);
1478-
1482+ mean_traveltime.fetch_add (pStreet->length () / speedMeasure.mean ,
1483+ std::memory_order_relaxed);
14791484 ++nValidEdges;
14801485 }
14811486 }
14821487 if (m_bSaveAverageStats) {
14831488 mean_density.fetch_add (density, std::memory_order_relaxed);
14841489 std_density.fetch_add (density * density, std::memory_order_relaxed);
1490+ mean_queue_length.fetch_add (queueLength, std::memory_order_relaxed);
14851491 }
14861492
14871493 if (m_bSaveStreetData) {
@@ -1499,7 +1505,7 @@ namespace dsf::mobility {
14991505 record.stdSpeed = speedMeasure.std * 3.6 ;
15001506 record.nObservations = speedMeasure.n ;
15011507 }
1502- record.queueLength = pStreet-> nExitingAgents () ;
1508+ record.queueLength = queueLength ;
15031509 streetDataRecords.push_back (record);
15041510 }
15051511 }
@@ -1589,6 +1595,8 @@ namespace dsf::mobility {
15891595 if (m_bSaveAverageStats) { // Average Stats Table
15901596 mean_speed.store (mean_speed.load () / nValidEdges.load ());
15911597 mean_density.store (mean_density.load () / numEdges);
1598+ mean_traveltime.store (mean_traveltime.load () / nValidEdges.load ());
1599+ mean_queue_length.store (mean_queue_length.load () / numEdges);
15921600 {
15931601 double std_speed_val = std_speed.load ();
15941602 double mean_speed_val = mean_speed.load ();
@@ -1605,8 +1613,9 @@ namespace dsf::mobility {
16051613 *this ->database (),
16061614 " INSERT INTO avg_stats ("
16071615 " simulation_id, datetime, time_step, n_ghost_agents, n_agents, "
1608- " mean_speed_kph, std_speed_kph, mean_density_vpk, std_density_vpk) "
1609- " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)" );
1616+ " mean_speed_kph, std_speed_kph, mean_density_vpk, std_density_vpk, "
1617+ " mean_travel_time_s, mean_queue_length) "
1618+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" );
16101619 insertStmt.bind (1 , static_cast <std::int64_t >(this ->id ()));
16111620 insertStmt.bind (2 , this ->strDateTime ());
16121621 insertStmt.bind (3 , static_cast <std::int64_t >(this ->time_step ()));
@@ -1621,6 +1630,8 @@ namespace dsf::mobility {
16211630 }
16221631 insertStmt.bind (8 , mean_density);
16231632 insertStmt.bind (9 , std_density);
1633+ insertStmt.bind (10 , mean_traveltime);
1634+ insertStmt.bind (11 , mean_queue_length);
16241635 insertStmt.exec ();
16251636 }
16261637 // Special case: if m_savingInterval == 0, it was a triggered saveData() call, so we need to reset all flags
0 commit comments