154 const Teuchos::RCP<const panzer::GlobalIndexer> & globalIndexer,
155 const Teuchos::RCP<panzer_stk::STKConnManager> & stkConn_manager,
158 const Teuchos::RCP<Teuchos::ParameterList> & strat_params,
159 #ifdef PANZER_HAVE_TEKO
160 const Teuchos::RCP<Teko::RequestHandler> & reqHandler,
162 bool writeCoordinates,
164 const Teuchos::RCP<const panzer::GlobalIndexer> & auxGlobalIndexer,
170 using Teuchos::rcp_dynamic_cast;
172 Stratimikos::DefaultLinearSolverBuilder linearSolverBuilder;
178 #ifdef PANZER_HAVE_MUELU
180 Stratimikos::enableMueLu<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLu");
181 Stratimikos::enableMueLuRefMaxwell<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLuRefMaxwell");
182 Stratimikos::enableMueLuMaxwell1<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLuMaxwell1");
183 #ifndef PANZER_HIDE_DEPRECATED_CODE
185 Stratimikos::enableMueLu<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLu-Tpetra");
186 Stratimikos::enableMueLuRefMaxwell<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLuRefMaxwell-Tpetra");
190 #ifdef PANZER_HAVE_IFPACK2
193 typedef Thyra::Ifpack2PreconditionerFactory<Tpetra::CrsMatrix<double, int, panzer::GlobalOrdinal,panzer::TpetraNodeType> > Impl;
195 linearSolverBuilder.setPreconditioningStrategyFactory(Teuchos::abstractFactoryStd<Base, Impl>(),
"Ifpack2");
200 #ifdef PANZER_HAVE_TEKO
201 RCP<Teko::RequestHandler> reqHandler_local = reqHandler;
203 if(!blockedAssembly) {
205 std::string fieldName;
210 if(reqHandler_local==Teuchos::null)
211 reqHandler_local = rcp(
new Teko::RequestHandler);
214 if(determineCoordinateField(*globalIndexer,fieldName)) {
215 std::map<std::string,RCP<const panzer::Intrepid2FieldPattern> > fieldPatterns;
216 fillFieldPatternMap(*globalIndexer,fieldName,fieldPatterns);
218 RCP<panzer_stk::ParameterListCallback> callback = rcp(
new
219 panzer_stk::ParameterListCallback(fieldName,fieldPatterns,stkConn_manager,
220 rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer)));
221 reqHandler_local->addRequestCallback(callback);
224 if(strat_params->sublist(
"Preconditioner Types").isSublist(
"ML")) {
278 if(writeCoordinates) {
279#ifdef PANZER_HAVE_EPETRA_STACK
281 callback->preRequest(Teko::RequestMesg(rcp(
new Teuchos::ParameterList())));
284 const std::vector<double> & xcoords = callback->getXCoordsVector();
285 const std::vector<double> & ycoords = callback->getYCoordsVector();
286 const std::vector<double> & zcoords = callback->getZCoordsVector();
293 RCP<Epetra_Vector> vec;
308 TEUCHOS_ASSERT(
false);
311 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
"ERROR: Panzer_STK_SetupLOWSFactory.cpp - writeCoordinates not implemented for Tpetra yet!");
315#ifdef PANZER_HAVE_MUELU
316 if(rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer)!=Teuchos::null
318 if(!writeCoordinates)
319 callback->preRequest(Teko::RequestMesg(rcp(
new Teuchos::ParameterList())));
321 typedef Tpetra::Map<int,panzer::GlobalOrdinal,panzer::TpetraNodeType> Map;
322 typedef Tpetra::MultiVector<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType> MV;
325 unsigned dim = Teuchos::as<unsigned>(spatialDim);
327 for(
unsigned d=0;d<dim;d++) {
328 const std::vector<double> & coord = callback->getCoordsVector(d);
331 if(coords==Teuchos::null) {
332 if(globalIndexer->getNumFields()==1) {
333 RCP<const panzer::GlobalIndexer> ugi
334 = rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer);
335 std::vector<panzer::GlobalOrdinal> ownedIndices;
336 ugi->getOwnedIndices(ownedIndices);
337 RCP<const Map> coords_map = rcp(
new Map(Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),ownedIndices,0,mpi_comm));
338 coords = rcp(
new MV(coords_map,dim));
341 RCP<const Map> coords_map = rcp(
new Map(Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),coord.size(),0,mpi_comm));
342 coords = rcp(
new MV(coords_map,dim));
347 TEUCHOS_ASSERT(coords->getLocalLength()==coord.size());
350 Teuchos::ArrayRCP<double> dest = coords->getDataNonConst(d);
351 for(std::size_t i=0;i<coord.size();i++)
356 Teuchos::ParameterList & muelu_params = strat_params->sublist(
"Preconditioner Types").sublist(
"MueLu");
357 muelu_params.set<RCP<MV> >(
"Coordinates",coords);
363 Teko::addTekoToStratimikosBuilder(linearSolverBuilder,reqHandler_local);
367 if(reqHandler_local==Teuchos::null)
368 reqHandler_local = rcp(
new Teko::RequestHandler);
370 std::string fieldName;
371 if(determineCoordinateField(*globalIndexer,fieldName)) {
372 RCP<const panzer::BlockedDOFManager> blkDofs =
373 rcp_dynamic_cast<const panzer::BlockedDOFManager>(globalIndexer);
374 RCP<const panzer::BlockedDOFManager> auxBlkDofs =
375 rcp_dynamic_cast<const panzer::BlockedDOFManager>(auxGlobalIndexer);
376 RCP<panzer_stk::ParameterListCallbackBlocked> callback =
377 rcp(
new panzer_stk::ParameterListCallbackBlocked(stkConn_manager,blkDofs,auxBlkDofs));
378 reqHandler_local->addRequestCallback(callback);
381 Teko::addTekoToStratimikosBuilder(linearSolverBuilder,reqHandler_local);
383 if(writeCoordinates) {
384#ifdef PANZER_HAVE_EPETRA_STACK
385 RCP<const panzer::BlockedDOFManager> blkDofs =
386 rcp_dynamic_cast<const panzer::BlockedDOFManager>(globalIndexer);
389 const std::vector<RCP<panzer::GlobalIndexer>> & dofVec
390 = blkDofs->getFieldDOFManagers();
391 for(std::size_t i=0;i<dofVec.size();i++) {
394 TEUCHOS_ASSERT(determineCoordinateField(*dofVec[i],fieldName));
396 std::map<std::string,RCP<const panzer::Intrepid2FieldPattern> > fieldPatterns;
397 fillFieldPatternMap(*dofVec[i],fieldName,fieldPatterns);
398 panzer_stk::ParameterListCallback plCall(fieldName,fieldPatterns,stkConn_manager,dofVec[i]);
399 plCall.buildArrayToVector();
400 plCall.buildCoordinates();
403 const std::vector<double> & xcoords = plCall.getXCoordsVector();
404 const std::vector<double> & ycoords = plCall.getYCoordsVector();
405 const std::vector<double> & zcoords = plCall.getZCoordsVector();
412 RCP<Epetra_Vector> vec;
427 TEUCHOS_ASSERT(
false);
431 #ifdef PANZER_HAVE_MUELU
434 typedef Xpetra::Map<int,panzer::GlobalOrdinal> Map;
435 typedef Xpetra::MultiVector<double,int,panzer::GlobalOrdinal> MV;
438 RCP<const Map> coords_map = Xpetra::MapFactory<int,panzer::GlobalOrdinal>::Build(Xpetra::UseEpetra,
439 Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),
446 unsigned dim = Teuchos::as<unsigned>(spatialDim);
448 RCP<MV> coords = Xpetra::MultiVectorFactory<double,int,panzer::GlobalOrdinal>::Build(coords_map,spatialDim);
450 for(
unsigned d=0;d<dim;d++) {
452 TEUCHOS_ASSERT(coords->getLocalLength()==xcoords.size());
455 Teuchos::ArrayRCP<double> dest = coords->getDataNonConst(d);
456 for(std::size_t j=0;j<coords->getLocalLength();++j) {
457 if (d == 0) dest[j] = xcoords[j];
458 if (d == 1) dest[j] = ycoords[j];
459 if (d == 2) dest[j] = zcoords[j];
465 Teuchos::ParameterList & muelu_params = strat_params->sublist(
"Preconditioner Types").sublist(
"MueLu");
466 muelu_params.set<RCP<MV> >(
"Coordinates",coords);
473 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
"ERROR: Panzer_STK_SetupLOWSFactory - writeCoordinates not implemented for Tpetra yet!")
484 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
485 "Topology writing is no longer implemented. It needs to be reimplemented for the "
486 "default DOFManager (estimate 2 days with testing)");
491 linearSolverBuilder.setParameterList(strat_params);
492 RCP<Thyra::LinearOpWithSolveFactoryBase<double> > lowsFactory = createLinearSolveStrategy(linearSolverBuilder);