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");
146 #ifndef PANZER_HIDE_DEPRECATED_CODE
148 Stratimikos::enableMueLu<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLu-Tpetra");
149 Stratimikos::enableMueLuRefMaxwell<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType>(linearSolverBuilder,
"MueLuRefMaxwell-Tpetra");
154 #ifdef PANZER_HAVE_TEKO
155 RCP<Teko::RequestHandler> reqHandler_local = reqHandler;
157 if(!blockedAssembly) {
159 std::string fieldName;
164 if(reqHandler_local==Teuchos::null)
165 reqHandler_local = rcp(
new Teko::RequestHandler);
168 if(determineCoordinateField(*globalIndexer,fieldName)) {
169 std::map<std::string,RCP<const panzer::Intrepid2FieldPattern> > fieldPatterns;
170 fillFieldPatternMap(*globalIndexer,fieldName,fieldPatterns);
172 RCP<panzer_stk::ParameterListCallback> callback = rcp(
new
173 panzer_stk::ParameterListCallback(fieldName,fieldPatterns,stkConn_manager,
174 rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer)));
175 reqHandler_local->addRequestCallback(callback);
178 if(strat_params->sublist(
"Preconditioner Types").isSublist(
"ML")) {
232 if(writeCoordinates) {
233#ifdef PANZER_HAVE_EPETRA_STACK
235 callback->preRequest(Teko::RequestMesg(rcp(
new Teuchos::ParameterList())));
238 const std::vector<double> & xcoords = callback->getXCoordsVector();
239 const std::vector<double> & ycoords = callback->getYCoordsVector();
240 const std::vector<double> & zcoords = callback->getZCoordsVector();
247 RCP<Epetra_Vector> vec;
262 TEUCHOS_ASSERT(
false);
265 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
"ERROR: Panzer_STK_SetupLOWSFactory.cpp - writeCoordinates not implemented for Tpetra yet!");
269#ifdef PANZER_HAVE_MUELU
270 if(rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer)!=Teuchos::null
272 if(!writeCoordinates)
273 callback->preRequest(Teko::RequestMesg(rcp(
new Teuchos::ParameterList())));
275 typedef Tpetra::Map<int,panzer::GlobalOrdinal,panzer::TpetraNodeType> Map;
276 typedef Tpetra::MultiVector<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType> MV;
279 unsigned dim = Teuchos::as<unsigned>(spatialDim);
281 for(
unsigned d=0;d<dim;d++) {
282 const std::vector<double> & coord = callback->getCoordsVector(d);
285 if(coords==Teuchos::null) {
286 if(globalIndexer->getNumFields()==1) {
287 RCP<const panzer::GlobalIndexer> ugi
288 = rcp_dynamic_cast<const panzer::GlobalIndexer>(globalIndexer);
289 std::vector<panzer::GlobalOrdinal> ownedIndices;
290 ugi->getOwnedIndices(ownedIndices);
291 RCP<const Map> coords_map = rcp(
new Map(Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),ownedIndices,0,mpi_comm));
292 coords = rcp(
new MV(coords_map,dim));
295 RCP<const Map> coords_map = rcp(
new Map(Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),coord.size(),0,mpi_comm));
296 coords = rcp(
new MV(coords_map,dim));
301 TEUCHOS_ASSERT(coords->getLocalLength()==coord.size());
304 Teuchos::ArrayRCP<double> dest = coords->getDataNonConst(d);
305 for(std::size_t i=0;i<coord.size();i++)
310 Teuchos::ParameterList & muelu_params = strat_params->sublist(
"Preconditioner Types").sublist(
"MueLu");
311 muelu_params.set<RCP<MV> >(
"Coordinates",coords);
317 Teko::addTekoToStratimikosBuilder(linearSolverBuilder,reqHandler_local);
321 if(reqHandler_local==Teuchos::null)
322 reqHandler_local = rcp(
new Teko::RequestHandler);
324 std::string fieldName;
325 if(determineCoordinateField(*globalIndexer,fieldName)) {
326 RCP<const panzer::BlockedDOFManager> blkDofs =
327 rcp_dynamic_cast<const panzer::BlockedDOFManager>(globalIndexer);
328 RCP<const panzer::BlockedDOFManager> auxBlkDofs =
329 rcp_dynamic_cast<const panzer::BlockedDOFManager>(auxGlobalIndexer);
330 RCP<panzer_stk::ParameterListCallbackBlocked> callback =
331 rcp(
new panzer_stk::ParameterListCallbackBlocked(stkConn_manager,blkDofs,auxBlkDofs));
332 reqHandler_local->addRequestCallback(callback);
335 Teko::addTekoToStratimikosBuilder(linearSolverBuilder,reqHandler_local);
337 if(writeCoordinates) {
338#ifdef PANZER_HAVE_EPETRA_STACK
339 RCP<const panzer::BlockedDOFManager> blkDofs =
340 rcp_dynamic_cast<const panzer::BlockedDOFManager>(globalIndexer);
343 const std::vector<RCP<panzer::GlobalIndexer>> & dofVec
344 = blkDofs->getFieldDOFManagers();
345 for(std::size_t i=0;i<dofVec.size();i++) {
348 TEUCHOS_ASSERT(determineCoordinateField(*dofVec[i],fieldName));
350 std::map<std::string,RCP<const panzer::Intrepid2FieldPattern> > fieldPatterns;
351 fillFieldPatternMap(*dofVec[i],fieldName,fieldPatterns);
352 panzer_stk::ParameterListCallback plCall(fieldName,fieldPatterns,stkConn_manager,dofVec[i]);
353 plCall.buildArrayToVector();
354 plCall.buildCoordinates();
357 const std::vector<double> & xcoords = plCall.getXCoordsVector();
358 const std::vector<double> & ycoords = plCall.getYCoordsVector();
359 const std::vector<double> & zcoords = plCall.getZCoordsVector();
366 RCP<Epetra_Vector> vec;
381 TEUCHOS_ASSERT(
false);
385 #ifdef PANZER_HAVE_MUELU
388 typedef Xpetra::Map<int,panzer::GlobalOrdinal> Map;
389 typedef Xpetra::MultiVector<double,int,panzer::GlobalOrdinal> MV;
392 RCP<const Map> coords_map = Xpetra::MapFactory<int,panzer::GlobalOrdinal>::Build(Xpetra::UseEpetra,
393 Teuchos::OrdinalTraits<panzer::GlobalOrdinal>::invalid(),
400 unsigned dim = Teuchos::as<unsigned>(spatialDim);
402 RCP<MV> coords = Xpetra::MultiVectorFactory<double,int,panzer::GlobalOrdinal>::Build(coords_map,spatialDim);
404 for(
unsigned d=0;d<dim;d++) {
406 TEUCHOS_ASSERT(coords->getLocalLength()==xcoords.size());
409 Teuchos::ArrayRCP<double> dest = coords->getDataNonConst(d);
410 for(std::size_t j=0;j<coords->getLocalLength();++j) {
411 if (d == 0) dest[j] = xcoords[j];
412 if (d == 1) dest[j] = ycoords[j];
413 if (d == 2) dest[j] = zcoords[j];
419 Teuchos::ParameterList & muelu_params = strat_params->sublist(
"Preconditioner Types").sublist(
"MueLu");
420 muelu_params.set<RCP<MV> >(
"Coordinates",coords);
427 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
"ERROR: Panzer_STK_SetupLOWSFactory - writeCoordinates not implemented for Tpetra yet!")
438 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
439 "Topology writing is no longer implemented. It needs to be reimplemented for the "
440 "default DOFManager (estimate 2 days with testing)");
445 linearSolverBuilder.setParameterList(strat_params);
446 RCP<Thyra::LinearOpWithSolveFactoryBase<double> > lowsFactory = createLinearSolveStrategy(linearSolverBuilder);