Galeri Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cxx_main.cpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Galeri: Finite Element and Matrix Generation Package
4 //
5 // Copyright 2006 ETHZ/NTESS and the Galeri contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #include "Galeri_Maps.h"
11 #include "Galeri_CrsMatrices.h"
12 #include "Galeri_Utils.h"
13 #ifdef HAVE_MPI
14 #include "Epetra_MpiComm.h"
15 #include "mpi.h"
16 #else
17 #include "Epetra_SerialComm.h"
18 #endif
19 #include "Epetra_Map.h"
20 #include "Epetra_Vector.h"
21 #include "Epetra_CrsMatrix.h"
22 #include "Epetra_LinearProblem.h"
24 
25 using namespace Galeri;
26 
27 // =========== //
28 // main driver //
29 // =========== //
30 
31 int main(int argc, char* argv[])
32 {
33 #ifdef HAVE_MPI
34  MPI_Init(&argc, &argv);
35  Epetra_MpiComm Comm(MPI_COMM_WORLD);
36 #else
37  Epetra_SerialComm Comm;
38 #endif
39 
40  // Here we create the linear problem
41  //
42  // Matrix * LHS = RHS
43  //
44  // with Matrix arising from a 5-point formula discretization.
45 
46  Epetra_Map* Map = 0;
47  Epetra_RowMatrix* Matrix = 0;
48 
49  Teuchos::ParameterList GaleriList;
50  // dimension of the problem is nx x ny
51  GaleriList.set("nx", 10 * Comm.NumProc());
52  GaleriList.set("ny", 10);
53  // total number of processors is mx x my
54  GaleriList.set("mx", Comm.NumProc());
55  GaleriList.set("my", 1);
56 
57  try
58  {
59  Map = CreateMap("Cartesian2D", Comm, GaleriList);
60  Matrix = CreateCrsMatrix("Laplace2D", Map, GaleriList);
61  Epetra_Vector ExactSolution(*Map); ExactSolution.Random();
62  Epetra_Vector LHS(*Map); LHS.PutScalar(0.0);
63  Epetra_Vector RHS(*Map);
64 
65  Matrix->Multiply(false, ExactSolution, RHS);
66 
67  Epetra_LinearProblem Problem(Matrix, &LHS, &RHS);
68 
69  // at this point any object that understand Epetra_LinearProblem can be
70  // used, for example AztecOO, Amesos. IFPACK and ML can be used to define a
71  // preconditioner for Matrix. Here we use a simple solver, based on
72  // LAPACK, that is meant for simple testing only.
73 
74  Solve(Problem);
75 
76  // and we compute the norm of the true residual.
77  double ResidualNorm = ComputeNorm(Matrix, &LHS, &RHS);
78 
79  if (Comm.MyPID() == 0)
80  cout << ResidualNorm << endl;
81 
82  delete Map;
83  delete Matrix;
84  }
85  catch (Galeri::Exception& rhs)
86  {
87  if (Comm.MyPID() == 0)
88  rhs.Print();
89  exit(EXIT_FAILURE);
90  }
91 
92 #ifdef HAVE_MPI
93  MPI_Finalize();
94 #endif
95 
96  return(EXIT_SUCCESS);
97 }
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
int MyPID() const
int NumProc() const
virtual int Multiply(bool TransA, const Epetra_MultiVector &X, Epetra_MultiVector &Y) const =0
int main(int argc, char *argv[])
Definition: CrsMatrix.cpp:29
int Solve(int, TYPE *, TYPE *, TYPE *)