53 using state_type_1d = std::array<Number, 3>;
54 constexpr state_type_1d primitive_left{1., 0., Number(2. / 3. * 1.e-1)};
55 constexpr state_type_1d primitive_right{
56 1.e-3, 0., Number(2. / 3. * 1.e-10)};
59 constexpr Number rarefaction_speed = 0.49578489518897934;
60 constexpr Number contact_velocity = 0.62183867139173454;
61 constexpr Number right_shock_speed = 0.82911836253346982;
67 constexpr Number pre_contact_density = 5.4079335349316249e-02;
68 constexpr Number post_contact_density = 3.9999980604299963e-03;
69 constexpr Number contact_pressure = 0.51557792765096996e-03;
71 state_type_1d primitive_state;
72 const double &x = point[0];
74 if (x <= -1.0 / 3.0 * t) {
76 primitive_state = primitive_left;
78 }
else if (x < rarefaction_speed * t) {
80 const double chi = x / t;
81 primitive_state[0] = std::pow(0.75 - 0.75 * chi, 3.0);
82 primitive_state[1] = 0.75 * (1.0 / 3.0 + chi);
83 primitive_state[2] = (1.0 / 15.0) * std::pow(0.75 - 0.75 * chi, 5.0);
85 }
else if (x < contact_velocity * t) {
86 primitive_state[0] = pre_contact_density;
87 primitive_state[1] = contact_velocity;
88 primitive_state[2] = contact_pressure;
90 }
else if (x < right_shock_speed * t) {
92 primitive_state[0] = post_contact_density;
93 primitive_state[1] = contact_velocity;
94 primitive_state[2] = contact_pressure;
98 primitive_state = primitive_right;
103 const auto &[rho, u, p] = primitive_state;
104 conserved_state[0] = rho;
105 conserved_state[1] = rho * u;
106 if constexpr (View::have_energy_equation)
107 conserved_state[dim + 1] = p /
ScalarNumber(5. / 3. - 1.) +
111 return conserved_state;