5 #include "Epetra_MpiComm.h" 7 #include "Epetra_SerialComm.h" 9 #include "Epetra_Map.h" 10 #include "Epetra_Vector.h" 11 #include "Epetra_Util.h" 12 #include "Epetra_CrsMatrix.h" 19 const Epetra_MultiVector& x,
20 const Epetra_MultiVector& b,
21 const Epetra_MultiVector& x_exact)
23 std::vector<double> Norm;
24 int NumVectors = x.NumVectors();
25 Norm.resize(NumVectors);
26 Epetra_MultiVector Ax(x);
27 A.Multiply(
false,x,Ax);
28 Ax.Update(1.0,b,-1.0);
30 bool TestPassed =
false;
31 double TotalNorm = 0.0;
32 for (
int i = 0 ; i < NumVectors ; ++i) {
35 if (
A.Comm().MyPID() == 0)
36 std::cout <<
"||Ax - b|| = " << TotalNorm << std::endl;
37 if (TotalNorm < 1e-5 )
42 Ax.Update (1.0,x,-1.0,x_exact,0.0);
44 for (
int i = 0 ; i < NumVectors ; ++i) {
47 if (
A.Comm().MyPID() == 0)
48 std::cout <<
"||Ax - b|| = " << TotalNorm << std::endl;
49 if (TotalNorm < 1e-5 )
58 int main(
int argc,
char *argv[])
61 MPI_Init(&argc, &argv);
62 Epetra_MpiComm
Comm(MPI_COMM_WORLD);
64 Epetra_SerialComm
Comm;
67 int NumGlobalElements = 1000;
74 int* part =
new int[NumGlobalElements];
76 if (
Comm.MyPID() == 0) {
79 for(
int i=0 ; i<NumGlobalElements ; ++i ) {
80 unsigned int r = Util.RandomInt();
81 part[i] = r%(
Comm.NumProc());
85 Comm.Broadcast(part,NumGlobalElements,0);
88 int NumMyElements = 0;
89 for (
int i = 0 ; i < NumGlobalElements ; ++i) {
90 if (part[i] ==
Comm.MyPID())
95 int* MyGlobalElements =
new int[NumMyElements];
97 for (
int i = 0 ; i < NumGlobalElements ; ++i) {
98 if (part[i] ==
Comm.MyPID() )
99 MyGlobalElements[count++] = i;
102 Epetra_Map Map(NumGlobalElements,NumMyElements,MyGlobalElements,
111 Epetra_CrsMatrix Matrix(
Copy,Map,NumGlobalElements);
113 int* Indices =
new int[NumGlobalElements];
114 double* Values =
new double[NumGlobalElements];
116 for (
int i = 0 ; i < NumGlobalElements ; ++i)
119 for (
int i = 0 ; i < NumMyElements ; ++i) {
120 int iGlobal = MyGlobalElements[i];
121 for (
int jGlobal = 0 ; jGlobal < NumGlobalElements ; ++jGlobal) {
122 if (iGlobal == jGlobal)
123 Values[jGlobal] = 1.0 * (NumGlobalElements + 1 ) *
124 (NumGlobalElements + 1);
125 else if (iGlobal > jGlobal)
126 Values[jGlobal] = -1.0*(jGlobal+1);
128 Values[jGlobal] = 1.0*(iGlobal+1);
130 Matrix.InsertGlobalValues(MyGlobalElements[i],
131 NumGlobalElements, Values, Indices);
135 Matrix.FillComplete();
137 delete [] MyGlobalElements;
146 Epetra_MultiVector x(Map,NumVectors);
147 Epetra_MultiVector x_exact(Map,NumVectors);
148 Epetra_MultiVector b(Map,NumVectors);
150 A.Multiply(
false,x_exact,b);
156 Epetra_LinearProblem Problem;
159 Problem.SetOperator(&
A);
167 bool TestPassed =
true;
169 TestPassed = TestPassed &&
179 return(EXIT_SUCCESS);
int main(int argc, char *argv[])
int Solve()
Solves A X = B (or AT x = B)
Amesos_TestRowMatrix: a class to test Epetra_RowMatrix based codes.
Amesos_Superlu: Amesos interface to Xioye Li's SuperLU 3.0 serial code.
#define AMESOS_CHK_ERR(a)
int SymbolicFactorization()
Performs SymbolicFactorization on the matrix A.
bool CheckError(const Epetra_RowMatrix &A, const Epetra_MultiVector &x, const Epetra_MultiVector &b, const Epetra_MultiVector &x_exact)
int NumericFactorization()
Performs NumericFactorization on the matrix A.