#include <Grid.h>

namespace Grid { 
  namespace QCD {

/////////////////////////////////////////////////////////////////
// Public interface
/////////////////////////////////////////////////////////////////
GridCartesian *SpaceTimeGrid::makeFourDimGrid(const std::vector<int> & latt,const std::vector<int> &simd,const std::vector<int> &mpi)
{
  return new GridCartesian(latt,simd,mpi); 
}
GridRedBlackCartesian *SpaceTimeGrid::makeFourDimRedBlackGrid(const GridCartesian *FourDimGrid)
{
  return new GridRedBlackCartesian(FourDimGrid); 
}

GridCartesian         *SpaceTimeGrid::makeFiveDimGrid(int Ls,const GridCartesian *FourDimGrid)
{
  int N4=FourDimGrid->_ndimension;

  std::vector<int> latt5(1,Ls);
  std::vector<int> simd5(1,1);
  std::vector<int>  mpi5(1,1);
  
  for(int d=0;d<N4;d++){
    latt5.push_back(FourDimGrid->_fdimensions[d]);
    simd5.push_back(FourDimGrid->_simd_layout[d]);
     mpi5.push_back(FourDimGrid->_processors[d]);
  }
  return new GridCartesian(latt5,simd5,mpi5); 
}

GridRedBlackCartesian *SpaceTimeGrid::makeFiveDimRedBlackGrid(int Ls,const GridCartesian *FourDimGrid)
{
  int N4=FourDimGrid->_ndimension;
  int cbd=1;
  std::vector<int> latt5(1,Ls);
  std::vector<int> simd5(1,1);
  std::vector<int>  mpi5(1,1);
  std::vector<int>   cb5(1,0);
    
  for(int d=0;d<N4;d++){
    latt5.push_back(FourDimGrid->_fdimensions[d]);
    simd5.push_back(FourDimGrid->_simd_layout[d]);
     mpi5.push_back(FourDimGrid->_processors[d]);
      cb5.push_back(  1);
    }
  return new GridRedBlackCartesian(latt5,simd5,mpi5,cb5,cbd); 
}

}}