Ejemplo n.º 1
0
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()));
*/
}
Ejemplo n.º 2
0
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);
}