30  const Teuchos::RCP<
const LinearOpBase<double> > &fwdOp,
 
   31  const Teuchos::RCP<
const LinearOpSourceBase<double> > &fwdOpSrc,
 
   32  const Teuchos::RCP<Epetra_LinearProblem> &epetraLP,
 
   33  const Teuchos::RCP<Amesos_BaseSolver> &amesosSolver,
 
   34  const EOpTransp amesosSolverTransp,
 
   35  const double amesosSolverScalar
 
   38  this->
initialize(fwdOp,fwdOpSrc,epetraLP,amesosSolver,
 
   39    amesosSolverTransp,amesosSolverScalar);
 
 
   44  const Teuchos::RCP<
const LinearOpBase<double> > &fwdOp,
 
   45  const Teuchos::RCP<
const LinearOpSourceBase<double> > &fwdOpSrc,
 
   46  const Teuchos::RCP<Epetra_LinearProblem> &epetraLP,
 
   47  const Teuchos::RCP<Amesos_BaseSolver> &amesosSolver,
 
   48  const EOpTransp amesosSolverTransp,
 
   49  const double amesosSolverScalar
 
   53  TEUCHOS_TEST_FOR_EXCEPT(fwdOp.get()==NULL);
 
   54  TEUCHOS_TEST_FOR_EXCEPT(fwdOpSrc.get()==NULL);
 
   55  TEUCHOS_TEST_FOR_EXCEPT(epetraLP.get()==NULL);
 
   56  TEUCHOS_TEST_FOR_EXCEPT(amesosSolver.get()==NULL);
 
   57  TEUCHOS_TEST_FOR_EXCEPT(epetraLP->GetLHS()!=NULL);
 
   58  TEUCHOS_TEST_FOR_EXCEPT(epetraLP->GetRHS()!=NULL);
 
   63  amesosSolver_ = amesosSolver;
 
   64  amesosSolverTransp_ = amesosSolverTransp;
 
   65  amesosSolverScalar_ = amesosSolverScalar;
 
   66  const std::string fwdOpLabel = fwdOp_->getObjectLabel();
 
   67  if(fwdOpLabel.length())
 
   68    this->setObjectLabel( 
"lows("+fwdOpLabel+
")" );
 
 
   83  Teuchos::RCP<
const LinearOpBase<double> > *fwdOp,
 
   84  Teuchos::RCP<
const LinearOpSourceBase<double> > *fwdOpSrc,
 
   85  Teuchos::RCP<Epetra_LinearProblem> *epetraLP,
 
   86  Teuchos::RCP<Amesos_BaseSolver> *amesosSolver,
 
   87  EOpTransp *amesosSolverTransp,
 
   88  double *amesosSolverScalar
 
   92  if(fwdOp) *fwdOp = fwdOp_;
 
   93  if(fwdOpSrc) *fwdOpSrc = fwdOpSrc_;
 
   94  if(epetraLP) *epetraLP = epetraLP_;
 
   95  if(amesosSolver) *amesosSolver = amesosSolver_;
 
   96  if(amesosSolverTransp) *amesosSolverTransp = amesosSolverTransp_;
 
   97  if(amesosSolverScalar) *amesosSolverScalar = amesosSolverScalar_;
 
   99  fwdOp_ = Teuchos::null;
 
  100  fwdOpSrc_ = Teuchos::null;
 
  101  epetraLP_ = Teuchos::null;
 
  102  amesosSolver_ = Teuchos::null;
 
  104  amesosSolverScalar_ = 0.0;
 
 
  150  Teuchos::FancyOStream &out,
 
  151  const Teuchos::EVerbosityLevel verbLevel
 
  154  using Teuchos::OSTab;
 
  155  using Teuchos::typeName;
 
  156  using Teuchos::describe;
 
  158    case Teuchos::VERB_DEFAULT:
 
  159    case Teuchos::VERB_LOW:
 
  162    case Teuchos::VERB_MEDIUM:
 
  163    case Teuchos::VERB_HIGH:
 
  164    case Teuchos::VERB_EXTREME:
 
  167        << Teuchos::Describable::description() << 
"{" 
  168        << 
"rangeDim=" << this->
range()->dim()
 
  169        << 
",domainDim="<< this->
domain()->dim() << 
"}\n";
 
  171      if(!is_null(fwdOp_)) {
 
  172        out << 
"fwdOp = " << 
describe(*fwdOp_,verbLevel);
 
  174      if(!is_null(amesosSolver_)) {
 
  175        out << 
"amesosSolver=" << typeName(*amesosSolver_) << 
"\n";
 
  180      TEUCHOS_TEST_FOR_EXCEPT(
true); 
 
 
  198  const EOpTransp M_trans,
 
  199  const MultiVectorBase<double> &X,
 
  200  const Ptr<MultiVectorBase<double> > &Y,
 
  205  Thyra::apply( *fwdOp_, M_trans, X, Y, alpha, beta );
 
 
  242  const EOpTransp M_trans,
 
  243  const MultiVectorBase<double> &B,
 
  244  const Ptr<MultiVectorBase<double> > &X,
 
  245  const Ptr<
const SolveCriteria<double> > 
 
  248  using Teuchos::rcpFromPtr;
 
  249  using Teuchos::rcpFromRef;
 
  250  using Teuchos::OSTab;
 
  252  Teuchos::Time totalTimer(
"");
 
  253  totalTimer.start(
true);
 
  255  THYRA_FUNC_TIME_MONITOR(
"Stratimikos: AmesosLOWS");
 
  257  Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
 
  258  Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  259  OSTab tab = this->getOSTab();
 
  260  if(out.get() && 
static_cast<int>(verbLevel) > 
static_cast<int>(Teuchos::VERB_NONE))
 
  261    *out << 
"\nSolving block system using Amesos solver " 
  262         << typeName(*amesosSolver_) << 
" ...\n\n";
 
  267  const EOpTransp amesosOpTransp = real_trans(trans_trans(amesosSolverTransp_,M_trans));
 
  270    &opRangeMap  = ( amesosOpTransp == 
NOTRANS 
  272    &opDomainMap = ( amesosOpTransp == 
NOTRANS 
  278  Teuchos::RCP<const Epetra_MultiVector>
 
  279    epetra_B = get_Epetra_MultiVector(opRangeMap, rcpFromRef(B));
 
  280  Teuchos::RCP<Epetra_MultiVector>
 
  281    epetra_X = get_Epetra_MultiVector(opDomainMap, rcpFromPtr(X));
 
  286  epetraLP_->SetLHS(&*epetra_X);
 
  293  const bool oldUseTranspose = amesosSolver_->UseTranspose();
 
  294  amesosSolver_->SetUseTranspose(amesosOpTransp==
TRANS);
 
  295  const int err = amesosSolver_->Solve();
 
  296  TEUCHOS_TEST_FOR_EXCEPTION( 0!=err, CatastrophicSolveFailure,
 
  297    "Error, the function Solve() on the amesos solver of type\n" 
  298    "\'"<<typeName(*amesosSolver_)<<
"\' failed with error code "<<err<<
"!" 
  300  amesosSolver_->SetUseTranspose(oldUseTranspose);
 
  305  epetraLP_->SetLHS(NULL);
 
  306  epetraLP_->SetRHS(NULL);
 
  307  epetra_X = Teuchos::null;
 
  308  epetra_B = Teuchos::null;
 
  313  if(amesosSolverScalar_!=1.0)
 
  314    Thyra::scale(1.0/amesosSolverScalar_, X);
 
  319  SolveStatus<double> solveStatus;
 
  320  solveStatus.solveStatus = SOLVE_STATUS_CONVERGED;
 
  321  solveStatus.achievedTol = SolveStatus<double>::unknownTolerance();
 
  322  solveStatus.message =
 
  323    std::string(
"Solver ")+typeName(*amesosSolver_)+std::string(
" converged!");
 
  328  if(out.get() && 
static_cast<int>(verbLevel) >= 
static_cast<int>(Teuchos::VERB_LOW))
 
  330      << 
"\nTotal solve time = "<<totalTimer.totalElapsedTime()<<
" sec\n";
 
 
void uninitialize(Teuchos::RCP< const LinearOpBase< double > > *fwdOp=NULL, Teuchos::RCP< const LinearOpSourceBase< double > > *fwdOpSrc=NULL, Teuchos::RCP< Epetra_LinearProblem > *epetraLP=NULL, Teuchos::RCP< Amesos_BaseSolver > *amesosSolver=NULL, EOpTransp *amesosSolverTransp=NULL, double *amesosSolverScalar=NULL)
Uninitialize.
void initialize(const Teuchos::RCP< const LinearOpBase< double > > &fwdOp, const Teuchos::RCP< const LinearOpSourceBase< double > > &fwdOpSrc, const Teuchos::RCP< Epetra_LinearProblem > &epetraLP, const Teuchos::RCP< Amesos_BaseSolver > &amesosSolver, const EOpTransp amesosSolverTransp, const double amesosSolverScalar)
First initialization.