cs205-lecture-examples

Example codes used during Harvard CS205 lectures
git clone https://git.0xfab.ch/cs205-lecture-examples.git
Log | Files | Refs | README | LICENSE

IO.h (1154B)


      1 #ifndef IO_H_C0WPQOQZ
      2 #define IO_H_C0WPQOQZ
      3 
      4 #include <fstream>
      5 #include <mpi.h>
      6 #include <vector>
      7 
      8 void initialize(std::vector<double> &v)
      9 {
     10     int rank, size;
     11     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
     12     MPI_Comm_size(MPI_COMM_WORLD, &size);
     13     const int N = static_cast<int>(v.size()) - 2;
     14     const double dx = 1.0 / (size * N);
     15     const double x0 = rank * N * dx;
     16     for (int i = 0; i < N; ++i) {
     17         const double x = x0 + (i + 0.5) * dx;
     18         if (x > 0.4 && x < 0.6) {
     19             v[i + 1] = 1.0;
     20         } else {
     21             v[i + 1] = 0.0;
     22         }
     23     }
     24 }
     25 
     26 void dump(const std::vector<double> &v)
     27 {
     28     int rank, size;
     29     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
     30     MPI_Comm_size(MPI_COMM_WORLD, &size);
     31     const int N = static_cast<int>(v.size()) - 2;
     32     std::vector<double> u(size * N);
     33     MPI_Gather(
     34         &v[1], N, MPI_DOUBLE, u.data(), N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
     35     if (0 == rank) {
     36         std::ofstream out("u.dat", std::ios::app);
     37         out << std::scientific;
     38         for (size_t i = 0; i < u.size(); ++i) {
     39             out << ' ' << u[i];
     40         }
     41         out << '\n';
     42     }
     43 }
     44 
     45 #endif /* IO_H_C0WPQOQZ */