TEUCHOS_UNIT_TEST(tCloneLOF, blocked_epetra) { // build global (or serial communicator) #ifdef HAVE_MPI Teuchos::RCP<Epetra_Comm> eComm = Teuchos::rcp(new Epetra_MpiComm(MPI_COMM_WORLD)); #else Teuchos::RCP<Epetra_Comm> eComm = Teuchos::rcp(new Epetra_SerialComm()); #endif Teuchos::RCP<const Teuchos::MpiComm<int> > tComm = Teuchos::rcp(new Teuchos::MpiComm<int>(MPI_COMM_WORLD)); int myRank = eComm->MyPID(); int numProc = eComm->NumProc(); RCP<ConnManager<int,int> > connManager = rcp(new unit_test::ConnManager(myRank,numProc)); RCP<const FieldPattern> patternC1 = buildFieldPattern<Intrepid2::Basis_HGRAD_HEX_C1_FEM<double,FieldContainer> >(); RCP<panzer::BlockedDOFManager<int,int> > indexer = rcp(new panzer::BlockedDOFManager<int,int>()); indexer->setConnManager(connManager,MPI_COMM_WORLD); indexer->addField("U",patternC1); indexer->addField("V",patternC1); std::vector<std::vector<std::string> > fieldOrder(2); fieldOrder[0].push_back("U"); fieldOrder[1].push_back("V"); indexer->setFieldOrder(fieldOrder); indexer->buildGlobalUnknowns(); RCP<panzer::BlockedDOFManager<int,int> > control_indexer = rcp(new panzer::BlockedDOFManager<int,int>()); control_indexer->setConnManager(connManager,MPI_COMM_WORLD); control_indexer->addField("Z",patternC1); fieldOrder[0][0] = "Z"; control_indexer->buildGlobalUnknowns(); // setup factory RCP<BlockedEpetraLinearObjFactory<Traits,int> > ep_lof = Teuchos::rcp(new BlockedEpetraLinearObjFactory<Traits,int>(tComm,indexer)); // this is the member we are testing! RCP<const LinearObjFactory<Traits> > control_lof = cloneWithNewDomain(*ep_lof,control_indexer); RCP<const BlockedEpetraLinearObjFactory<Traits,int> > ep_control_lof = rcp_dynamic_cast<const BlockedEpetraLinearObjFactory<Traits,int> >(control_lof); /* TEST_ASSERT(ep_control_lof->getMap()->SameAs(*ep_lof->getMap())); TEST_EQUALITY(ep_control_lof->getColMap()->NumMyElements(),Teuchos::as<int>(control_owned.size())); */ }
TEUCHOS_UNIT_TEST(tCloneLOF, blocked_epetra_nonblocked_domain) { typedef Thyra::ProductVectorBase<double> PVector; typedef Thyra::BlockedLinearOpBase<double> BLinearOp; typedef Thyra::VectorBase<double> Vector; // build global (or serial communicator) #ifdef HAVE_MPI Teuchos::RCP<Epetra_Comm> eComm = Teuchos::rcp(new Epetra_MpiComm(MPI_COMM_WORLD)); #else Teuchos::RCP<Epetra_Comm> eComm = Teuchos::rcp(new Epetra_SerialComm()); #endif Teuchos::RCP<const Teuchos::MpiComm<int> > tComm = Teuchos::rcp(new Teuchos::MpiComm<int>(MPI_COMM_WORLD)); int myRank = eComm->MyPID(); int numProc = eComm->NumProc(); RCP<ConnManager<int,int> > connManager = rcp(new unit_test::ConnManager<int>(myRank,numProc)); RCP<const FieldPattern> patternC1 = buildFieldPattern<Intrepid2::Basis_HGRAD_QUAD_C1_FEM<double,FieldContainer> >(); RCP<const FieldPattern> patternC2 = buildFieldPattern<Intrepid2::Basis_HGRAD_QUAD_C2_FEM<double,FieldContainer> >(); RCP<panzer::BlockedDOFManager<int,int> > indexer = rcp(new panzer::BlockedDOFManager<int,int>()); { std::vector<std::vector<std::string> > fieldOrder(2); indexer->setConnManager(connManager,MPI_COMM_WORLD); indexer->addField("U",patternC1); indexer->addField("V",patternC1); fieldOrder[0].push_back("U"); fieldOrder[1].push_back("V"); indexer->setFieldOrder(fieldOrder); indexer->buildGlobalUnknowns(); } RCP<panzer::DOFManager<int,int> > control_indexer = rcp(new panzer::DOFManager<int,int>()); { control_indexer->setConnManager(connManager,MPI_COMM_WORLD); control_indexer->addField("Z",patternC1); control_indexer->buildGlobalUnknowns(); patternC2->print(out); } // setup factory out << "build lof" << std::endl; RCP<BlockedEpetraLinearObjFactory<Traits,int> > ep_lof = Teuchos::rcp(new BlockedEpetraLinearObjFactory<Traits,int>(tComm,indexer)); // this is the member we are testing! out << "cloning lof" << std::endl; RCP<const LinearObjFactory<Traits> > control_lof = cloneWithNewDomain(*ep_lof,control_indexer); out << "casting lof" << std::endl; RCP<const BlockedEpetraLinearObjFactory<Traits,int> > ep_control_lof = rcp_dynamic_cast<const BlockedEpetraLinearObjFactory<Traits,int> >(control_lof,true); out << "using casted lof" << std::endl; RCP<BLinearOp> mat = rcp_dynamic_cast<BLinearOp>(ep_control_lof->getThyraMatrix(),true); RCP<BLinearOp> gmat = rcp_dynamic_cast<BLinearOp>(ep_control_lof->getGhostedThyraMatrix(),true); RCP<Vector> x = ep_control_lof->getThyraDomainVector(); RCP<Vector> gx = ep_control_lof->getGhostedThyraDomainVector(); RCP<PVector> f = rcp_dynamic_cast<PVector>(ep_control_lof->getThyraRangeVector(),true); RCP<PVector> gf = rcp_dynamic_cast<PVector>(ep_control_lof->getGhostedThyraRangeVector(),true); TEST_EQUALITY(x->space()->dim(),18); TEST_EQUALITY(gx->space()->dim(),10+15); TEST_EQUALITY(f->productSpace()->numBlocks(),2); TEST_EQUALITY(f->productSpace()->dim(),36); TEST_EQUALITY(gf->productSpace()->numBlocks(),2); TEST_EQUALITY(gf->productSpace()->dim(),50); TEST_EQUALITY(mat->productRange()->numBlocks(),2); TEST_EQUALITY(mat->productRange()->dim(),36); TEST_EQUALITY(mat->productDomain()->numBlocks(),1); TEST_EQUALITY(mat->productDomain()->dim(),18); TEST_EQUALITY(gmat->productRange()->numBlocks(),2); TEST_EQUALITY(gmat->productRange()->dim(),50); TEST_EQUALITY(gmat->productDomain()->numBlocks(),1); TEST_EQUALITY(gmat->productDomain()->dim(),10+15); }