hypre/CI_struct_ls/struct_solver_PETSc.c
1999-03-30 20:50:31 +00:00

171 lines
5.0 KiB
C

/*BHEADER**********************************************************************
* (c) 1997 The Regents of the University of California
*
* See the file COPYRIGHT_and_DISCLAIMER for a complete copyright
* notice, contact person, and disclaimer.
*
* $Revision$
*********************************************************************EHEADER*/
/******************************************************************************
*
* Member functions for hypre_StructInterfaceSolver class for PETSc storage scheme.
*
*****************************************************************************/
#include "./headers.h"
#ifdef PETSC_AVAILABLE
/* include PETSc linear solver headers */
#include "sles.h"
#endif
/*--------------------------------------------------------------------------
* hypre_FreeStructInterfaceSolverPETSc
* Internal routine for freeing a solver stored in PETSc form.
*--------------------------------------------------------------------------*/
int
hypre_FreeStructInterfaceSolverPETSc( hypre_StructInterfaceSolver *struct_solver )
{
#ifdef PETSC_AVAILABLE
HYPRE_FreePETScSolverParILUT
( (HYPRE_PETScSolverParILUT) hypre_StructInterfaceSolverData( struct_solver ) );
return(0);
#else
return(-1);
#endif
}
/*--------------------------------------------------------------------------
* hypre_StructInterfaceSolverInitializePETSc
*--------------------------------------------------------------------------*/
int
hypre_StructInterfaceSolverInitializePETSc( hypre_StructInterfaceSolver *struct_solver )
{
#ifdef PETSC_AVAILABLE
int ierr = 0;
hypre_StructInterfaceSolverData( struct_solver ) = HYPRE_NewPETScSolverParILUT
( hypre_StructInterfaceSolverContext( struct_solver ));
return(ierr);
#else
return(-1);
#endif
}
/*--------------------------------------------------------------------------
* hypre_StructInterfaceSolverSetupPETSc
* Internal routine for setting up a solver for a matrix stored in PETSc form.
*--------------------------------------------------------------------------*/
int
hypre_StructInterfaceSolverSetupPETSc( hypre_StructInterfaceSolver *struct_solver )
{
#ifdef PETSC_AVAILABLE
HYPRE_StructInterfaceMatrix matrix=hypre_StructInterfaceSolverMatrix(struct_solver);
HYPRE_StructInterfaceVector soln=hypre_StructInterfaceSolverSoln(struct_solver);
HYPRE_StructInterfaceVector rhs=hypre_StructInterfaceSolverRhs(struct_solver);
HYPRE_PETScSolverParILUT solver_data;
Mat Petsc_matrix;
Vec Petsc_soln, Petsc_rhs;
int ierr;
solver_data = hypre_StructInterfaceSolverData( struct_solver );
Petsc_matrix = (Mat) HYPRE_StructInterfaceMatrixGetData( matrix );
HYPRE_PETScSolverParILUTSetSystemMatrix( solver_data, Petsc_matrix );
Petsc_soln = (Vec) HYPRE_StructInterfaceVectorGetData( soln );
Petsc_rhs = (Vec) HYPRE_StructInterfaceVectorGetData( rhs );
ierr = HYPRE_PETScSolverParILUTSetup(
solver_data, Petsc_soln, Petsc_rhs );
return(ierr);
#else
return(-1);
#endif
}
/*--------------------------------------------------------------------------
* hypre_StructInterfaceSolverSolvePETSc
* Internal routine for solving
*--------------------------------------------------------------------------*/
int
hypre_StructInterfaceSolverSolvePETSc( hypre_StructInterfaceSolver *struct_solver )
{
#ifdef PETSC_AVAILABLE
HYPRE_StructInterfaceVector soln=hypre_StructInterfaceSolverSoln(struct_solver);
HYPRE_StructInterfaceVector rhs=hypre_StructInterfaceSolverRhs(struct_solver);
HYPRE_PETScSolverParILUT solver_data=hypre_StructInterfaceSolverData( struct_solver );
Vec Petsc_soln, Petsc_rhs;
int ierr;
Petsc_soln = (Vec) HYPRE_StructInterfaceVectorGetData( soln );
Petsc_rhs = (Vec) HYPRE_StructInterfaceVectorGetData( rhs );
ierr = HYPRE_PETScSolverParILUTSolve(
solver_data, Petsc_soln, Petsc_rhs );
return(ierr);
#else
return(-1);
#endif
}
/*--------------------------------------------------------------------------
* hypre_StructInterfaceSolverPETScSetDropTolerance
*--------------------------------------------------------------------------*/
int
hypre_StructInterfaceSolverPETScSetDropTolerance( hypre_StructInterfaceSolver *struct_solver,
double tol )
{
#ifdef PETSC_AVAILABLE
int ierr=0;
ierr = HYPRE_PETScSolverParILUTSetDropTolerance
( (HYPRE_PETScSolverParILUT) hypre_StructInterfaceSolverData( struct_solver ), tol );
return(ierr);
#else
return(-1);
#endif
}
/*--------------------------------------------------------------------------
* hypre_StructInterfaceSolverPETScSetFactorRowSize
*--------------------------------------------------------------------------*/
int
hypre_StructInterfaceSolverPETScSetFactorRowSize( hypre_StructInterfaceSolver *struct_solver,
int size )
{
#ifdef PETSC_AVAILABLE
int ierr=0;
ierr = HYPRE_PETScSolverParILUTSetFactorRowSize
( (HYPRE_PETScSolverParILUT) hypre_StructInterfaceSolverData( struct_solver ), size );
return(ierr);
#else
return(-1);
#endif
}