Synchronize and Update variants. Prepare Assigment codes.

This commit is contained in:
2024-01-08 10:26:43 +00:00
parent 2fad29b925
commit 5b50590faf
29 changed files with 336 additions and 233 deletions

View File

@@ -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);

View File

@@ -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);
}
}