|
| 1 | +#include "ode_seir/model.h" |
| 2 | +#include "ode_seir/infection_state.h" |
| 3 | +#include "ode_seir/parameters.h" |
| 4 | +#include "memilio/compartments/simulation.h" |
| 5 | +#include "memilio/utils/logging.h" |
| 6 | + |
| 7 | +int main() |
| 8 | +{ |
| 9 | + mio::set_log_level(mio::LogLevel::debug); |
| 10 | + |
| 11 | + double t0 = 0; |
| 12 | + double tmax = 50; |
| 13 | + double dt = 0.001; |
| 14 | + |
| 15 | + mio::log_info("Simulating SEIR; t={} ... {} with dt = {}.", t0, tmax, dt); |
| 16 | + |
| 17 | + double cont_freq = 10; |
| 18 | + |
| 19 | + double nb_total_t0 = 10000, nb_exp_t0 = 100, nb_inf_t0 = 50, nb_rec_t0 = 10; |
| 20 | + const size_t num_groups = 3; |
| 21 | + |
| 22 | + mio::oseir::Model model(num_groups); |
| 23 | + double fact = 1.0 / num_groups; |
| 24 | + |
| 25 | + auto& params = model.parameters; |
| 26 | + |
| 27 | + for (auto i = mio::AgeGroup(0); i < mio::AgeGroup(num_groups); i++) { |
| 28 | + model.populations[{i, mio::oseir::InfectionState::Exposed}] = fact * nb_exp_t0; |
| 29 | + model.populations[{i, mio::oseir::InfectionState::Infected}] = fact * nb_inf_t0; |
| 30 | + model.populations[{i, mio::oseir::InfectionState::Recovered}] = fact * nb_rec_t0; |
| 31 | + model.populations.set_difference_from_group_total<mio::AgeGroup>({i, mio::oseir::InfectionState::Susceptible}, |
| 32 | + fact * nb_total_t0); |
| 33 | + |
| 34 | + model.parameters.get<mio::oseir::TimeExposed>()[i] = 5.2; |
| 35 | + model.parameters.get<mio::oseir::TimeInfected>()[i] = 6; |
| 36 | + model.parameters.get<mio::oseir::TransmissionProbabilityOnContact>()[i] = 0.04; |
| 37 | + } |
| 38 | + |
| 39 | + mio::ContactMatrixGroup& contact_matrix = params.get<mio::oseir::ContactPatterns>(); |
| 40 | + contact_matrix[0] = mio::ContactMatrix(Eigen::MatrixXd::Constant(num_groups, num_groups, fact * cont_freq)); |
| 41 | + contact_matrix.add_damping(Eigen::MatrixXd::Constant(num_groups, num_groups, 0.7), mio::SimulationTime(30.)); |
| 42 | + |
| 43 | + model.apply_constraints(); |
| 44 | + |
| 45 | + mio::TimeSeries<double> seir = simulate(t0, tmax, dt, model); |
| 46 | + |
| 47 | + std::vector<std::string> vars = {"S", "E", "I", "R"}; |
| 48 | + printf("Number of time points :%d\n", static_cast<int>(seir.get_num_time_points())); |
| 49 | + printf("People in\n"); |
| 50 | + |
| 51 | + for (size_t k = 0; k < (size_t)mio::oseir::InfectionState::Count; k++) { |
| 52 | + double dummy = 0; |
| 53 | + |
| 54 | + for (size_t i = 0; i < (size_t)params.get_num_groups(); i++) { |
| 55 | + printf("\t %s[%d]: %.0f", vars[k].c_str(), (int)i, |
| 56 | + seir.get_last_value()[k + (size_t)mio::oseir::InfectionState::Count * (int)i]); |
| 57 | + dummy += seir.get_last_value()[k + (size_t)mio::oseir::InfectionState::Count * (int)i]; |
| 58 | + } |
| 59 | + |
| 60 | + printf("\t %s_otal: %.0f\n", vars[k].c_str(), dummy); |
| 61 | + } |
| 62 | +} |
0 commit comments