PlayaRandomBlockMatrixBuilderImpl.hpp

00001 /* @HEADER@ */
00002 //   
00003  /* @HEADER@ */
00004 
00005 
00006 #ifndef RANDOMBLOCKMATRIX_BUILDER_IMPL_HPP
00007 #define RANDOMBLOCKMATRIX_BUILDER_IMPL_HPP
00008 
00009 #include "PlayaRandomBlockMatrixBuilderDecl.hpp"
00010 #include "PlayaSimpleBlockOpDecl.hpp"
00011 #include "PlayaRandomSparseMatrixBuilderDecl.hpp"
00012 
00013 
00014 
00015 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00016 #include "PlayaSimpleBlockOpImpl.hpp"
00017 #include "PlayaRandomSparseMatrixBuilderImpl.hpp"
00018 #endif
00019 
00020 using namespace Playa;
00021 using namespace Teuchos;
00022 
00023 
00024 namespace Playa
00025 {
00026 
00027 template <class Scalar> 
00028 inline RandomBlockMatrixBuilder<Scalar>
00029 ::RandomBlockMatrixBuilder(const VectorSpace<Scalar>& d,
00030   const VectorSpace<Scalar>& r,
00031   double blockDensity,
00032   double onProcDensity,
00033   double offProcDensity,
00034   const VectorType<double>& type)
00035   : OperatorBuilder<double>(d, r, type), op_()
00036 {
00037   RCP<SimpleBlockOp<Scalar> > b = 
00038     rcp(new SimpleBlockOp<Scalar>(this->domain(), this->range()));
00039   RCP<LinearOperatorBase<Scalar> > p = b;
00040   op_ = p;
00041 
00042   for (int i=0; i<this->range().numBlocks(); i++)
00043   {
00044     for (int j=0; j<this->domain().numBlocks(); j++)
00045     {
00046       RandomSparseMatrixBuilder<Scalar> builder(this->domain().getBlock(j),
00047         this->range().getBlock(i),
00048         onProcDensity,
00049         offProcDensity,
00050         this->vecType());
00051       op_.setBlock(i, j, builder.getOp());
00052     }
00053   }
00054   b->endBlockFill();
00055 }
00056 }
00057 
00058 #endif

doxygen