117 const Teuchos::RCP<const panzer::GlobalIndexer> & globalIndexer,
118 const Teuchos::RCP<panzer_stk::STKConnManager> & stkConn_manager,
121 const Teuchos::RCP<Teuchos::ParameterList> & strat_params,
122 #ifdef PANZER_HAVE_TEKO
123 const Teuchos::RCP<Teko::RequestHandler> & reqHandler,
125 bool writeCoordinates,
127 const Teuchos::RCP<const panzer::GlobalIndexer> & auxGlobalIndexer,
133 using Teuchos::rcp_dynamic_cast;
135 Stratimikos::DefaultLinearSolverBuilder linearSolverBuilder;
141 #ifdef PANZER_HAVE_MUELU
143 Stratimikos::enableMueLu<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLu");
144 Stratimikos::enableMueLuRefMaxwell<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLuRefMaxwell");
145 Stratimikos::enableMueLuMaxwell1<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLuMaxwell1");
149 #ifdef PANZER_HAVE_TEKO
150 RCP<Teko::RequestHandler> reqHandler_local = reqHandler;
152 if(!blockedAssembly) {
154 std::string fieldName;
159 if(reqHandler_local==Teuchos::null)
160 reqHandler_local = rcp(
new Teko::RequestHandler);
163 if(determineCoordinateField(*globalIndexer,fieldName)) {
164 std::map<std::string,RCP<const panzer::Intrepid2FieldPattern> > fieldPatterns;
165 fillFieldPatternMap(*globalIndexer,fieldName,fieldPatterns);
167 RCP<panzer_stk::ParameterListCallback> callback = rcp(
new
168 panzer_stk::ParameterListCallback(fieldName,fieldPatterns,stkConn_manager,
169 rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer)));
170 reqHandler_local->addRequestCallback(callback);
173 if(strat_params->sublist(
"Preconditioner Types").isSublist(
"ML")) {
227 if(writeCoordinates) {
228#ifdef PANZER_HAVE_EPETRA_STACK
230 callback->preRequest(Teko::RequestMesg(rcp(
new Teuchos::ParameterList())));
233 const std::vector<double> & xcoords = callback->getXCoordsVector();
234 const std::vector<double> & ycoords = callback->getYCoordsVector();
235 const std::vector<double> & zcoords = callback->getZCoordsVector();
238 Epetra_MpiComm ep_comm(*mpi_comm->getRawMpiComm());
240 Epetra_Map map(-1,xcoords.size(),0,ep_comm);
242 RCP<Epetra_Vector> vec;
245 vec = rcp(
new Epetra_Vector(Copy,map,
const_cast<double *
>(&zcoords[0])));
246 EpetraExt::VectorToMatrixMarketFile(
"zcoords.mm",*vec);
249 vec = rcp(
new Epetra_Vector(Copy,map,
const_cast<double *
>(&ycoords[0])));
250 EpetraExt::VectorToMatrixMarketFile(
"ycoords.mm",*vec);
253 vec = rcp(
new Epetra_Vector(Copy,map,
const_cast<double *
>(&xcoords[0])));
254 EpetraExt::VectorToMatrixMarketFile(
"xcoords.mm",*vec);
257 TEUCHOS_ASSERT(
false);
260 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
"ERROR: Panzer_STK_SetupLOWSFactory.cpp - writeCoordinates not implemented for Tpetra yet!");
264#ifdef PANZER_HAVE_MUELU
265 if(rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer)!=Teuchos::null
267 if(!writeCoordinates)
268 callback->preRequest(Teko::RequestMesg(rcp(
new Teuchos::ParameterList())));
270 typedef Tpetra::Map<int,panzer::GlobalOrdinal,panzer::TpetraNodeType> Map;
271 typedef Tpetra::MultiVector<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType> MV;
274 unsigned dim = Teuchos::as<unsigned>(spatialDim);
276 for(
unsigned d=0;d<dim;d++) {
277 const std::vector<double> & coord = callback->getCoordsVector(d);
280 if(coords==Teuchos::null) {
281 if(globalIndexer->getNumFields()==1) {
282 RCP<const panzer::GlobalIndexer> ugi
283 = rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer);
284 std::vector<panzer::GlobalOrdinal> ownedIndices;
285 ugi->getOwnedIndices(ownedIndices);
286 RCP<const Map> coords_map = rcp(
new Map(Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),ownedIndices,0,mpi_comm));
287 coords = rcp(
new MV(coords_map,dim));
290 RCP<const Map> coords_map = rcp(
new Map(Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),coord.size(),0,mpi_comm));
291 coords = rcp(
new MV(coords_map,dim));
296 TEUCHOS_ASSERT(coords->getLocalLength()==coord.size());
299 Teuchos::ArrayRCP<double> dest = coords->getDataNonConst(d);
300 for(std::size_t i=0;i<coord.size();i++)
305 Teuchos::ParameterList & muelu_params = strat_params->sublist(
"Preconditioner Types").sublist(
"MueLu");
306 muelu_params.set<RCP<MV> >(
"Coordinates",coords);
312 Teko::addTekoToStratimikosBuilder(linearSolverBuilder,reqHandler_local);
316 if(reqHandler_local==Teuchos::null)
317 reqHandler_local = rcp(
new Teko::RequestHandler);
319 std::string fieldName;
320 if(determineCoordinateField(*globalIndexer,fieldName)) {
321 RCP<const panzer::BlockedDOFManager> blkDofs =
322 rcp_dynamic_cast<const panzer::BlockedDOFManager>(globalIndexer);
323 RCP<const panzer::BlockedDOFManager> auxBlkDofs =
324 rcp_dynamic_cast<const panzer::BlockedDOFManager>(auxGlobalIndexer);
325 RCP<panzer_stk::ParameterListCallbackBlocked> callback =
326 rcp(
new panzer_stk::ParameterListCallbackBlocked(stkConn_manager,blkDofs,auxBlkDofs));
327 reqHandler_local->addRequestCallback(callback);
330 Teko::addTekoToStratimikosBuilder(linearSolverBuilder,reqHandler_local);
332 if(writeCoordinates) {
333#ifdef PANZER_HAVE_EPETRA_STACK
334 RCP<const panzer::BlockedDOFManager> blkDofs =
335 rcp_dynamic_cast<const panzer::BlockedDOFManager>(globalIndexer);
338 const std::vector<RCP<panzer::GlobalIndexer>> & dofVec
339 = blkDofs->getFieldDOFManagers();
340 for(std::size_t i=0;i<dofVec.size();i++) {
343 TEUCHOS_ASSERT(determineCoordinateField(*dofVec[i],fieldName));
345 std::map<std::string,RCP<const panzer::Intrepid2FieldPattern> > fieldPatterns;
346 fillFieldPatternMap(*dofVec[i],fieldName,fieldPatterns);
347 panzer_stk::ParameterListCallback plCall(fieldName,fieldPatterns,stkConn_manager,dofVec[i]);
348 plCall.buildArrayToVector();
349 plCall.buildCoordinates();
352 const std::vector<double> & xcoords = plCall.getXCoordsVector();
353 const std::vector<double> & ycoords = plCall.getYCoordsVector();
354 const std::vector<double> & zcoords = plCall.getZCoordsVector();
357 Epetra_MpiComm ep_comm(*mpi_comm->getRawMpiComm());
359 Epetra_Map map(-1,xcoords.size(),0,ep_comm);
361 RCP<Epetra_Vector> vec;
364 vec = rcp(
new Epetra_Vector(Copy,map,
const_cast<double *
>(&zcoords[0])));
365 EpetraExt::VectorToMatrixMarketFile((fieldName+
"_zcoords.mm").c_str(),*vec);
368 vec = rcp(
new Epetra_Vector(Copy,map,
const_cast<double *
>(&ycoords[0])));
369 EpetraExt::VectorToMatrixMarketFile((fieldName+
"_ycoords.mm").c_str(),*vec);
372 vec = rcp(
new Epetra_Vector(Copy,map,
const_cast<double *
>(&xcoords[0])));
373 EpetraExt::VectorToMatrixMarketFile((fieldName+
"_xcoords.mm").c_str(),*vec);
376 TEUCHOS_ASSERT(
false);
380 #ifdef PANZER_HAVE_MUELU
383 typedef Xpetra::Map<int,panzer::GlobalOrdinal> Map;
384 typedef Xpetra::MultiVector<double,int,panzer::GlobalOrdinal> MV;
387 RCP<const Map> coords_map = Xpetra::MapFactory<int,panzer::GlobalOrdinal>::Build(Xpetra::UseEpetra,
388 Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),
395 unsigned dim = Teuchos::as<unsigned>(spatialDim);
397 RCP<MV> coords = Xpetra::MultiVectorFactory<double,int,panzer::GlobalOrdinal>::Build(coords_map,spatialDim);
399 for(
unsigned d=0;d<dim;d++) {
401 TEUCHOS_ASSERT(coords->getLocalLength()==xcoords.size());
404 Teuchos::ArrayRCP<double> dest = coords->getDataNonConst(d);
405 for(std::size_t j=0;j<coords->getLocalLength();++j) {
406 if (d == 0) dest[j] = xcoords[j];
407 if (d == 1) dest[j] = ycoords[j];
408 if (d == 2) dest[j] = zcoords[j];
414 Teuchos::ParameterList & muelu_params = strat_params->sublist(
"Preconditioner Types").sublist(
"MueLu");
415 muelu_params.set<RCP<MV> >(
"Coordinates",coords);
422 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
"ERROR: Panzer_STK_SetupLOWSFactory - writeCoordinates not implemented for Tpetra yet!")
433 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
434 "Topology writing is no longer implemented. It needs to be reimplemented for the "
435 "default DOFManager (estimate 2 days with testing)");
440 linearSolverBuilder.setParameterList(strat_params);
441 RCP<Thyra::LinearOpWithSolveFactoryBase<double> > lowsFactory = createLinearSolveStrategy(linearSolverBuilder);