00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "LOCA_Epetra_ShiftInvertOperator.H"
00040 #include "LOCA_Epetra_Group.H"
00041 #include "NOX_Epetra_MultiVector.H"
00042 #include "LOCA_GlobalData.H"
00043 #include "LOCA_ErrorCheck.H"
00044 #include "Epetra_MultiVector.h"
00045
00046
00047 LOCA::Epetra::ShiftInvertOperator::ShiftInvertOperator(
00048 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00049 const Teuchos::RCP<LOCA::Epetra::Group>& grp,
00050 const Teuchos::RCP<const Epetra_Operator>& jac,
00051 double shift) :
00052 globalData(global_data),
00053 locagrp(grp),
00054 jacOper(jac),
00055 shift_(shift),
00056 Label_(0)
00057 {
00058 Label_ = "LOCA::Epetra::ShiftInvertOperator";
00059
00060
00061 grp->computeShiftedMatrix(1.0, -shift_);
00062 }
00063
00064 LOCA::Epetra::ShiftInvertOperator::~ShiftInvertOperator()
00065 {
00066 }
00067
00068 int
00069 LOCA::Epetra::ShiftInvertOperator::SetUseTranspose(bool UseTranspose)
00070 {
00071 if (UseTranspose == false)
00072 return 0;
00073 else {
00074 globalData->locaErrorCheck->throwError(
00075 "LOCA::Epetra::ShiftInvert::SetUseTranspose",
00076 "Operator does not support transpose");
00077 return -1;
00078 }
00079 }
00080
00081 int
00082 LOCA::Epetra::ShiftInvertOperator::Apply(const Epetra_MultiVector& X,
00083 Epetra_MultiVector& Y) const
00084 {
00085
00086 NOX::Epetra::MultiVector nox_X(
00087 Teuchos::rcp(&const_cast<Epetra_MultiVector&>(X),false),
00088 NOX::DeepCopy,
00089 NOX::Epetra::MultiVector::CreateView);
00090 NOX::Epetra::MultiVector nox_Y(Teuchos::rcp(&Y,false),
00091 NOX::DeepCopy,
00092 NOX::Epetra::MultiVector::CreateView);
00093
00094
00095 NOX::Abstract::Group::ReturnType result =
00096 locagrp->applyShiftedMatrixMultiVector(nox_X, nox_Y);
00097
00098 if (result == NOX::Abstract::Group::Ok)
00099 return 0;
00100 else
00101 return -1;
00102 }
00103
00104 int
00105 LOCA::Epetra::ShiftInvertOperator::ApplyInverse(const Epetra_MultiVector& X,
00106 Epetra_MultiVector&Y) const
00107 {
00108 globalData->locaErrorCheck->throwError(
00109 "LOCA::Epetra::ShiftInvertOperator::ApplyInverse",
00110 "Operator does not support ApplyInverse");
00111 return -1;
00112 }
00113
00114 double
00115 LOCA::Epetra::ShiftInvertOperator::NormInf() const
00116 {
00117 globalData->locaErrorCheck->throwError(
00118 "LOCA::Epetra::ShiftInvertOperator::NormInf",
00119 "Operator does not support NormInf");
00120 return -1;
00121 }
00122
00123 const char*
00124 LOCA::Epetra::ShiftInvertOperator::Label() const
00125 {
00126 return(Label_);
00127 }
00128
00129 bool
00130 LOCA::Epetra::ShiftInvertOperator::UseTranspose() const
00131 {
00132 return false;
00133 }
00134
00135 bool
00136 LOCA::Epetra::ShiftInvertOperator::HasNormInf() const
00137 {
00138 return false;
00139 }
00140
00141 const Epetra_Comm&
00142 LOCA::Epetra::ShiftInvertOperator::Comm() const
00143 {
00144 return jacOper->Comm();
00145 }
00146
00147 const Epetra_Map&
00148 LOCA::Epetra::ShiftInvertOperator::OperatorDomainMap() const
00149 {
00150 return jacOper->OperatorDomainMap();
00151 }
00152
00153 const Epetra_Map&
00154 LOCA::Epetra::ShiftInvertOperator::OperatorRangeMap() const
00155 {
00156 return jacOper->OperatorRangeMap();
00157 }