Thyra Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
EpetraThyraAdaptersTestHelpers.hpp
Go to the documentation of this file.
00001 /*
00002 // @HEADER
00003 // ***********************************************************************
00004 // 
00005 //    Thyra: Interfaces and Support for Abstract Numerical Algorithms
00006 //                 Copyright (2004) Sandia Corporation
00007 // 
00008 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00009 // license for use of this work by or on behalf of the U.S. Government.
00010 // 
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are
00013 // met:
00014 //
00015 // 1. Redistributions of source code must retain the above copyright
00016 // notice, this list of conditions and the following disclaimer.
00017 //
00018 // 2. Redistributions in binary form must reproduce the above copyright
00019 // notice, this list of conditions and the following disclaimer in the
00020 // documentation and/or other materials provided with the distribution.
00021 //
00022 // 3. Neither the name of the Corporation nor the names of the
00023 // contributors may be used to endorse or promote products derived from
00024 // this software without specific prior written permission.
00025 //
00026 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00027 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00029 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00030 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00031 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00032 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00033 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00034 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00035 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00036 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037 //
00038 // Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov) 
00039 // 
00040 // ***********************************************************************
00041 // @HEADER
00042 */
00043 
00044 #include "Thyra_EpetraThyraWrappers.hpp"
00045 #include "Epetra_SerialComm.h"
00046 #ifdef HAVE_MPI
00047 #  include "Epetra_MpiComm.h"
00048 #endif
00049 #include "Epetra_Map.h"
00050 #include "Epetra_CrsMatrix.h"
00051 #include "Teuchos_as.hpp"
00052 #include "Teuchos_Array.hpp"
00053 #include "Teuchos_RCP.hpp"
00054 #include "Teuchos_Comm.hpp"
00055 #include "Teuchos_UnitTestHarness.hpp"
00056 
00057 
00058 namespace {
00059 
00060 
00061 //
00062 // Helper code and declarations
00063 //
00064 
00065 using Teuchos::as;
00066 using Teuchos::RCP;
00067 using Teuchos::rcp;
00068 using Teuchos::Ptr;
00069 using Teuchos::outArg;
00070 using Teuchos::Array;
00071 using Teuchos::Comm;
00072 typedef Teuchos_Ordinal Ordinal;
00073 
00074 
00075 int g_localDim = 4;
00076 bool g_dumpAll = false;
00077 bool g_show_all_tests = false;
00078 
00079 
00080 TEUCHOS_STATIC_SETUP()
00081 {
00082   Teuchos::UnitTestRepository::getCLP().setOption(
00083     "local-dim", &g_localDim, "Local dimension of each vector." );
00084   Teuchos::UnitTestRepository::getCLP().setOption(
00085     "show-all-tests", "no-show-all-tests", &g_show_all_tests,
00086     "Set if all tests are shown or not." );
00087   Teuchos::UnitTestRepository::getCLP().setOption(
00088     "dump-all", "no-dump-all", &g_dumpAll,
00089     "Dump lots of data" );
00090 }
00091 
00092 
00093 RCP<const Epetra_Comm> getEpetraComm()
00094 {
00095 #ifdef HAVE_MPI
00096   return rcp(new Epetra_MpiComm(MPI_COMM_WORLD));
00097 #else
00098   return rcp(new Epetra_SerialComm());
00099 #endif
00100 }
00101 
00102 
00103 void createEpetraVsAndMap(const Thyra::Ordinal localDim_in,
00104   const Ptr<RCP<const Thyra::VectorSpaceBase<double> > > &vs,
00105   const Ptr<RCP<const Epetra_Map> > &epetra_map,
00106   const int emptyProcRootRank = -1
00107   )
00108 {
00109   const RCP<const Epetra_Comm> epetra_comm = getEpetraComm();
00110   const int procRank = epetra_comm->MyPID();
00111   const Thyra::Ordinal localDim = (procRank == emptyProcRootRank ? 0 : localDim_in);
00112   *epetra_map = rcp(new Epetra_Map(-1, as<int>(localDim), 0, *epetra_comm));
00113   *vs =  Thyra::create_VectorSpace(*epetra_map);
00114 }
00115 
00116 
00117 RCP<Epetra_CrsMatrix> getEpetraMatrix(int numRows, int numCols, double shift=0.0) 
00118 {
00119 
00120   const RCP<const Epetra_Comm> comm = getEpetraComm();
00121 
00122   const Epetra_Map rowMap(numRows, 0, *comm);
00123   const Epetra_Map domainMap(numCols, numCols, 0, *comm);
00124  
00125   const RCP<Epetra_CrsMatrix> epetraCrsM =
00126     rcp(new Epetra_CrsMatrix(Copy, rowMap, numCols));
00127 
00128   Array<double> rowEntries(numCols);
00129   Array<int> columnIndices(numCols);
00130   for (int j = 0; j < numCols; ++j) {
00131     columnIndices[j] = j;
00132   }
00133 
00134   const int numLocalRows = rowMap.NumMyElements();
00135 
00136   for (int i = 0; i < numLocalRows; ++i) {
00137     
00138     for (int j = 0; j < numCols; ++j) {
00139       rowEntries[j] = as<double>(i+1) + as<double>(j+1) / 10 + shift;
00140     }
00141 
00142     epetraCrsM->InsertMyValues( i, numCols, &rowEntries[0], &columnIndices[0] );
00143 
00144   }
00145 
00146   epetraCrsM->FillComplete(domainMap, rowMap);
00147 
00148   return epetraCrsM;
00149 }
00150 
00151 
00152 } // namespace
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines