Epetra Package Browser (Single Doxygen Collection) Development
Loading...
Searching...
No Matches
test/IntMultiVectorDistributed/cxx_main.cpp
Go to the documentation of this file.
1/*
2//@HEADER
3// ************************************************************************
4//
5// Epetra: Linear Algebra Services Package
6// Copyright 2011 Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39//
40// ************************************************************************
41//@HEADER
42*/
43
44#include "Epetra_ConfigDefs.h"
46#include "Epetra_BlockMap.h"
47#include "Epetra_CombineMode.h"
48#include "Epetra_Import.h"
49#ifdef EPETRA_MPI
50#include "Epetra_MpiComm.h"
51#include <mpi.h>
52#else
53#include "Epetra_SerialComm.h"
54#endif
55#include "../epetra_test_err.h"
56#include "Epetra_Version.h"
57
58int main(int argc, char *argv[]) {
59 int ierr = 0;
60 int global_ierr = 0;
61 int numErr = 0;
62
63#ifdef EPETRA_MPI
64
65 // Initialize MPI
66
67 MPI_Init(&argc,&argv);
68 int rank; // My process ID
69
70 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
71 Epetra_MpiComm Comm( MPI_COMM_WORLD );
72
73#else
74
75 int rank = 0;
77
78#endif
79
80 bool verbose = false;
81
82 // Check if we should print results to standard out
83 if(argc > 1) {
84 if(argv[1][0]=='-' && argv[1][1]=='v') {
85 verbose = true;
86 }
87 }
88
89 Comm.SetTracebackMode(0); // This should shut down any error traceback reporting
90 int MyPID = Comm.MyPID();
91 int NumProc = Comm.NumProc();
92
93 if(verbose && MyPID==0)
94 cout << Epetra_Version() << endl << endl;
95
96 if(verbose) cout << "Processor " << MyPID << " of " << NumProc << " is alive." << endl;
97
98 // Redefine verbose to only print on PE 0
99 if(verbose && rank != 0)
100 verbose = false;
101
102 int NumMyEquations = 6;
103 int NumGlobalEquations = NumMyEquations*NumProc+EPETRA_MIN(NumProc,3);
104 if(MyPID < 3)
105 NumMyEquations++;
106
107 // Construct a Map that puts approximately the same Number of equations on each processor
108
109 Epetra_BlockMap Map(NumGlobalEquations, NumMyEquations, 1, 0, Comm);
110
111 // Get update list and number of local equations from newly created Map
112 std::vector<int> MyGlobalElements(Map.NumMyElements());
113 Map.MyGlobalElements(MyGlobalElements.data());
114
115 // Construct the IntMultiVector
116 const int numVecs = 3;
117 Epetra_IntMultiVector myIMV(Map, numVecs);
118
119 // Extract a view to populate the IntMultiVector
120 int myLDA;
121 int* myVals;
122 ierr = myIMV.ExtractView(&myVals, &myLDA);
123 Comm.MaxAll(&ierr, &global_ierr, 1);
124 EPETRA_TEST_ERR(global_ierr, numErr);
125 for(int i = 0; i < myIMV.MyLength(); ++i) {
126 for(int j = 0; j < numVecs; ++j) {
127 myVals[j*myLDA + i] = numVecs*i + j;
128 }
129 }
130
131 // Test: replace local values
132 myIMV.ReplaceMyValue(3, 2, 42);
133 ierr = (myIMV[2][3] == 42 ? 0 : 1);
134 Comm.MaxAll(&ierr, &global_ierr, 1);
135 EPETRA_TEST_ERR(global_ierr, numErr);
136
137 // Test: sum into local values
138 myIMV.SumIntoMyValue(3, 1, 42);
139 ierr = (myIMV[1][3] == 3*numVecs + 1 + 42 ? 0 : 1);
140 Comm.MaxAll(&ierr, &global_ierr, 1);
141 EPETRA_TEST_ERR(global_ierr, numErr);
142
143 // Test: replace and sum global values on rank 2
144 if(MyPID == 2) {
145 myIMV.ReplaceGlobalValue(Map.GID(3), 2, 48);
146 ierr = (myIMV[2][3] == 48 ? 0 : 1);
147 EPETRA_TEST_ERR(ierr, numErr);
148 myIMV.SumIntoGlobalValue(Map.GID(3), 1, 48);
149 ierr = (myIMV[1][3] == 3*numVecs + 1 + 42 + 48 ? 0 : 1);
150 EPETRA_TEST_ERR(ierr, numErr);
151 }
152 Comm.MaxAll(&ierr, &global_ierr, 1);
153 EPETRA_TEST_ERR(global_ierr, numErr);
154
155 // Construct a Map that puts all the elements on proc 0
156 Epetra_BlockMap Map0(NumGlobalEquations, (MyPID == 0 ? NumGlobalEquations : 0), 1, 0, Comm);
157 Epetra_IntMultiVector myIMV0(Map0, numVecs);
158
159 Epetra_Import myImporter(Map0, Map);
160 ierr = myIMV0.Import(myIMV, myImporter, Epetra_CombineMode::Insert);
161 Comm.MaxAll(&ierr, &global_ierr, 1);
162 EPETRA_TEST_ERR(global_ierr, numErr);
163
164 if(MyPID == 0) {
165 ierr = (myIMV0[1][ 3] == 3*numVecs + 1 + 42 ? 0 : 1);
166 EPETRA_TEST_ERR(ierr, numErr);
167 ierr = (myIMV0[1][10] == 3*numVecs + 1 + 42 ? 0 : 1);
168 EPETRA_TEST_ERR(ierr, numErr);
169 ierr = (myIMV0[1][17] == 3*numVecs + 1 + 42 + 48 ? 0 : 1);
170 EPETRA_TEST_ERR(ierr, numErr);
171 ierr = (myIMV0[1][24] == 3*numVecs + 1 + 42 ? 0 : 1);
172 EPETRA_TEST_ERR(ierr, numErr);
173 }
174
175
176#ifdef EPETRA_MPI
177 MPI_Finalize() ;
178#endif
179/* end main */
180 return(ierr);
181}
Epetra_Combine Mode enumerable type.
@ Insert
#define EPETRA_MIN(x, y)
std::string Epetra_Version()
Epetra_BlockMap: A class for partitioning block element vectors and matrices.
int MyGlobalElements(int *MyGlobalElementList) const
Puts list of global elements on this processor into the user-provided array.
int GID(int LID) const
Returns global ID of local ID, return IndexBase-1 if not found on this processor.
int NumMyElements() const
Number of elements on the calling processor.
int Import(const Epetra_SrcDistObject &A, const Epetra_Import &Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex *Indexor=0)
Imports an Epetra_DistObject using the Epetra_Import object.
Epetra_Import: This class builds an import object for efficient importing of off-processor elements.
Definition: Epetra_Import.h:63
Epetra_IntMultiVector: A class for constructing and using dense multi-vectors, vectors and matrices i...
int ReplaceMyValue(int MyRow, int VectorIndex, int OrdinalValue)
Replace current value at the specified (MyRow, VectorIndex) location with OrdinalValue.
int SumIntoGlobalValue(int GlobalRow, int VectorIndex, int OrdinalValue)
Adds OrdinalValue to existing value at the specified (GlobalRow, VectorIndex) location.
int MyLength() const
Returns the local vector length on the calling processor of vectors in the multi-vector.
int ExtractView(int **A, int *MyLDA) const
Set user-provided addresses of A and MyLDA.
int SumIntoMyValue(int MyRow, int VectorIndex, int OrdinalValue)
Adds OrdinalValue to existing value at the specified (MyRow, VectorIndex) location.
int ReplaceGlobalValue(int GlobalRow, int VectorIndex, int OrdinalValue)
Replace current value at the specified (GlobalRow, VectorIndex) location with OrdinalValue.
Epetra_MpiComm: The Epetra MPI Communication Class.
int MaxAll(double *PartialMaxs, double *GlobalMaxs, int Count) const
Epetra_MpiComm Global Max function.
int NumProc() const
Returns total number of processes.
int MyPID() const
Return my process ID.
static void SetTracebackMode(int TracebackModeValue)
Set the value of the Epetra_Object error traceback report mode.
Epetra_SerialComm: The Epetra Serial Communication Class.
#define EPETRA_TEST_ERR(a, b)
int main(int argc, char *argv[])