TEUCHOS_UNIT_TEST(tEpetra_GlbEvalData, blocked) { using Teuchos::RCP; using Teuchos::rcp; typedef Thyra::SpmdVectorBase<double> Thyra_SpmdVec; Teuchos::RCP<Teuchos::MpiComm<Thyra::Ordinal> > tComm = Teuchos::rcp(new Teuchos::MpiComm<Thyra::Ordinal>(MPI_COMM_WORLD)); Epetra_MpiComm comm(MPI_COMM_WORLD); // This is required TEST_ASSERT(comm.NumProc()==2); std::vector<int> ghosted(5); std::vector<int> unique(3); if(comm.MyPID()==0) { unique[0] = 0; unique[1] = 1; unique[2] = 2; ghosted[0] = 0; ghosted[1] = 1; ghosted[2] = 2; ghosted[3] = 3; ghosted[4] = 4; } else { unique[0] = 3; unique[1] = 4; unique[2] = 5; ghosted[0] = 1; ghosted[1] = 2; ghosted[2] = 3; ghosted[3] = 4; ghosted[4] = 5; } RCP<const Epetra_Map> uniqueMap = rcp(new Epetra_Map(-1,unique.size(),&unique[0],0,comm)); RCP<const Epetra_Map> ghostedMap = rcp(new Epetra_Map(-1,ghosted.size(),&ghosted[0],0,comm)); RCP<const Epetra_Import> importer = rcp(new Epetra_Import(*ghostedMap,*uniqueMap)); RCP<EpetraVector_ReadOnly_GlobalEvaluationData> ged_a, ged_b; ged_a = rcp(new EpetraVector_ReadOnly_GlobalEvaluationData(importer,ghostedMap,uniqueMap)); ged_b = rcp(new EpetraVector_ReadOnly_GlobalEvaluationData(importer,ghostedMap,uniqueMap)); std::vector<RCP<ReadOnlyVector_GlobalEvaluationData> > gedBlocks; gedBlocks.push_back(ged_a); gedBlocks.push_back(ged_b); RCP<const Thyra::VectorSpaceBase<double> > uniqueSpace_ab = Thyra::defaultSpmdVectorSpace<double>(tComm,3,-1); RCP<const Thyra::VectorSpaceBase<double> > ghostedSpace_ab = ged_a->getGhostedVector()->space(); RCP<Thyra::DefaultProductVectorSpace<double> > uniqueSpace = Thyra::productVectorSpace<double>(uniqueSpace_ab,2); RCP<Thyra::DefaultProductVectorSpace<double> > ghostedSpace = Thyra::productVectorSpace<double>(ghostedSpace_ab,2); BlockedVector_ReadOnly_GlobalEvaluationData ged; ged.initialize(ghostedSpace,uniqueSpace,gedBlocks); RCP<Thyra::VectorBase<double> > uniqueVec = Thyra::createMember(*uniqueSpace); { RCP<Thyra::ProductVectorBase<double> > vec = Thyra::castOrCreateNonconstProductVectorBase(uniqueVec); TEST_ASSERT(vec->productSpace()->numBlocks()==2); if(comm.MyPID()==0) { Teuchos::ArrayRCP<double> thyraVec; rcp_dynamic_cast<Thyra_SpmdVec>(vec->getNonconstVectorBlock(0))->getNonconstLocalData(Teuchos::ptrFromRef(thyraVec)); thyraVec[0] = 3.14; thyraVec[1] = 1.82; thyraVec[2] = -.91; rcp_dynamic_cast<Thyra_SpmdVec>(vec->getNonconstVectorBlock(1))->getNonconstLocalData(Teuchos::ptrFromRef(thyraVec)); thyraVec[0] = 3.14+9.0; thyraVec[1] = 1.82+9.0; thyraVec[2] = -.91+9.0; } else { Teuchos::ArrayRCP<double> thyraVec; rcp_dynamic_cast<Thyra_SpmdVec>(vec->getNonconstVectorBlock(0))->getNonconstLocalData(Teuchos::ptrFromRef(thyraVec)); thyraVec[0] = 2.72; thyraVec[1] = 6.23; thyraVec[2] = -.17; rcp_dynamic_cast<Thyra_SpmdVec>(vec->getNonconstVectorBlock(1))->getNonconstLocalData(Teuchos::ptrFromRef(thyraVec)); thyraVec[0] = 2.72+7.0; thyraVec[1] = 6.23+7.0; thyraVec[2] = -.17+7.0; } } ged.setUniqueVector(uniqueVec); ged.initializeData(); ged.globalToGhost(0); { RCP<Thyra::ProductVectorBase<double> > ghostedVec = Thyra::castOrCreateNonconstProductVectorBase(ged.getGhostedVector()); if(comm.MyPID()==0) { Teuchos::ArrayRCP<const double> thyraVec; rcp_dynamic_cast<const Thyra_SpmdVec>(ghostedVec->getVectorBlock(0))->getLocalData(Teuchos::ptrFromRef(thyraVec)); TEST_EQUALITY(thyraVec[0],3.14); TEST_EQUALITY(thyraVec[1],1.82); TEST_EQUALITY(thyraVec[2],-.91); TEST_EQUALITY(thyraVec[3],2.72); TEST_EQUALITY(thyraVec[4],6.23); rcp_dynamic_cast<const Thyra_SpmdVec>(ghostedVec->getVectorBlock(1))->getLocalData(Teuchos::ptrFromRef(thyraVec)); TEST_EQUALITY(thyraVec[0],3.14+9.0); TEST_EQUALITY(thyraVec[1],1.82+9.0); TEST_EQUALITY(thyraVec[2],-.91+9.0); TEST_EQUALITY(thyraVec[3],2.72+7.0); TEST_EQUALITY(thyraVec[4],6.23+7.0); } else { Teuchos::ArrayRCP<const double> thyraVec; rcp_dynamic_cast<const Thyra_SpmdVec>(ghostedVec->getVectorBlock(0))->getLocalData(Teuchos::ptrFromRef(thyraVec)); TEST_EQUALITY(thyraVec[0],1.82); TEST_EQUALITY(thyraVec[1],-.91); TEST_EQUALITY(thyraVec[2],2.72); TEST_EQUALITY(thyraVec[3],6.23); TEST_EQUALITY(thyraVec[4],-.17); rcp_dynamic_cast<const Thyra_SpmdVec>(ghostedVec->getVectorBlock(1))->getLocalData(Teuchos::ptrFromRef(thyraVec)); TEST_EQUALITY(thyraVec[0],1.82+9.0); TEST_EQUALITY(thyraVec[1],-.91+9.0); TEST_EQUALITY(thyraVec[2],2.72+7.0); TEST_EQUALITY(thyraVec[3],6.23+7.0); TEST_EQUALITY(thyraVec[4],-.17+7.0); } } }
TEUCHOS_UNIT_TEST(tTpetra_GlbEvalData, blocked) { using Teuchos::RCP; using Teuchos::rcp; typedef Thyra::SpmdVectorBase<double> Thyra_SpmdVec; typedef Tpetra::Map<int,panzer::Ordinal64> Tpetra_Map; typedef Tpetra::Import<int,panzer::Ordinal64> Tpetra_Import; Teuchos::RCP<Teuchos::MpiComm<int> > comm = Teuchos::rcp(new Teuchos::MpiComm<int>(MPI_COMM_WORLD)); // This is required TEST_ASSERT(comm->getSize()==2); std::vector<Ordinal64> ghosted(5); std::vector<Ordinal64> owned(3); if(comm->getRank()==0) { owned[0] = 0; owned[1] = 1; owned[2] = 2; ghosted[0] = 0; ghosted[1] = 1; ghosted[2] = 2; ghosted[3] = 3; ghosted[4] = 4; } else { owned[0] = 3; owned[1] = 4; owned[2] = 5; ghosted[0] = 1; ghosted[1] = 2; ghosted[2] = 3; ghosted[3] = 4; ghosted[4] = 5; } RCP<const Tpetra_Map> ownedMap = rcp(new Tpetra_Map(-1,owned,0,comm)); RCP<const Tpetra_Map> ghostedMap = rcp(new Tpetra_Map(-1,ghosted,0,comm)); RCP<const Tpetra_Import> importer = rcp(new Tpetra_Import(ownedMap,ghostedMap)); RCP<TpetraVector_ReadOnly_GlobalEvaluationData<double,int,Ordinal64> > ged_a, ged_b; ged_a = rcp(new TpetraVector_ReadOnly_GlobalEvaluationData<double,int,Ordinal64>(importer,ghostedMap,ownedMap)); ged_b = rcp(new TpetraVector_ReadOnly_GlobalEvaluationData<double,int,Ordinal64>(importer,ghostedMap,ownedMap)); std::vector<RCP<ReadOnlyVector_GlobalEvaluationData> > gedBlocks; gedBlocks.push_back(ged_a); gedBlocks.push_back(ged_b); RCP<const Thyra::VectorSpaceBase<double> > ownedSpace_ab = Thyra::tpetraVectorSpace<double,int,Ordinal64>(ownedMap); RCP<const Thyra::VectorSpaceBase<double> > ghostedSpace_ab = ged_a->getGhostedVector()->space(); RCP<Thyra::DefaultProductVectorSpace<double> > ownedSpace = Thyra::productVectorSpace<double>(ownedSpace_ab,2); RCP<Thyra::DefaultProductVectorSpace<double> > ghostedSpace = Thyra::productVectorSpace<double>(ghostedSpace_ab,2); BlockedVector_ReadOnly_GlobalEvaluationData ged; ged.initialize(ghostedSpace,ownedSpace,gedBlocks); RCP<Thyra::VectorBase<double> > ownedVec = Thyra::createMember(*ownedSpace); { RCP<Thyra::ProductVectorBase<double> > vec = Thyra::castOrCreateNonconstProductVectorBase(ownedVec); TEST_ASSERT(vec->productSpace()->numBlocks()==2); if(comm->getRank()==0) { Teuchos::ArrayRCP<double> thyraVec; rcp_dynamic_cast<Thyra_SpmdVec>(vec->getNonconstVectorBlock(0))->getNonconstLocalData(Teuchos::ptrFromRef(thyraVec)); thyraVec[0] = 3.14; thyraVec[1] = 1.82; thyraVec[2] = -.91; rcp_dynamic_cast<Thyra_SpmdVec>(vec->getNonconstVectorBlock(1))->getNonconstLocalData(Teuchos::ptrFromRef(thyraVec)); thyraVec[0] = 3.14+9.0; thyraVec[1] = 1.82+9.0; thyraVec[2] = -.91+9.0; } else { Teuchos::ArrayRCP<double> thyraVec; rcp_dynamic_cast<Thyra_SpmdVec>(vec->getNonconstVectorBlock(0))->getNonconstLocalData(Teuchos::ptrFromRef(thyraVec)); thyraVec[0] = 2.72; thyraVec[1] = 6.23; thyraVec[2] = -.17; rcp_dynamic_cast<Thyra_SpmdVec>(vec->getNonconstVectorBlock(1))->getNonconstLocalData(Teuchos::ptrFromRef(thyraVec)); thyraVec[0] = 2.72+7.0; thyraVec[1] = 6.23+7.0; thyraVec[2] = -.17+7.0; } } ged.setOwnedVector(ownedVec); ged.initializeData(); ged.globalToGhost(0); { RCP<Thyra::ProductVectorBase<double> > ghostedVec = Thyra::castOrCreateNonconstProductVectorBase(ged.getGhostedVector()); if(comm->getRank()==0) { Teuchos::ArrayRCP<const double> thyraVec; rcp_dynamic_cast<const Thyra_SpmdVec>(ghostedVec->getVectorBlock(0))->getLocalData(Teuchos::ptrFromRef(thyraVec)); TEST_EQUALITY(thyraVec[0],3.14); TEST_EQUALITY(thyraVec[1],1.82); TEST_EQUALITY(thyraVec[2],-.91); TEST_EQUALITY(thyraVec[3],2.72); TEST_EQUALITY(thyraVec[4],6.23); rcp_dynamic_cast<const Thyra_SpmdVec>(ghostedVec->getVectorBlock(1))->getLocalData(Teuchos::ptrFromRef(thyraVec)); TEST_EQUALITY(thyraVec[0],3.14+9.0); TEST_EQUALITY(thyraVec[1],1.82+9.0); TEST_EQUALITY(thyraVec[2],-.91+9.0); TEST_EQUALITY(thyraVec[3],2.72+7.0); TEST_EQUALITY(thyraVec[4],6.23+7.0); } else { Teuchos::ArrayRCP<const double> thyraVec; rcp_dynamic_cast<const Thyra_SpmdVec>(ghostedVec->getVectorBlock(0))->getLocalData(Teuchos::ptrFromRef(thyraVec)); TEST_EQUALITY(thyraVec[0],1.82); TEST_EQUALITY(thyraVec[1],-.91); TEST_EQUALITY(thyraVec[2],2.72); TEST_EQUALITY(thyraVec[3],6.23); TEST_EQUALITY(thyraVec[4],-.17); rcp_dynamic_cast<const Thyra_SpmdVec>(ghostedVec->getVectorBlock(1))->getLocalData(Teuchos::ptrFromRef(thyraVec)); TEST_EQUALITY(thyraVec[0],1.82+9.0); TEST_EQUALITY(thyraVec[1],-.91+9.0); TEST_EQUALITY(thyraVec[2],2.72+7.0); TEST_EQUALITY(thyraVec[3],6.23+7.0); TEST_EQUALITY(thyraVec[4],-.17+7.0); } } }