00001
00002
00003
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