hypre/struct_ls/jacobi.c

217 lines
6.5 KiB
C

/*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$
***********************************************************************EHEADER*/
#include "_hypre_struct_ls.h"
typedef struct
{
void *relax_data;
} hypre_JacobiData;
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
void *
hypre_JacobiCreate( MPI_Comm comm )
{
hypre_JacobiData *jacobi_data;
void *relax_data;
hypre_Index stride;
hypre_Index indices[1];
jacobi_data = hypre_CTAlloc(hypre_JacobiData, 1);
relax_data = hypre_PointRelaxCreate(comm);
hypre_PointRelaxSetNumPointsets(relax_data, 1);
hypre_SetIndex(stride, 1, 1, 1);
hypre_SetIndex(indices[0], 0, 0, 0);
hypre_PointRelaxSetPointset(relax_data, 0, 1, stride, indices);
hypre_PointRelaxSetTol(relax_data,1.0e-6);
(jacobi_data -> relax_data) = relax_data;
return (void *) jacobi_data;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiDestroy( void *jacobi_vdata )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
if (jacobi_data)
{
hypre_PointRelaxDestroy(jacobi_data -> relax_data);
hypre_TFree(jacobi_data);
}
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiSetup( void *jacobi_vdata,
hypre_StructMatrix *A,
hypre_StructVector *b,
hypre_StructVector *x )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxSetup((jacobi_data -> relax_data), A, b, x);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiSolve( void *jacobi_vdata,
hypre_StructMatrix *A,
hypre_StructVector *b,
hypre_StructVector *x )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelax((jacobi_data -> relax_data), A, b, x);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiSetTol( void *jacobi_vdata,
double tol )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxSetTol((jacobi_data -> relax_data), tol);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiGetTol( void *jacobi_vdata,
double *tol )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxGetTol((jacobi_data -> relax_data), tol);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiSetMaxIter( void *jacobi_vdata,
HYPRE_Int max_iter )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxSetMaxIter((jacobi_data -> relax_data), max_iter);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiGetMaxIter( void *jacobi_vdata,
HYPRE_Int * max_iter )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxGetMaxIter((jacobi_data -> relax_data), max_iter);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiSetZeroGuess( void *jacobi_vdata,
HYPRE_Int zero_guess )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxSetZeroGuess((jacobi_data -> relax_data), zero_guess);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiGetZeroGuess( void *jacobi_vdata,
HYPRE_Int * zero_guess )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxGetZeroGuess((jacobi_data -> relax_data), zero_guess);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiGetNumIterations( void *jacobi_vdata,
HYPRE_Int * num_iterations )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxGetNumIterations((jacobi_data -> relax_data), num_iterations );
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int
hypre_JacobiSetTempVec( void *jacobi_vdata,
hypre_StructVector *t )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
hypre_PointRelaxSetTempVec((jacobi_data -> relax_data), t);
return hypre_error_flag;
}
/*--------------------------------------------------------------------------
*--------------------------------------------------------------------------*/
HYPRE_Int hypre_JacobiGetFinalRelativeResidualNorm( void * jacobi_vdata,
double * norm )
{
hypre_JacobiData *jacobi_data = jacobi_vdata;
void *relax_data = jacobi_data -> relax_data;
return hypre_PointRelaxGetFinalRelativeResidualNorm( relax_data, norm );
}