Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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");
        }
    }
}
Example #4
0
/**
 * @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 );
}
Example #5
0
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);
}
Example #6
0
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)]);
	}
}