void volume_file_info::calcMinMax(unsigned int var, unsigned int time) const
  {
    thread_info ti(BOOST_CURRENT_FUNCTION);

    volume vol;
    const uint64 maxdim = 128; //read in 128^3 chunks
    for(unsigned int off_z = 0; off_z < ZDim(); off_z+=maxdim)
      for(unsigned int off_y = 0; off_y < YDim(); off_y+=maxdim)
	for(unsigned int off_x = 0; off_x < XDim(); off_x+=maxdim)
	  {
	    dimension read_dim(std::min(XDim()-off_x,maxdim),
			       std::min(YDim()-off_y,maxdim),
			       std::min(ZDim()-off_z,maxdim));
	    readVolumeFile(vol,filename(),var,time,
			   off_x,off_y,off_z,read_dim);
	    if(off_x==0 && off_y==0 && off_z==0)
	      {
		_data._min[var][time] = vol.min();
		_data._max[var][time] = vol.max();
	      }
	    else
	      {
		if(_data._min[var][time] > vol.min())
		  _data._min[var][time] = vol.min();
		if(_data._max[var][time] < vol.max())
		  _data._max[var][time] = vol.max();
	      }
	  }

    _data._minIsSet[var][time] = true;
    _data._maxIsSet[var][time] = true;
  }
Exemple #2
0
/*
 * Invert the matrix if x = -1 
 * use gaussj
 */
FMatrix FMatrix::operator^( int x ) const
{
  assert( x == -1 );      /* may want to extend to 2... in the future */

  // check dimension
  assert( XDim() == YDim() );

  // convience variables
  int n = XDim();
  int size = n*n;

  // make a copy of the matrix for nrc routine to work on
  float *copy = new float[ size ];
  memcpy( copy, elem, size*sizeof(float) );

  float **a = convert_matrix( copy, 1, n, 1, n );
  float **b = matrix( 1, n, 1, 1 );
  b[1][1] = 1.0F;
  for( int i = 2; i <= n; i++ )
    b[i][1] = 0.0F;

  gaussj( a, n, b, 1 );

  FMatrix ret( n, n );
  for( int iy = 0; iy < n; iy++ )
    for( int ix = 0; ix < n; ix++ )
      ret.Elem( iy, ix ) = copy[ iy*n + ix ];

  delete [] copy;
  free_matrix( b, 1, n, 1, 1 );
  free_convert_matrix( a, 1, n, 1, n );

  return( ret );
}
Exemple #3
0
/*
 * Increment 
 */
FMatrix& FMatrix::operator+=( const FMatrix &M )
{
  // check dimension
  assert( XDim() == M.XDim() && YDim() == M.YDim() );

  for( int iy = 0; iy < ydim; iy++ )
    for( int ix = 0; ix < xdim; ix++ )
      elem[ iy*xdim + ix ] += M.rElem( iy, ix );

  return( *this );
}
Exemple #4
0
/*
 * Multiply the matrix
 * nxm matrix multiply by mxr matrix gives nxr matrix
 */
FMatrix FMatrix::operator*( const FMatrix &M ) const
{
  // check dimension
  assert( XDim() == M.YDim() );

  // assign convience variables
  int n = YDim();
  int m = XDim();
  int r = M.XDim();

  FMatrix ret( n, r );

  ret = 0;

  for( int in = 0; in < n; in++ )
    for( int ir = 0; ir < r; ir++ )
      for( int im = 0; im < m; im++ )
        ret.Elem( in, ir ) += rElem( in, im ) * M.rElem( im, ir );

  return( ret );
}
  Voxels& Voxels::anisotropicDiffusion(unsigned int iterations)
  {
    CVC::ThreadInfo ti(BOOST_CURRENT_FUNCTION);

    double cn, cs, ce, cw, cu, cd;
    double delta_n, delta_s, delta_e, delta_w, delta_u, delta_d;
    double K_para = 3;
    double Lamda_para = 0.16f;
    unsigned int m;
    VolMagick::uint64 i,j,k, stepnum = 0;
    Voxels tempt(*this);

    if(_vosm) _vosm->start(this, VoxelOperationStatusMessenger::AnisotropicDiffusion, ZDim()*iterations);

    uint64 numSteps = ZDim()*iterations;

    for (m=0; m<iterations; m++)
      {
        for (k=0; k<ZDim(); k++)
	  {
	    for (j=0; j<YDim(); j++) 
	      for (i=0; i<XDim(); i++)
		{
		if (j < YDim()-1)
		  delta_s = (*this)(i,j+1,k) - (*this)(i,j,k);
		else
		  delta_s = 0.0;
		if (j > 0)
		  delta_n = (*this)(i,j-1,k) - (*this)(i,j,k);
		else 
		  delta_n = 0.0;
		if (i < XDim()-1)
		  delta_e = (*this)(i+1,j,k) - (*this)(i,j,k);
		else 
		  delta_e = 0.0;
		if (i > 0)
		  delta_w = (*this)(i-1,j,k) - (*this)(i,j,k);
		else
		  delta_w = 0.0;
		if (k < ZDim()-1)
		  delta_u = (*this)(i,j,k+1) - (*this)(i,j,k);
		else 
		  delta_u = 0.0;
		if (k > 0)
		  delta_d = (*this)(i,j,k-1) - (*this)(i,j,k);
		else
		  delta_d = 0.0;
		
		cn = 1.0f / (1.0f + ((delta_n * delta_n) / (K_para * K_para)));
		cs = 1.0f / (1.0f + ((delta_s * delta_s) / (K_para * K_para)));
		ce = 1.0f / (1.0f + ((delta_e * delta_e) / (K_para * K_para)));
		cw = 1.0f / (1.0f + ((delta_w * delta_w) / (K_para * K_para)));
		cu = 1.0f / (1.0f + ((delta_u * delta_u) / (K_para * K_para)));
		cd = 1.0f / (1.0f + ((delta_d * delta_d) / (K_para * K_para)));
	  
		tempt(i,j,k, 
		      (*this)(i,j,k) + 
		      Lamda_para * (cn * delta_n + cs * delta_s + ce * delta_e + 
				    cw * delta_w + cu * delta_u + cd * delta_d));
		}
	    
	    if(_vosm) _vosm->step(this, VoxelOperationStatusMessenger::AnisotropicDiffusion, stepnum);
            cvcapp.threadProgress(float(stepnum)/float(numSteps));
            stepnum++;
	  }
    
	(*this) = tempt;
      }

    if(_vosm) _vosm->end(this, VoxelOperationStatusMessenger::AnisotropicDiffusion);
    cvcapp.threadProgress(1.0f);

    return *this;
  }