71 int main(
int argc,
char *argv[])
79 MPI_Init(&argc,&argv);
89 int MyPID = Comm.
MyPID();
91 bool verbose = (MyPID==0);
96 std::cout << Comm << std::endl;
102 std::cout <<
"Usage: " << argv[0] <<
" number_of_equations" << std::endl;
105 int NumGlobalElements = std::atoi(argv[1]);
107 if (NumGlobalElements < NumProc)
110 std::cout <<
"numGlobalBlocks = " << NumGlobalElements
111 <<
" cannot be < number of processors = " << NumProc << std::endl;
124 std::vector<int> MyGlobalElements(NumMyElements);
131 std::vector<int> NumNz(NumMyElements);
136 for (i=0; i<NumMyElements; i++)
137 if (MyGlobalElements[i]==0 || MyGlobalElements[i] == NumGlobalElements-1)
151 std::vector<double> Values(2);
152 Values[0] = -1.0; Values[1] = -1.0;
153 std::vector<int> Indices(2);
157 for (i=0; i<NumMyElements; i++)
159 if (MyGlobalElements[i]==0)
164 else if (MyGlobalElements[i] == NumGlobalElements-1)
166 Indices[0] = NumGlobalElements-2;
171 Indices[0] = MyGlobalElements[i]-1;
172 Indices[1] = MyGlobalElements[i]+1;
175 ierr = A.
InsertGlobalValues(MyGlobalElements[i], NumEntries, &Values[0], &Indices[0]);
191 int niters = NumGlobalElements*10;
192 double tolerance = 1.0e-2;
198 ierr +=
power_method(A, lambda, niters, tolerance, verbose);
200 double total_flops =counter.
Flops();
201 double MFLOPs = total_flops/elapsed_time/1000000.0;
204 std::cout <<
"\n\nTotal MFLOPs for first solve = " << MFLOPs << std::endl<< std::endl;
208 std::cout <<
"\nIncreasing magnitude of first diagonal term, solving again\n\n"
213 std::vector<double> Rowvals(numvals);
214 std::vector<int> Rowinds(numvals);
216 for (i=0; i<numvals; i++)
if (Rowinds[i] == 0) Rowvals[i] *= 10.0;
225 ierr +=
power_method(A, lambda, niters, tolerance, verbose);
227 total_flops = counter.
Flops();
228 MFLOPs = total_flops/elapsed_time/1000000.0;
231 std::cout <<
"\n\nTotal MFLOPs for second solve = " << MFLOPs << std::endl<< std::endl;
245 double tolerance,
bool verbose) {
255 resid.SetFlopCounter(A);
262 double normz, residual;
266 for (
int iter = 0; iter < niters; iter++)
269 q.Scale(1.0/normz, z);
272 if (iter%100==0 || iter+1==niters)
274 resid.Update(1.0, z, -lambda, q, 0.0);
275 resid.Norm2(&residual);
276 if (verbose) std::cout <<
"Iter = " << iter <<
" Lambda = " << lambda
277 <<
" Residual of A*q - lambda*q = "
278 << residual << std::endl;
280 if (residual < tolerance) {
void SetFlopCounter(const Epetra_Flops &FlopCounter_in)
Set the internal Epetra_Flops() pointer.
bool MyGlobalRow(int GID) const
Returns true of GID is owned by the calling processor, otherwise it returns false.
Epetra_Map: A class for partitioning vectors and matrices.
int NumGlobalEntries(long long Row) const
Returns the current number of nonzero entries in specified global row on this processor.
int Multiply(bool TransA, const Epetra_Vector &x, Epetra_Vector &y) const
Returns the result of a Epetra_CrsMatrix multiplied by a Epetra_Vector x in y.
int MyGlobalElements(int *MyGlobalElementList) const
Puts list of global elements on this processor into the user-provided array.
double ElapsedTime(void) const
Epetra_Time elapsed time function.
virtual int InsertGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
Insert a list of elements in a given global row of the matrix.
T * Epetra_Util_data_ptr(std::vector< T > &vec)
Function that returns either a pointer to the first entry in the vector or, if the vector is empty...
int power_method(Epetra_CrsMatrix &A, double &lambda, int niters, double tolerance, bool verbose)
Epetra_Vector: A class for constructing and using dense vectors on a parallel computer.
int MyPID() const
Return my process ID.
Epetra_MpiComm: The Epetra MPI Communication Class.
std::string Epetra_Version()
int FillComplete(bool OptimizeDataStorage=true)
Signal that data entry is complete. Perform transformations to local index space. ...
Epetra_Time: The Epetra Timing Class.
const Epetra_Map & RowMap() const
Returns the Epetra_Map object associated with the rows of this matrix.
int NumMyElements() const
Number of elements on the calling processor.
int ExtractGlobalRowCopy(int GlobalRow, int Length, int &NumEntries, double *Values, int *Indices) const
Returns a copy of the specified global row in user-provided arrays.
int NumProc() const
Returns total number of processes (always returns 1 for SerialComm).
Epetra_SerialComm: The Epetra Serial Communication Class.
void ResetFlops()
Resets the number of floating point operations to zero for this multi-vector.
Epetra_Flops: The Epetra Floating Point Operations Class.
double Flops() const
Returns the number of floating point operations with this object and resets the count.
Epetra_CrsMatrix: A class for constructing and using real-valued double-precision sparse compressed r...
int main(int argc, char *argv[])
void ResetStartTime(void)
Epetra_Time function to reset the start time for a timer object.
virtual int ReplaceGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
Replace specified existing values with this list of entries for a given global row of the matrix...
Epetra_Flops * GetFlopCounter() const
Get the pointer to the Epetra_Flops() object associated with this object, returns 0 if none...