fei_Factory_Aztec.cpp

00001 /*--------------------------------------------------------------------*/
00002 /*    Copyright 2005 Sandia Corporation.                              */
00003 /*    Under the terms of Contract DE-AC04-94AL85000, there is a       */
00004 /*    non-exclusive license for use of this work by or on behalf      */
00005 /*    of the U.S. Government.  Export of this program may require     */
00006 /*    a license from the United States Government.                    */
00007 /*--------------------------------------------------------------------*/
00008 
00009 #include "fei_trilinos_macros.hpp"
00010 
00011 #include <fei_Factory_Aztec.hpp>
00012 
00013 #include <fei_VectorReducer.hpp>
00014 #include <fei_MatrixReducer.hpp>
00015 
00016 Factory_Aztec::Factory_Aztec(MPI_Comm comm)
00017   : fei::Factory(comm),
00018     comm_(comm),
00019     reducer_(),
00020     blockEntryMatrix_(false),
00021     outputLevel_(0)
00022 {
00023 }
00024 
00025 Factory_Aztec::~Factory_Aztec()
00026 {
00027 }
00028 
00029 int Factory_Aztec::parameters(int numParams,
00030                                   const char* const* paramStrings)
00031 {
00032   std::vector<std::string> stdstrings;
00033   fei::utils::char_ptrs_to_strings(numParams, paramStrings, stdstrings);
00034 
00035   fei::ParameterSet paramset;
00036   fei::utils::parse_strings(stdstrings, " ", paramset);
00037 
00038   parameters(paramset);
00039   return(0);
00040 }
00041 
00042 void Factory_Aztec::parameters(const fei::ParameterSet& parameterset)
00043 {
00044   fei::Factory::parameters(parameterset);
00045 
00046   parameterset.getIntParamValue("outputLevel", outputLevel_);
00047 
00048   bool blkGraph = false;
00049   bool blkMatrix = false;
00050 
00051   parameterset.getBoolParamValue("BLOCK_GRAPH", blkGraph);
00052   parameterset.getBoolParamValue("BLOCK_MATRIX", blkMatrix);
00053 
00054   blockEntryMatrix_ = (blkGraph || blkMatrix);
00055 }
00056 
00057 fei::SharedPtr<fei::MatrixGraph>
00058 Factory_Aztec::createMatrixGraph(fei::SharedPtr<fei::VectorSpace> rowSpace,
00059                       fei::SharedPtr<fei::VectorSpace> colSpace,
00060                       const char* name)
00061 {
00062   static fei::MatrixGraph_Impl2::Factory factory2;
00063   return factory2.createMatrixGraph(rowSpace, colSpace, name);
00064 }
00065 
00066 fei::SharedPtr<fei::Vector>
00067 Factory_Aztec::createVector(fei::SharedPtr<fei::VectorSpace> vecSpace,
00068                                bool isSolutionVector,
00069                                int numVectors)
00070 {
00071   std::vector<int> indices;
00072   int err = 0, localSize = 0;
00073   if (reducer_.get() != NULL) {
00074     indices = reducer_->getLocalReducedEqns();
00075     localSize = indices.size();
00076   }
00077   else {
00078     if (blockEntryMatrix_) {
00079       localSize = vecSpace->getNumBlkIndices_Owned();
00080       indices.resize(localSize*2);
00081       err = vecSpace->getBlkIndices_Owned(localSize, &indices[0], &indices[localSize], localSize);
00082     }
00083     else {
00084       localSize = vecSpace->getNumIndices_Owned();
00085       err = vecSpace->getIndices_Owned(indices);
00086     }
00087   }
00088   if (err != 0) {
00089     throw std::runtime_error("fei::Factory_Aztec: error in vecSpace->getIndices_Owned");
00090   }
00091 
00092   fei::SharedPtr<fei::Vector> feivec, tmpvec;
00093 
00094   if (reducer_.get() != NULL) {
00095     feivec.reset(new fei::VectorReducer(reducer_,
00096                                         tmpvec, isSolutionVector));
00097   }
00098   else {
00099     feivec = tmpvec;
00100   }
00101 
00102   return(feivec);
00103 }
00104 
00105 fei::SharedPtr<fei::Vector>
00106 Factory_Aztec::createVector(fei::SharedPtr<fei::VectorSpace> vecSpace,
00107                                int numVectors)
00108 {
00109   bool isSolnVector = false;
00110   return(createVector(vecSpace, isSolnVector, numVectors));
00111 }
00112 
00113 fei::SharedPtr<fei::Vector>
00114 Factory_Aztec::createVector(fei::SharedPtr<fei::MatrixGraph> matrixGraph,
00115                               int numVectors)
00116 {
00117   bool isSolnVector = false;
00118   return(createVector(matrixGraph, isSolnVector, numVectors));
00119 }
00120 
00121 fei::SharedPtr<fei::Vector>
00122 Factory_Aztec::createVector(fei::SharedPtr<fei::MatrixGraph> matrixGraph,
00123                                bool isSolutionVector,
00124                                int numVectors)
00125 {
00126   int globalNumSlaves = matrixGraph->getGlobalNumSlaveConstraints();
00127 
00128   if (globalNumSlaves > 0 && reducer_.get()==NULL) {
00129     reducer_ = matrixGraph->getReducer();
00130   }
00131 
00132   fei::SharedPtr<fei::Vector> feivec, tmpvec;
00133 
00134   std::vector<int> indices;
00135   int err = 0, localSize;
00136   fei::SharedPtr<fei::VectorSpace> vecSpace = matrixGraph->getRowSpace();
00137   if (reducer_.get() != NULL) {
00138     indices = reducer_->getLocalReducedEqns();
00139     localSize = indices.size();
00140   }
00141   else {
00142     localSize = vecSpace->getNumIndices_Owned();
00143     indices.resize(localSize);
00144     err = vecSpace->getIndices_Owned(indices);
00145   }
00146   if (err != 0) {
00147     throw std::runtime_error("error in vecSpace->getIndices_Owned");
00148   }
00149 
00150   if (reducer_.get() != NULL) {
00151     feivec.reset(new fei::VectorReducer(reducer_, tmpvec, isSolutionVector));
00152   }
00153   else {
00154     feivec = tmpvec;
00155   }
00156 
00157   return(feivec);
00158 }
00159 
00160 fei::SharedPtr<fei::Matrix>
00161 Factory_Aztec::createMatrix(fei::SharedPtr<fei::MatrixGraph> matrixGraph)
00162 {
00163   fei::SharedPtr<fei::Matrix> feimat;
00164   int globalNumSlaves = matrixGraph->getGlobalNumSlaveConstraints();
00165 
00166   if (globalNumSlaves > 0 && reducer_.get()==NULL) {
00167     reducer_ = matrixGraph->getReducer();
00168   }
00169 
00170   return feimat;
00171 }
00172 
00173 fei::SharedPtr<fei::Solver>
00174 Factory_Aztec::createSolver(const char* name)
00175 {
00176   fei::SharedPtr<fei::Solver> solver;
00177   return(solver);
00178 }
00179 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends
Generated on Wed Apr 13 10:08:23 2011 for FEI by  doxygen 1.6.3