コード例 #1
0
ファイル: shallow_water.cpp プロジェクト: Kirnu9/mesh
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

  /* 1. Initialize a vector temp_Q of size @a m.num_triangles() for storing all temp Q_bar values
   * 2. Use a TriangleIterator to iterate through all the triangles, for each tri_it:
   *      a. Compute the sum of fluxes sum_fluxes
   *      b. temp_Q[(*it).index()] = sum_fluxes
   * 3. Use indices of triangles to do another for loop, for each triangle(i):
   *      a. triangle_i.value().Q_bar = temp_Q[i]
   */
  std::vector<QVar> temp_fluxes(m.num_triangles(), QVar());
  for (auto tri_it = m.triangle_begin(); tri_it != m.triangle_end(); ++tri_it) {
    auto qk = (*tri_it).value();
    
    QVar F_k(0, 0, 0);
    for (size_type i = 0; i < 3; ++i) {
      auto edge = (*tri_it).edge(i);
      QVar qm(0, 0, 0);
      if (m.adj_triangle1_index(edge) == -1 || m.adj_triangle2_index(edge) == -1) {
          //set_boundary_conditions
        qm = QVar(qk.h, 0, 0);
      } else {
        size_type adj_tri_idx = m.adj_triangle1_index(edge) == (*tri_it).index() ?
            m.adj_triangle2_index(edge) : m.adj_triangle1_index(edge);

        auto adj_triangle = m.triangle(adj_tri_idx);
        qm = adj_triangle.value(); 
      }
      auto norm_ke = m.out_norm((*tri_it), edge); 
      F_k = F_k + f(norm_ke.x, norm_ke.y, dt, qk, qm);
    } 
    // print_triangle(m, (*tri_it), f, t, dt);
    temp_fluxes[(*tri_it).index()] = qk - F_k * (dt / (*tri_it).area());
  }
  
  for (auto tri_it = m.triangle_begin(); tri_it != m.triangle_end(); ++tri_it) {
    (*tri_it).value() = temp_fluxes[(*tri_it).index()];
  }
  
  return t + dt;
}