MPI_Recv (&kNuMethod, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD,
&status);
MPI_Recv (&Nx, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Recv (&Ny, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Recv (&h, 1, MPI_DOUBLE, 0, MPI_ANY_TAG, MPI_COMM_WORLD,
&status);
MPI_Recv (&tau, 1, MPI_DOUBLE, 0, MPI_ANY_TAG, MPI_COMM_WORLD,
&status);
MPI_Recv (&Build, sizeof(Model.Build), MPI_CHAR, 0, MPI_ANY_TAG,
MPI_COMM_WORLD, &status);
MPI_Barrier(MPI_COMM_WORLD);
Model.Init (kClientProc, kLeft, kRight, kNuMethod, Nx, Ny, h, tau,
Build);
}
void SendFieldsToServer()
{
int j, k;
for (j=0; j<=Model.Nx+1; j++)
for (k=0; k<nFields; k++)
MPI_Send (&Model.Fields[k][j][0], Model.Ny+2, MPI_DOUBLE,
0, mpiSomeTag, MPI_COMM_WORLD);
}
void OnUpdate()
{
Model.UpdateData();
// Обменяться границами
MPI_Status status;
for (int k=0; k<nFields; k++) {
if (idPrev) {
MPI_Recv (&Model.Fields[k][0][0], Model.Ny+1, MPI_DOUBLE,
idPrev, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Send (&Model.Fields[k][1][0], Model.Ny+1, MPI_DOUBLE,
idPrev, mpiSomeTag, MPI_COMM_WORLD); }
if (idNext) {
MPI_Send (&Model.Fields[k][Model.Nx][0], Model.Ny+1, MPI_DOUBLE,
idNext, mpiSomeTag, MPI_COMM_WORLD);
MPI_Recv (&Model.Fields[k][Model.Nx+1][0], Model.Ny+1,
MPI_DOUBLE, idNext, MPI_ANY_TAG, MPI_COMM_WORLD, &status); } }
MPI_Barrier(MPI_COMM_WORLD);
}
Листинг 7. Проект Client, файл Client.h
// Client.h : main header file for the CLIENT application
//
void Run();
void SendToNext (int cmd);
int RecvFromPrev();
void RecvKoefsFromServer();