int pack_arrayh (const int ymin, const hydroparam_t H, hydrovar_t * Hv, hydro_real_t *buffer) { int ivar, i, j, p = 0; for (ivar = 0; ivar < H.nvar; ivar++) { for (j = ymin; j < ymin + ExtraLayer; j++) { for (i = 0; i < H.nxt; i++) { buffer[p++] = Hv->uold[IHv (i, j, ivar)]; } } } return p; }
int unpack_arrayv (const int xmin, const hydroparam_t H, hydrovar_t * Hv, hydro_real_t *buffer) { int ivar, i, j, p = 0; for (ivar = 0; ivar < H.nvar; ivar++) { for (j = 0; j < H.nyt; j++) { for (i = xmin; i < xmin + ExtraLayer; i++) { Hv->uold[IHv (i, j, ivar)] = buffer[p++]; } } } return p; }
void printuold(const hydroparam_t H, hydrovar_t * Hv) { long i, j, nvar; for (nvar = 0; nvar < H.nvar; nvar++) { fprintf(stdout, "=uold %ld >\n", nvar); for (j = 0; j < H.nyt; j++) { long nbr = 1; for (i = 0; i < H.nxt; i++) { // fprintf(stdout, "%13.6e ", Hv->uold[IHv(i, j, nvar)]); fprintf(stdout, "%10.3e ", Hv->uold[IHv(i, j, nvar)]); nbr++; if (nbr == VALPERLINE) { fprintf(stdout, "\n"); nbr = 1; } } if (nbr != 1) fprintf(stdout, "\n"); fprintf(stdout, "%%\n"); } } }
/** * @brief writes a snapshot / step to a vtk file * * @param step ... * @param H ... * @param Hv ... * @return void */ void vtkfile ( long step, const hydroparam_t H, hydrovar_t * Hv ) { char name[160]; FILE *fic; long i, j, nv; LOC ( H.rank ); WHERE ( "vtkfile" ); // Files are named outputvtk_rank_step.vts sprintf ( name, "outputvtk_%04i_%05ld.vts", H.rank, step ); fic = fopen ( name, "w" ); if ( fic == NULL ) { ERR ( "Cannot open file %s\n", name ); exit ( 1 ); } fprintf ( fic, "<?xml version=\"1.0\"?>\n" ); fprintf ( fic, "<VTKFile type=\"StructuredGrid\">\n" ); fprintf ( fic, "<StructuredGrid WholeExtent=\" %ld %ld %ld %ld %ld %ld\">\n", ( long ) 0, H.nx, ( long ) 0, H.ny, ( long ) 0, ( long ) 0 ); fprintf ( fic, "<Piece Extent=\" %ld %ld %ld %ld %ld %ld\">\n", ( long ) 0, H.nx, ( long ) 0, H.ny, ( long ) 0, ( long ) 0 ); fprintf ( fic, "<Points>\n" ); fprintf ( fic, "<DataArray type=\"Float32\" format=\"ascii\" NumberOfComponents=\"3\">\n" ); for ( j = 0; j < H.ny + 1; j++ ) { for ( i = 0; i < H.nx + 1; i++ ) { fprintf ( fic, "%f %f %f\n", i * H.dx, j * H.dx, 0.0 ); } } fprintf ( fic, "</DataArray>\n" ); fprintf ( fic, "</Points>\n" ); name[0] = 0; for ( nv = 0; nv < IP; nv++ ) { if ( nv == ID ) sprintf ( name, "%s varID", name ); if ( nv == IU ) sprintf ( name, "%s varIU", name ); if ( nv == IV ) sprintf ( name, "%s varIV", name ); if ( nv == IP ) sprintf ( name, "%s varIP", name ); } // declaration of the variable list fprintf ( fic, "<CellData Scalars=\"%s\">\n", name ); name[0] = 0; for ( nv = 0; nv <= IP; nv++ ) { if ( nv == ID ) sprintf ( name, "varID" ); if ( nv == IU ) sprintf ( name, "varIU" ); if ( nv == IV ) sprintf ( name, "varIV" ); if ( nv == IP ) sprintf ( name, "varIP" ); //Definition of the cell values fprintf ( fic, "<DataArray type=\"Float32\" Name=\"%s\" format=\"ascii\">\n", name ); // the image is the interior of the computed domain for ( j = H.jmin + ExtraLayer; j < H.jmax - ExtraLayer; j++ ) { for ( i = H.imin + ExtraLayer; i < H.imax - ExtraLayer; i++ ) { fprintf ( fic, "%lf ", Hv->uold[IHv ( i, j, nv )] ); } fprintf ( fic, "\n" ); } fprintf ( fic, "</DataArray>\n" ); } fprintf ( fic, "</CellData>\n" ); fprintf ( fic, "</Piece>\n" ); fprintf ( fic, "</StructuredGrid>\n" ); fprintf ( fic, "</VTKFile>\n" ); fclose ( fic ); }
void make_boundary (int idim, const hydroparam_t H, hydrovar_t * Hv) { // - - - - - - - - - - - - - - - - - - - // Cette portion de code est à vérifier // détail. J'ai des doutes sur la conversion // des index depuis fortran. // - - - - - - - - - - - - - - - - - - - int i, ivar, i0, j, j0, err, size; hydro_real_t sign; hydro_real_t sendbufld[ExtraLayerTot * H.nxyt * H.nvar]; hydro_real_t sendbufru[ExtraLayerTot * H.nxyt * H.nvar]; // hydro_real_t *sendbufru, *sendbufld; hydro_real_t recvbufru[ExtraLayerTot * H.nxyt * H.nvar]; hydro_real_t recvbufld[ExtraLayerTot * H.nxyt * H.nvar]; // double *recvbufru, *recvbufld; MPI_Status st; MPI_Win winld, winru; MPI_Request requests[4]; MPI_Status status[4]; int reqcnt = 0; static FILE *fic = NULL; char fname[256]; // if (fic == NULL) { // sprintf(fname, "uold_%05d_%05d.txt", H.mype, H.nproc); // fic = fopen(fname, "w"); // assert(fic != NULL); // } // err = MPI_Alloc_mem(ExtraLayerTot * H.nxyt * H.nvar * sizeof(double), MPI_INFO_NULL, &sendbufld); // assert(err == MPI_SUCCESS); // err = MPI_Alloc_mem(ExtraLayerTot * H.nxyt * H.nvar * sizeof(double), MPI_INFO_NULL, &sendbufru); // assert(err == MPI_SUCCESS); // err = MPI_Alloc_mem(ExtraLayerTot * H.nxyt * H.nvar * sizeof(double), MPI_INFO_NULL, &recvbufld); // assert(err == MPI_SUCCESS); // err = MPI_Alloc_mem(ExtraLayerTot * H.nxyt * H.nvar * sizeof(double), MPI_INFO_NULL, &recvbufru); // assert(err == MPI_SUCCESS); WHERE ("make_boundary"); if (idim == 1) { i = ExtraLayer; size = pack_arrayv (i, H, Hv, sendbufld); i = H.nx; size = pack_arrayv (i, H, Hv, sendbufru); if (H.box[RIGHT_BOX] != -1) { MPI_Isend (sendbufru, size, MPI_DOUBLE, H.box[RIGHT_BOX], 123, MPI_COMM_WORLD, &requests[reqcnt]); reqcnt++; } if (H.box[LEFT_BOX] != -1) { MPI_Isend (sendbufld, size, MPI_DOUBLE, H.box[LEFT_BOX], 246, MPI_COMM_WORLD, &requests[reqcnt]); reqcnt++; } if (H.box[RIGHT_BOX] != -1) { MPI_Irecv (recvbufru, size, MPI_DOUBLE, H.box[RIGHT_BOX], 246, MPI_COMM_WORLD, &requests[reqcnt]); reqcnt++; } if (H.box[LEFT_BOX] != -1) { MPI_Irecv (recvbufld, size, MPI_DOUBLE, H.box[LEFT_BOX], 123, MPI_COMM_WORLD, &requests[reqcnt]); reqcnt++; } err = MPI_Waitall (reqcnt, requests, status); assert (err == MPI_SUCCESS); if (H.box[RIGHT_BOX] != -1) { { i = H.nx + ExtraLayer; size = unpack_arrayv (i, H, Hv, recvbufru); } } if (H.box[LEFT_BOX] != -1) { { i = 0; size = unpack_arrayv (i, H, Hv, recvbufld); } } if (H.boundary_left > 0) { // Left boundary for (ivar = 0; ivar < H.nvar; ivar++) { for (i = 0; i < ExtraLayer; i++) { sign = 1.0; if (H.boundary_left == 1) { i0 = ExtraLayerTot - i - 1; if (ivar == IU) { sign = -1.0; } } else if (H.boundary_left == 2) { i0 = 2; } else { i0 = H.nx + i; } for (j = H.jmin + ExtraLayer; j < H.jmax - ExtraLayer; j++) { Hv->uold[IHv (i, j, ivar)] = Hv->uold[IHv (i0, j, ivar)] * sign; } } } } if (H.boundary_right > 0) { // Right boundary for (ivar = 0; ivar < H.nvar; ivar++) { for (i = H.nx + ExtraLayer; i < H.nx + ExtraLayerTot; i++) { sign = 1.0; if (H.boundary_right == 1) { i0 = 2 * H.nx + ExtraLayerTot - i - 1; if (ivar == IU) { sign = -1.0; } } else if (H.boundary_right == 2) { i0 = H.nx + ExtraLayer; } else { i0 = i - H.nx; } for (j = H.jmin + ExtraLayer; j < H.jmax - ExtraLayer; j++) { Hv->uold[IHv (i, j, ivar)] = Hv->uold[IHv (i0, j, ivar)] * sign; } } } } } else { { if (fic) { fprintf (fic, "- = - = - = - Avant\n"); printuoldf (fic, H, Hv); } } j = ExtraLayer; size = pack_arrayh (j, H, Hv, sendbufld); // fprintf(stderr, "%d prep %d\n", H.mype, j); if (fic) { fprintf (fic, "%d prep %d\n", H.mype, j); print_bufferh (fic, j, H, Hv, sendbufld); } j = H.ny; size = pack_arrayh (j, H, Hv, sendbufru); // fprintf(stderr, "%d prep %d (s=%d)\n", H.mype, j, size); if (fic) { fprintf (fic, "%d prep %d\n", H.mype, j); print_bufferh (fic, j, H, Hv, sendbufru); } if (H.box[DOWN_BOX] != -1) { MPI_Isend (sendbufld, size, MPI_DOUBLE, H.box[DOWN_BOX], 123, MPI_COMM_WORLD, &requests[reqcnt]); reqcnt++; } if (H.box[UP_BOX] != -1) { MPI_Isend (sendbufru, size, MPI_DOUBLE, H.box[UP_BOX], 246, MPI_COMM_WORLD, &requests[reqcnt]); reqcnt++; } if (H.box[DOWN_BOX] != -1) { MPI_Irecv (recvbufld, size, MPI_DOUBLE, H.box[DOWN_BOX], 246, MPI_COMM_WORLD, &requests[reqcnt]); reqcnt++; } if (H.box[UP_BOX] != -1) { MPI_Irecv (recvbufru, size, MPI_DOUBLE, H.box[UP_BOX], 123, MPI_COMM_WORLD, &requests[reqcnt]); reqcnt++; } err = MPI_Waitall (reqcnt, requests, status); assert (err == MPI_SUCCESS); if (H.box[DOWN_BOX] != -1) { { j = 0; unpack_arrayh (j, H, Hv, recvbufld); if (fic) { fprintf (fic, "%d down %d\n", H.mype, j); print_bufferh (fic, j, H, Hv, recvbufld); } // fprintf(stderr, "%d down %d\n", H.mype, j); } } if (H.box[UP_BOX] != -1) { { j = H.ny + ExtraLayer; unpack_arrayh (j, H, Hv, recvbufru); if (fic) { fprintf (fic, "%d up %d\n", H.mype, j); print_bufferh (fic, j, H, Hv, recvbufru); } // fprintf(stderr, "%d up %d\n", H.mype, j); } } // if (H.mype == 0) { if (fic) { fprintf (fic, "- = - = - = - Apres\n"); printuoldf (fic, H, Hv); } } // Lower boundary if (H.boundary_down > 0) { j0 = 0; for (ivar = 0; ivar < H.nvar; ivar++) { for (j = 0; j < ExtraLayer; j++) { sign = 1.0; if (H.boundary_down == 1) { j0 = ExtraLayerTot - j - 1; if (ivar == IV) { sign = -1.0; } } else if (H.boundary_down == 2) { j0 = ExtraLayerTot; } else { j0 = H.ny + j; } for (i = H.imin + ExtraLayer; i < H.imax - ExtraLayer; i++) { Hv->uold[IHv (i, j, ivar)] = Hv->uold[IHv (i, j0, ivar)] * sign; } } } } // Upper boundary if (H.boundary_up > 0) { for (ivar = 0; ivar < H.nvar; ivar++) { for (j = H.ny + ExtraLayer; j < H.ny + ExtraLayerTot; j++) { sign = 1.0; if (H.boundary_up == 1) { j0 = 2 * H.ny + ExtraLayerTot - j - 1; if (ivar == IV) { sign = -1.0; } } else if (H.boundary_up == 2) { j0 = H.ny + 1; } else { j0 = j - H.ny; } for (i = H.imin + ExtraLayer; i < H.imax - ExtraLayer; i++) { Hv->uold[IHv (i, j, ivar)] = Hv->uold[IHv (i, j0, ivar)] * sign; } } } } } // MPI_Free_mem(sendbufld); // MPI_Free_mem(sendbufru); // MPI_Free_mem(recvbufld); // MPI_Free_mem(recvbufru); }
void MPI_print_column(const hydroparam_t H, hydrovar_t * Hv, int column, int nvar) { long i; for (i = 0; i < H.nxt; i++) { fprintf(stdout, "iProc %i column %i nvar %i: %10.3e \n", H.iProc, column, nvar, Hv->uold[IHv(i, column, nvar)]); } }