Thyra Package Browser (Single Doxygen Collection)  Version of the Day
EpetraThyraAdaptersTestHelpers.hpp
Go to the documentation of this file.
1 /*
2 // @HEADER
3 // ***********************************************************************
4 //
5 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
6 // Copyright (2004) Sandia Corporation
7 //
8 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9 // license for use of this work by or on behalf of the U.S. Government.
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 Roscoe A. Bartlett (bartlettra@ornl.gov)
39 //
40 // ***********************************************************************
41 // @HEADER
42 */
43 
45 #include "Epetra_SerialComm.h"
46 #ifdef HAVE_MPI
47 # include "Epetra_MpiComm.h"
48 #endif
49 #include "Epetra_Map.h"
50 #include "Epetra_CrsMatrix.h"
51 #include "Teuchos_as.hpp"
52 #include "Teuchos_Array.hpp"
53 #include "Teuchos_RCP.hpp"
54 #include "Teuchos_Comm.hpp"
55 #include "Teuchos_UnitTestHarness.hpp"
56 
57 
58 namespace {
59 
60 
61 //
62 // Helper code and declarations
63 //
64 
65 using Teuchos::as;
66 using Teuchos::RCP;
67 using Teuchos::rcp;
68 using Teuchos::Ptr;
69 using Teuchos::outArg;
70 using Teuchos::Array;
71 using Teuchos::Comm;
72 typedef Teuchos_Ordinal Ordinal;
73 
74 
75 int g_localDim = 4;
76 bool g_dumpAll = false;
77 bool g_show_all_tests = false;
78 
79 
81 {
82  Teuchos::UnitTestRepository::getCLP().setOption(
83  "local-dim", &g_localDim, "Local dimension of each vector." );
84  Teuchos::UnitTestRepository::getCLP().setOption(
85  "show-all-tests", "no-show-all-tests", &g_show_all_tests,
86  "Set if all tests are shown or not." );
87  Teuchos::UnitTestRepository::getCLP().setOption(
88  "dump-all", "no-dump-all", &g_dumpAll,
89  "Dump lots of data" );
90 }
91 
92 
93 RCP<const Epetra_Comm> getEpetraComm()
94 {
95 #ifdef HAVE_MPI
96  return rcp(new Epetra_MpiComm(MPI_COMM_WORLD));
97 #else
98  return rcp(new Epetra_SerialComm());
99 #endif
100 }
101 
102 
103 void createEpetraVsAndMap(const Thyra::Ordinal localDim_in,
104  const Ptr<RCP<const Thyra::VectorSpaceBase<double> > > &vs,
105  const Ptr<RCP<const Epetra_Map> > &epetra_map,
106  const int emptyProcRootRank = -1
107  )
108 {
109  const RCP<const Epetra_Comm> epetra_comm = getEpetraComm();
110  const int procRank = epetra_comm->MyPID();
111  const Thyra::Ordinal localDim = (procRank == emptyProcRootRank ? 0 : localDim_in);
112  *epetra_map = rcp(new Epetra_Map(-1, as<int>(localDim), 0, *epetra_comm));
113  *vs = Thyra::create_VectorSpace(*epetra_map);
114 }
115 
116 
117 RCP<Epetra_CrsMatrix> getEpetraMatrix(int numRows, int numCols, double shift=0.0)
118 {
119 
120  const RCP<const Epetra_Comm> comm = getEpetraComm();
121 
122  const Epetra_Map rowMap(numRows, 0, *comm);
123  const Epetra_Map domainMap(numCols, numCols, 0, *comm);
124 
125  const RCP<Epetra_CrsMatrix> epetraCrsM =
126  rcp(new Epetra_CrsMatrix(Copy, rowMap, numCols));
127 
128  Array<double> rowEntries(numCols);
129  Array<int> columnIndices(numCols);
130  for (int j = 0; j < numCols; ++j) {
131  columnIndices[j] = j;
132  }
133 
134  const int numLocalRows = rowMap.NumMyElements();
135 
136  for (int i = 0; i < numLocalRows; ++i) {
137 
138  for (int j = 0; j < numCols; ++j) {
139  rowEntries[j] = as<double>(i+1) + as<double>(j+1) / 10 + shift;
140  }
141 
142  epetraCrsM->InsertMyValues( i, numCols, &rowEntries[0], &columnIndices[0] );
143 
144  }
145 
146  epetraCrsM->FillComplete(domainMap, rowMap);
147 
148  return epetraCrsM;
149 }
150 
151 
152 } // namespace
RCP< const VectorSpaceBase< double > > create_VectorSpace(const RCP< const Epetra_Map > &epetra_map)
Create an VectorSpaceBase object given an Epetra_Map object.
Teuchos_Ordinal Ordinal