/* Heat equation solver in 2D. */ #include #include #include #include #include #include "heat.h" int main(int argc, char **argv) { double a = 0.5; //!< Diffusion constant field current, previous; //!< Current and previous temperature fields double dt; //!< Time step int nsteps; //!< Number of time steps int image_interval = 500; //!< Image output interval int restart_interval = 200; //!< Checkpoint output interval parallel_data parallelization; //!< Parallelization info int iter, iter0; //!< Iteration counter double dx2, dy2; //!< delta x and y squared double start_clock; //!< Time stamps MPI_Init(&argc, &argv); initialize(argc, argv, ¤t, &previous, &nsteps, ¶llelization, &iter0); /* Output the initial field */ write_field(¤t, iter0, ¶llelization); iter0++; /* Largest stable time step */ dx2 = current.dx * current.dx; dy2 = current.dy * current.dy; dt = dx2 * dy2 / (2.0 * a * (dx2 + dy2)); /* Get the start time stamp */ start_clock = MPI_Wtime(); /* Time evolve */ for (iter = iter0; iter < iter0 + nsteps; iter++) { exchange_init(&previous, ¶llelization); evolve_interior(¤t, &previous, a, dt); exchange_finalize(¶llelization); evolve_edges(¤t, &previous, a, dt); if (iter % image_interval == 0) { write_field(¤t, iter, ¶llelization); } /* write a checkpoint now and then for easy restarting */ if (iter % restart_interval == 0) { write_restart(¤t, ¶llelization, iter); } /* Swap current field so that it will be used as previous for next iteration step */ swap_fields(¤t, &previous); } /* Determine the CPU time used for the iteration */ if (parallelization.rank == 0) { printf("Iteration took %.3f seconds.\n", (MPI_Wtime() - start_clock)); printf("Reference value at 5,5: %f\n", previous.data[idx(5, 5, current.ny + 2)]); } write_field(¤t, iter, ¶llelization); finalize(¤t, &previous, ¶llelization); MPI_Finalize(); return 0; }