/*BHEADER**********************************************************************
 * Copyright (c) 2008,  Lawrence Livermore National Security, LLC.
 * Produced at the Lawrence Livermore National Laboratory.
 * This file is part of HYPRE.  See file COPYRIGHT for details.
 *
 * HYPRE is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License (as published by the Free
 * Software Foundation) version 2.1 dated February 1999.
 *
 * $Revision: 2.4 $
 ***********************************************************************EHEADER*/



/******************************************************************************
 *
 * HYPRE_SStructStencil interface
 *
 *****************************************************************************/

#include "headers.h"

/*--------------------------------------------------------------------------
 * HYPRE_SStructStencilCreate
 *--------------------------------------------------------------------------*/

int
HYPRE_SStructStencilCreate( int                   ndim,
                            int                   size,
                            HYPRE_SStructStencil *stencil_ptr )
{
   int  ierr = 0;

   hypre_SStructStencil  *stencil;
   hypre_StructStencil   *sstencil;
   int                   *vars;

   stencil = hypre_TAlloc(hypre_SStructStencil, 1);
   ierr = HYPRE_StructStencilCreate(ndim, size, &sstencil);
   vars = hypre_CTAlloc(int, hypre_StructStencilSize(sstencil));

   hypre_SStructStencilSStencil(stencil) = sstencil;
   hypre_SStructStencilVars(stencil)     = vars;
   hypre_SStructStencilRefCount(stencil) = 1;

   *stencil_ptr = stencil;

   return ierr;
}

/*--------------------------------------------------------------------------
 * HYPRE_SStructStencilDestroy
 *--------------------------------------------------------------------------*/

int
HYPRE_SStructStencilDestroy( HYPRE_SStructStencil stencil )
{
   int  ierr = 0;

   if (stencil)
   {
      hypre_SStructStencilRefCount(stencil) --;
      if (hypre_SStructStencilRefCount(stencil) == 0)
      {
         HYPRE_StructStencilDestroy(hypre_SStructStencilSStencil(stencil));
         hypre_TFree(hypre_SStructStencilVars(stencil));
         hypre_TFree(stencil);
      }
   }

   return ierr;
}

/*--------------------------------------------------------------------------
 * HYPRE_SStructStencilSetEntry
 *--------------------------------------------------------------------------*/

int
HYPRE_SStructStencilSetEntry( HYPRE_SStructStencil  stencil,
                              int                   entry,
                              int                  *offset,
                              int                   var )
{
   int                   ierr;
   hypre_StructStencil  *sstencil = hypre_SStructStencilSStencil(stencil);

   ierr = HYPRE_StructStencilSetElement(sstencil, entry, offset);
   hypre_SStructStencilVar(stencil, entry) = var;

   return ierr;
}


