Synchronize and Update variants. Prepare Assigment codes.
This commit is contained in:
@@ -15,12 +15,11 @@
|
||||
#include "progress.h"
|
||||
#include "solver.h"
|
||||
#include "timing.h"
|
||||
#include <mpi.h>
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int rank;
|
||||
double S, E;
|
||||
int rank = 0;
|
||||
double start, end;
|
||||
Parameter params;
|
||||
Solver solver;
|
||||
|
||||
@@ -44,7 +43,7 @@ int main(int argc, char** argv)
|
||||
double te = solver.te;
|
||||
double t = 0.0;
|
||||
|
||||
S = getTimeStamp();
|
||||
start = getTimeStamp();
|
||||
while (t <= te) {
|
||||
if (tau > 0.0) {
|
||||
computeTimestep(&solver);
|
||||
@@ -56,7 +55,6 @@ int main(int argc, char** argv)
|
||||
computeRHS(&solver);
|
||||
solve(&solver);
|
||||
adaptUV(&solver);
|
||||
/* exit(EXIT_SUCCESS); */
|
||||
t += solver.dt;
|
||||
|
||||
#ifdef VERBOSE
|
||||
@@ -67,10 +65,10 @@ int main(int argc, char** argv)
|
||||
printProgress(t);
|
||||
#endif
|
||||
}
|
||||
E = getTimeStamp();
|
||||
end = getTimeStamp();
|
||||
stopProgress();
|
||||
if (rank == 0) {
|
||||
printf("Solution took %.2fs\n", E - S);
|
||||
printf("Solution took %.2fs\n", end - start);
|
||||
}
|
||||
collectResult(&solver);
|
||||
|
||||
|
@@ -108,64 +108,69 @@ static void shift(Solver* solver)
|
||||
MPI_Waitall(2, requests, MPI_STATUSES_IGNORE);
|
||||
}
|
||||
|
||||
void collectResult(Solver* solver)
|
||||
static void gatherArray(
|
||||
Solver* solver, int cnt, int* rcvCounts, int* displs, double* src, double* dst)
|
||||
{
|
||||
double* Pall = NULL;
|
||||
double* Uall = NULL;
|
||||
double* Vall = NULL;
|
||||
int *rcvCounts, *displs;
|
||||
double* sendbuffer = src + (solver->imax + 2);
|
||||
|
||||
if (solver->rank == 0) {
|
||||
Pall = allocate(64, (solver->imax + 2) * (solver->jmax + 2) * sizeof(double));
|
||||
Uall = allocate(64, (solver->imax + 2) * (solver->jmax + 2) * sizeof(double));
|
||||
Vall = allocate(64, (solver->imax + 2) * (solver->jmax + 2) * sizeof(double));
|
||||
sendbuffer = src;
|
||||
}
|
||||
|
||||
MPI_Gatherv(sendbuffer,
|
||||
cnt,
|
||||
MPI_DOUBLE,
|
||||
dst,
|
||||
rcvCounts,
|
||||
displs,
|
||||
MPI_DOUBLE,
|
||||
0,
|
||||
MPI_COMM_WORLD);
|
||||
}
|
||||
|
||||
void collectResult(Solver* solver)
|
||||
{
|
||||
double* p = NULL;
|
||||
double* u = NULL;
|
||||
double* v = NULL;
|
||||
int *rcvCounts, *displs;
|
||||
int cnt = solver->jmaxLocal * (solver->imax + 2);
|
||||
|
||||
if (solver->rank == 0) {
|
||||
p = allocate(64, (solver->imax + 2) * (solver->jmax + 2) * sizeof(double));
|
||||
u = allocate(64, (solver->imax + 2) * (solver->jmax + 2) * sizeof(double));
|
||||
v = allocate(64, (solver->imax + 2) * (solver->jmax + 2) * sizeof(double));
|
||||
rcvCounts = (int*)malloc(solver->size * sizeof(int));
|
||||
displs = (int*)malloc(solver->size * sizeof(int));
|
||||
rcvCounts[0] = solver->jmaxLocal * (solver->imax + 2);
|
||||
}
|
||||
|
||||
if (solver->rank == 0 && solver->size == 1) {
|
||||
cnt = (solver->jmaxLocal + 2) * (solver->imax + 2);
|
||||
} else if (solver->rank == 0 || solver->rank == (solver->size - 1)) {
|
||||
cnt = (solver->jmaxLocal + 1) * (solver->imax + 2);
|
||||
}
|
||||
|
||||
MPI_Gather(&cnt, 1, MPI_INTEGER, rcvCounts, 1, MPI_INTEGER, 0, MPI_COMM_WORLD);
|
||||
|
||||
if (solver->rank == 0) {
|
||||
displs[0] = 0;
|
||||
int cursor = rcvCounts[0];
|
||||
|
||||
for (int i = 1; i < solver->size; i++) {
|
||||
rcvCounts[i] = sizeOfRank(i, solver->size, solver->jmax) * (solver->imax + 2);
|
||||
displs[i] = cursor;
|
||||
cursor += rcvCounts[i];
|
||||
}
|
||||
}
|
||||
|
||||
int cnt = solver->jmaxLocal * (solver->imax + 2);
|
||||
double* sendbuffer = solver->p + (solver->imax + 2);
|
||||
MPI_Gatherv(sendbuffer,
|
||||
cnt,
|
||||
MPI_DOUBLE,
|
||||
Pall,
|
||||
rcvCounts,
|
||||
displs,
|
||||
MPI_DOUBLE,
|
||||
0,
|
||||
MPI_COMM_WORLD);
|
||||
sendbuffer = solver->u + (solver->imax + 2);
|
||||
MPI_Gatherv(sendbuffer,
|
||||
cnt,
|
||||
MPI_DOUBLE,
|
||||
Uall,
|
||||
rcvCounts,
|
||||
displs,
|
||||
MPI_DOUBLE,
|
||||
0,
|
||||
MPI_COMM_WORLD);
|
||||
sendbuffer = solver->v + (solver->imax + 2);
|
||||
MPI_Gatherv(sendbuffer,
|
||||
cnt,
|
||||
MPI_DOUBLE,
|
||||
Vall,
|
||||
rcvCounts,
|
||||
displs,
|
||||
MPI_DOUBLE,
|
||||
0,
|
||||
MPI_COMM_WORLD);
|
||||
gatherArray(solver, cnt, rcvCounts, displs, solver->p, p);
|
||||
gatherArray(solver, cnt, rcvCounts, displs, solver->u, u);
|
||||
gatherArray(solver, cnt, rcvCounts, displs, solver->v, v);
|
||||
|
||||
if (solver->rank == 0) {
|
||||
writeResult(solver, Pall, Uall, Vall);
|
||||
writeResult(solver, p, u, v);
|
||||
free(p);
|
||||
free(u);
|
||||
free(v);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,8 +258,8 @@ void initSolver(Solver* solver, Parameter* params)
|
||||
|
||||
double dx = solver->dx;
|
||||
double dy = solver->dy;
|
||||
double inv_sqr_sum = 1.0 / (dx * dx) + 1.0 / (dy * dy);
|
||||
solver->dtBound = 0.5 * solver->re * 1.0 / inv_sqr_sum;
|
||||
double invSquareSum = 1.0 / (dx * dx) + 1.0 / (dy * dy);
|
||||
solver->dtBound = 0.5 * solver->re * 1.0 / invSquareSum;
|
||||
#ifdef VERBOSE
|
||||
printConfig(solver);
|
||||
#endif
|
||||
@@ -678,10 +683,10 @@ void writeResult(Solver* solver, double* p, double* u, double* v)
|
||||
y = dy * (j - 0.5);
|
||||
for (int i = 1; i < imax + 1; i++) {
|
||||
x = dx * (i - 0.5);
|
||||
double vel_u = (U(i, j) + U(i - 1, j)) / 2.0;
|
||||
double vel_v = (V(i, j) + V(i, j - 1)) / 2.0;
|
||||
double len = sqrt((vel_u * vel_u) + (vel_v * vel_v));
|
||||
fprintf(fp, "%.2f %.2f %f %f %f\n", x, y, vel_u, vel_v, len);
|
||||
double vu = (U(i, j) + U(i - 1, j)) / 2.0;
|
||||
double vv = (V(i, j) + V(i, j - 1)) / 2.0;
|
||||
double len = sqrt((vu * vu) + (vv * vv));
|
||||
fprintf(fp, "%.2f %.2f %f %f %f\n", x, y, vu, vv, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user