#include "Amesos_ConfigDefs.h"
#ifdef HAVE_AMESOS_TRIUTILS
#ifdef HAVE_MPI
#include "mpi.h"
#include "Epetra_MpiComm.h"
#else
#include "Epetra_SerialComm.h"
#endif
#include "Epetra_Vector.h"
#include "Epetra_Time.h"
#include "Epetra_RowMatrix.h"
#include "Epetra_CrsMatrix.h"
#include "Amesos.h"
#include "Amesos_BaseSolver.h"
#include <vector>
#include "Teuchos_ParameterList.hpp"
#include "Trilinos_Util_CrsMatrixGallery.h"
using namespace Trilinos_Util;
int main(int argc, char *argv[]) {
#ifdef HAVE_MPI
MPI_Init(&argc, &argv);
Epetra_MpiComm Comm(MPI_COMM_WORLD);
#else
Epetra_SerialComm Comm;
#endif
bool verbose = (Comm.MyPID() == 0);
double TotalResidual = 0.0;
char* ProblemType = "laplace_3d";
int NumGlobalRows = 1000;
CrsMatrixGallery Gallery(ProblemType, Comm);
Gallery.Set("problem_size",NumGlobalRows);
Gallery.Set("num_vectors",1);
Epetra_LinearProblem* Problem = Gallery.GetLinearProblem();
assert (Problem != 0);
Epetra_MultiVector* lhs = Problem->GetLHS();
Epetra_MultiVector* rhs = Problem->GetRHS();
Epetra_RowMatrix* A = Problem->GetMatrix();
Teuchos::ParameterList List;
List.set("ComputeTruResidual",true);
vector<string> SolverType;
SolverType.push_back("Amesos_Lapack");
SolverType.push_back("Amesos_Klu");
SolverType.push_back("Amesos_Umfpack");
SolverType.push_back("Amesos_Superlu");
SolverType.push_back("Amesos_Superludist");
SolverType.push_back("Amesos_Mumps");
Epetra_Time Time(Comm);
Amesos Factory;
for (unsigned int i = 0 ; i < SolverType.size() ; ++i) {
if (Factory.Query(SolverType[i])) {
lhs->PutScalar(1.0);
A->Multiply(false,*lhs,*rhs);
lhs->Random();
Amesos_BaseSolver* Solver = Factory.Create(SolverType[i], *Problem);
assert (Solver != 0);
Time.ResetStartTime();
AMESOS_CHK_ERR(Solver->SymbolicFactorization());
if (verbose)
cout << endl
<< "Solver " << SolverType[i]
<< ", symbolic factorization time = "
<< Time.ElapsedTime() << endl;
AMESOS_CHK_ERR(Solver->NumericFactorization());
if (verbose)
cout << "Solver " << SolverType[i]
<< ", numeric factorization time = "
<< Time.ElapsedTime() << endl;
AMESOS_CHK_ERR(Solver->Solve());
if (verbose)
cout << "Solver " << SolverType[i]
<< ", solve time = "
<< Time.ElapsedTime() << endl;
double d = 0.0, d_tot = 0.0;
for (int j = 0 ; j< lhs->Map().NumMyElements() ; ++j)
d += ((*lhs)[0][j] - 1.0) * ((*lhs)[0][j] - 1.0);
Comm.SumAll(&d,&d_tot,1);
if (verbose)
cout << "Solver " << SolverType[i] << ", ||x - x_exact||_2 = "
<< sqrt(d_tot) << endl;
delete Solver;
TotalResidual += d_tot;
}
}
if (TotalResidual > 1e-9)
exit(EXIT_FAILURE);
#ifdef HAVE_MPI
MPI_Finalize();
#endif
exit(EXIT_SUCCESS);
}
#else
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
puts("Please configure AMESOS with --enable-triutils");
puts("to run this example");
return 0;
}
#endif