//#####################################################################
// Copyright 2005-2008, Eran Guendelman, Jerry Talton.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class FACE_ITERATOR
//##################################################################### 
#include <Core/Grids/FACE_ITERATOR.h>
using namespace PhysBAM;
//#####################################################################
// Constructor
//#####################################################################
// axis_input==0 means iterate through faces in all dimensions
template<class TV> FACE_ITERATOR<TV>::
FACE_ITERATOR(const GRID<TV>& grid_input,const int number_of_ghost_cells_input,
    const GRID_REGION& region_type_input,const int side_input,
    int axis_input)
    :grid(grid_input)
{
    int inner_ghost=0,outer_ghost=number_of_ghost_cells_input;
    RF flags=RF::none;
    switch(region_type_input){
        case WHOLE_REGION:inner_ghost=outer_ghost;break;
        case GHOST_REGION:flags=RF::ghost|RF::skip_inner;break;
        case BOUNDARY_REGION:inner_ghost=outer_ghost;flags=RF::ghost;break;
        case INTERIOR_REGION:inner_ghost=outer_ghost;flags=RF::skip_outer;break;
        case BOUNDARY_INTERIOR_REGION:PHYSBAM_FATAL_ERROR();break;}
    Set_Range(grid_input.numbers_of_cells,outer_ghost,inner_ghost);
    Initialize(flags,side_input,axis_input);
}
//#####################################################################
// Constructor
//#####################################################################
template<class TV> FACE_ITERATOR<TV>::
FACE_ITERATOR(const GRID<TV>& grid_input,const RANGE<IV>& explicit_region_input,
    const int axis_input)
    :FACE_RANGE_ITERATOR<TV::m>(explicit_region_input,RF::none,axis_input),
    grid(grid_input)
{
}
//#####################################################################
namespace PhysBAM{
template class FACE_ITERATOR<VECTOR<float,1> >;
template class FACE_ITERATOR<VECTOR<float,2> >;
template class FACE_ITERATOR<VECTOR<float,3> >;
template class FACE_ITERATOR<VECTOR<double,1> >;
template class FACE_ITERATOR<VECTOR<double,2> >;
template class FACE_ITERATOR<VECTOR<double,3> >;
}
