double hyperbolic_step(MESH& m, FLUX& f, double t, double dt) { // HW4B: YOUR CODE HERE // Step the finite volume model in time by dt. // Pseudocode: // Compute all fluxes. (before updating any triangle Q_bars) // For each triangle, update Q_bar using the fluxes as in Equation 8. // NOTE: Much like symp_euler_step, this may require TWO for-loops // Implement Equation 7 from your pseudocode here. for(auto i = m.edge_begin(); i != m.edge_end(); ++i){ if ((*i).triangle1().index() != (unsigned) -1 && (*i).triangle2().index() != (unsigned) -1 ){ MeshType::Triangle trik = (*i).triangle1(); MeshType::Triangle trim = (*i).triangle2(); unsigned int edge_k = 0; unsigned int edge_m = 0; //which edge (*i) is in trik and trim while(trik.node(edge_k).index()== (*i).node1().index() || trik.node(edge_k).index()== (*i).node2().index() ) ++edge_k; while(trim.node(edge_m).index()== (*i).node1().index() || trim.node(edge_m).index()== (*i).node2().index() ) ++edge_m; QVar flux = f(trik.normal(edge_k).x, trik.normal(edge_k).y, dt, trik.value().Q, trim.value().Q); trik.value().F[edge_k] = flux; trim.value().F[edge_m] = -flux; } else{ MeshType::Triangle trik; if ((*i).triangle1().index() != (unsigned) -1) trik = (*i).triangle1(); else trik = (*i).triangle2(); unsigned int edge_k = 0; while(trik.node(edge_k).index()== (*i).node1().index() || trik.node(edge_k).index()== (*i).node2().index() ) ++edge_k; QVar flux = f(trik.normal(edge_k).x, trik.normal(edge_k).y, dt, trik.value().Q, QVar(trik.value().Q.h, 0, 0)); trik.value().F[edge_k] = flux; } } for(auto i = m.triangle_begin(); i != m.triangle_end(); ++i){ QVar sum = QVar(0, 0, 0); for (int j = 0; j < 3; ++j){ sum += (*i).value().F[j]; } (*i).value().Q = (*i).value().Q-dt/(*i).area()*sum; } return t + dt; };