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
00040
00041
00042 #include "LOCA_Epetra_TransposeLinearSystem_TransposePreconditioner.H"
00043 #include "Teuchos_ParameterList.hpp"
00044 #include "NOX_Epetra_LinearSystem.H"
00045 #include "NOX_Epetra_Scaling.H"
00046 #include "Epetra_Operator.h"
00047
00048 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00049 TransposePreconditioner(
00050 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00051 const Teuchos::RCP<Teuchos::ParameterList>& solverParams,
00052 const Teuchos::RCP<NOX::Epetra::LinearSystem>& linsys_) :
00053 globalData(global_data),
00054 linsys(linsys_),
00055 jac(),
00056 prec(),
00057 scaling_trans()
00058 {
00059
00060 if (solverParams->isParameter("Transpose Scaling"))
00061 scaling_trans = (*solverParams).INVALID_TEMPLATE_QUALIFIER
00062 get< Teuchos::RCP<NOX::Epetra::Scaling> >("Transpose Scaling");
00063 }
00064
00065 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00066 ~TransposePreconditioner()
00067 {
00068 }
00069
00070 bool
00071 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00072 applyJacobianTransposeInverse(Teuchos::ParameterList ¶ms,
00073 const NOX::Epetra::Vector &input,
00074 NOX::Epetra::Vector &result)
00075 {
00076
00077 linsys->setJacobianOperatorForSolve(jac);
00078 if (linsys->hasPreconditioner())
00079 linsys->setPrecOperatorForSolve(prec);
00080
00081
00082 Teuchos::RCP<NOX::Epetra::Scaling> scaling_orig;
00083 if (scaling_trans != Teuchos::null) {
00084 scaling_orig = linsys->getScaling();
00085 linsys->resetScaling(scaling_trans);
00086 }
00087
00088
00089 bool res = linsys->applyJacobianInverse(params, input, result);
00090
00091
00092 if (scaling_trans != Teuchos::null)
00093 linsys->resetScaling(scaling_orig);
00094
00095 return res;
00096 }
00097
00098 bool
00099 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00100 createJacobianTranspose()
00101 {
00102
00103 jac = linsys->getJacobianOperator();
00104 jac->SetUseTranspose(true);
00105
00106 return true;
00107 }
00108
00109 bool
00110 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00111 createTransposePreconditioner(const NOX::Epetra::Vector& x,
00112 Teuchos::ParameterList& p)
00113 {
00114
00115 if (!linsys->hasPreconditioner())
00116 return true;
00117
00118
00119 bool res1 = linsys->destroyPreconditioner();
00120
00121
00122 Teuchos::RCP<NOX::Epetra::Scaling> scaling_orig;
00123 if (scaling_trans != Teuchos::null) {
00124 scaling_orig = linsys->getScaling();
00125 linsys->resetScaling(scaling_trans);
00126 }
00127
00128
00129 linsys->setJacobianOperatorForSolve(jac);
00130 bool res2 = linsys->createPreconditioner(x, p, true);
00131 prec = linsys->getGeneratedPrecOperator();
00132 prec->SetUseTranspose(true);
00133
00134
00135 if (scaling_trans != Teuchos::null)
00136 linsys->resetScaling(scaling_orig);
00137
00138 return res1 && res2;
00139 }
00140
00141 Teuchos::RCP<Epetra_Operator>
00142 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00143 getJacobianTransposeOperator()
00144 {
00145 return jac;
00146 }
00147
00148 Teuchos::RCP<Epetra_Operator>
00149 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00150 getTransposePreconditioner()
00151 {
00152 return prec;
00153 }
00154
00155 void
00156 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00157 setJacobianTransposeOperator(
00158 const Teuchos::RCP<Epetra_Operator>& new_jac_trans)
00159 {
00160 jac = new_jac_trans;
00161 }
00162
00163 void
00164 LOCA::Epetra::TransposeLinearSystem::TransposePreconditioner::
00165 setTransposePreconditioner(
00166 const Teuchos::RCP<Epetra_Operator>& new_prec_trans)
00167 {
00168 prec = new_prec_trans;
00169 }