예제 #1
0
파일: flux.c 프로젝트: cvoter/Parflow
Databox       *CompFlux(
                        Databox *k,
                        Databox *h)
{
  Databox        *flux;

  int nx, ny, nz;
  double x, y, z;
  double dx, dy, dz;

  double         *fluxp, *kp, *hp;

  double qxp, qxm, qyp, qym, qzp, qzm;
  int cell,
    cell_xm1, cell_xp1,
    cell_ym1, cell_yp1,
    cell_zm1, cell_zp1;
  int ii, jj, kk;

  nx = DataboxNx(k);
  ny = DataboxNy(k);
  nz = DataboxNz(k);

  x = DataboxX(k);
  y = DataboxY(k);
  z = DataboxZ(k);

  dx = DataboxDx(k);
  dy = DataboxDy(k);
  dz = DataboxDz(k);

#if 0      /* ADD LATER */
  if ((dx != DataboxDx(h)) ||
      (dy != DataboxDy(h)) ||
      (dz != DataboxDz(h)))
  {
    Error("Spacings are not compatible\n");
    return NULL;
  }
#endif

  if ((flux = NewDatabox(nx, ny, nz, x, y, z, dx, dy, dz)) == NULL)
    return((Databox*)NULL);

  kp = DataboxCoeffs(k);
  hp = DataboxCoeffs(h);
  fluxp = DataboxCoeffs(flux);

  cell = 0;
  cell_xm1 = cell - 1;
  cell_xp1 = cell + 1;
  cell_ym1 = cell - nx;
  cell_yp1 = cell + nx;
  cell_zm1 = cell - nx * ny;
  cell_zp1 = cell + nx * ny;

  kp += nx * ny;
  hp += nx * ny;
  fluxp += nx * ny;
  for (kk = 1; kk < (nz - 1); kk++)
  {
    kp += nx;
    hp += nx;
    fluxp += nx;
    for (jj = 1; jj < (ny - 1); jj++)
    {
      kp++;
      hp++;
      fluxp++;
      for (ii = 1; ii < (nx - 1); ii++)
      {
        qxp = -Mean(kp[cell_xp1], kp[cell]) * (hp[cell_xp1] - hp[cell]) / dx;
        qxm = -Mean(kp[cell], kp[cell_xm1]) * (hp[cell] - hp[cell_xm1]) / dx;
        qyp = -Mean(kp[cell_yp1], kp[cell]) * (hp[cell_yp1] - hp[cell]) / dy;
        qym = -Mean(kp[cell], kp[cell_ym1]) * (hp[cell] - hp[cell_ym1]) / dy;
        qzp = -Mean(kp[cell_zp1], kp[cell]) * (hp[cell_zp1] - hp[cell]) / dz;
        qzm = -Mean(kp[cell], kp[cell_zm1]) * (hp[cell] - hp[cell_zm1]) / dz;

        fluxp[cell] = (qxp - qxm) * dy * dz + (qyp - qym) * dx * dz + (qzp - qzm) * dx * dy;

        kp++;
        hp++;
        fluxp++;
      }
      kp++;
      hp++;
      fluxp++;
    }
    kp += nx;
    hp += nx;
    fluxp += nx;
  }

  return flux;
}
예제 #2
0
Databox         *ReadSDS(char *filename, int ds_num,
			 double default_value)
{
  Databox         *v;

  int32           dim[MAX_VAR_DIMS];
  int32           edges[3];
  int32           start[3];
  int             i;
  int             z;

  int32           type;

  char name[MAX_NC_NAME];
  
  int32  sd_id;
  int32  sds_id;


  int32 rank, nt, nattrs;
  
  int             nx, ny, nz;

  int             m;

  double         *double_ptr;
  
  sd_id = SDstart(filename, DFACC_RDONLY);
  
  sds_id = SDselect(sd_id, ds_num);
  
  SDgetinfo(sds_id, name, &rank, dim, &type, &nattrs);

  start[0] = start[1] = start[2] = 0;


  /* create the new databox structure */
  if((v = NewDatabox(dim[2], dim[1], dim[0], 0, 0, 0, 0, 0, 0, default_value)) == NULL)
     return((Databox *)NULL);
     

  double_ptr = DataboxCoeffs(v);

  edges[0] = 1;
  edges[1] = DataboxNy(v);
  edges[2] = DataboxNx(v);

  switch (type) {
  case DFNT_FLOAT32 : 
    {
      float32  *convert_ptr, *data;
      
      if( (data = convert_ptr = (float32 *)malloc(dim[1]*dim[2] * 
						  sizeof(float32))) == NULL)
	{
	  exit(1);
	}

      for(z=0; z < dim[0]; z++) 
	{
	  start[0] = z;
	  
	  SDreaddata(sds_id, start, NULL, edges, data);
      
	  convert_ptr = data;
	  for(i=dim[1]*dim[2]; i--;)
	    *double_ptr++ = *convert_ptr++;
	}

      free(data);
      break;
    };
  case DFNT_FLOAT64 : 
    {
      float64  *convert_ptr, *data;
      
      if( (data = convert_ptr = (float64 *)malloc(dim[1]*dim[2] * 
						  sizeof(float64))) == NULL)
	{
	  exit(1);
	}

      for(z=0; z < dim[0]; z++) 
	{
	  start[0] = z;
	  
	  SDreaddata(sds_id, start, NULL, edges, data);
      
	  convert_ptr = data;
	  for(i=dim[1]*dim[2]; i--;)
	    *double_ptr++ = *convert_ptr++;
	}

      free(data);
      break;
    };
  case DFNT_INT8 : 
    {
      int8  *convert_ptr, *data;
      
      if( (data = convert_ptr = (int8 *)malloc(dim[1]*dim[2] * 
						  sizeof(int8))) == NULL)
	{
	  exit(1);
	}

      for(z=0; z < dim[0]; z++) 
	{
	  start[0] = z;
	  
	  SDreaddata(sds_id, start, NULL, edges, data);
      
	  convert_ptr = data;
	  for(i=dim[1]*dim[2]; i--;)
	    *double_ptr++ = *convert_ptr++;
	}

      free(data);
      break;
    };
  case DFNT_UINT8 : 
    {
      uint8  *convert_ptr, *data;
      
      if( (data = convert_ptr = (uint8 *)malloc(dim[1]*dim[2] * 
						  sizeof(uint8))) == NULL)
	{
	  exit(1);
	}

      for(z=0; z < dim[0]; z++) 
	{
	  start[0] = z;
	  
	  SDreaddata(sds_id, start, NULL, edges, data);
      
	  convert_ptr = data;
	  for(i=dim[1]*dim[2]; i--;)
	    *double_ptr++ = *convert_ptr++;
	}

      free(data);
      break;
    };
  case DFNT_INT16 : 
    {
      int16  *convert_ptr, *data;
      
      if( (data = convert_ptr = (int16 *)malloc(dim[1]*dim[2] * 
						  sizeof(int16))) == NULL)
	{
	  exit(1);
	}

      for(z=0; z < dim[0]; z++) 
	{
	  start[0] = z;
	  
	  SDreaddata(sds_id, start, NULL, edges, data);
      
	  convert_ptr = data;
	  for(i=dim[1]*dim[2]; i--;)
	    *double_ptr++ = *convert_ptr++;
	}

      free(data);
      break;
    };
  case DFNT_UINT16 : 
    {
      uint16  *convert_ptr, *data;
      
      if( (data = convert_ptr = (uint16 *)malloc(dim[1]*dim[2] * 
						  sizeof(uint16))) == NULL)
	{
	  exit(1);
	}

      for(z=0; z < dim[0]; z++) 
	{
	  start[0] = z;
	  
	  SDreaddata(sds_id, start, NULL, edges, data);
      
	  convert_ptr = data;
	  for(i=dim[1]*dim[2]; i--;)
	    *double_ptr++ = *convert_ptr++;
	}

      free(data);
      break;
    };
  case DFNT_INT32 : 
    {
      int32  *convert_ptr, *data;
      
      if( (data = convert_ptr = (int32 *)malloc(dim[1]*dim[2] * 
						  sizeof(int32))) == NULL)
	{
	  exit(1);
	}

      for(z=0; z < dim[0]; z++) 
	{
	  start[0] = z;
	  
	  SDreaddata(sds_id, start, NULL, edges, data);
      
	  convert_ptr = data;
	  for(i=dim[1]*dim[2]; i--;)
	    *double_ptr++ = *convert_ptr++;
	}

      free(data);
      break;
    };
  case DFNT_UINT32 : 
    {
      uint32  *convert_ptr, *data;
      
      if( (data = convert_ptr = (uint32 *)malloc(dim[1]*dim[2] * 
						  sizeof(uint32))) == NULL)
	{
	  exit(1);
	}

      for(z=0; z < dim[0]; z++) 
	{
	  start[0] = z;
	  
	  SDreaddata(sds_id, start, NULL, edges, data);
      
	  convert_ptr = data;
	  for(i=dim[1]*dim[2]; i--;)
	    *double_ptr++ = *convert_ptr++;
	}

      free(data);
      break;
    };
  }
  
  SDendaccess(sds_id);

  SDend(sd_id);

  return v;
}