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_BorderedSolver_ComplexOperator.H"
00043 #include "LOCA_Hopf_MooreSpence_AbstractGroup.H"
00044 #include "LOCA_Hopf_ComplexMultiVector.H"
00045 #include "LOCA_Hopf_MinimallyAugmented_AbstractGroup.H"
00046
00047 LOCA::BorderedSolver::ComplexOperator::
00048 ComplexOperator(const Teuchos::RCP<const LOCA::Hopf::MooreSpence::AbstractGroup>& grp,
00049 double Omega) :
00050 grpPtr(grp),
00051 omega(Omega)
00052 {
00053 }
00054
00055 LOCA::BorderedSolver::ComplexOperator::
00056 ~ComplexOperator()
00057 {
00058 }
00059
00060 Teuchos::RCP<const NOX::Abstract::Group>
00061 LOCA::BorderedSolver::ComplexOperator::
00062 getGroup() const
00063 {
00064 return grpPtr;
00065 }
00066
00067 double
00068 LOCA::BorderedSolver::ComplexOperator::
00069 getFrequency() const
00070 {
00071 return omega;
00072 }
00073
00074 NOX::Abstract::Group::ReturnType
00075 LOCA::BorderedSolver::ComplexOperator::
00076 apply(const NOX::Abstract::MultiVector& X,
00077 NOX::Abstract::MultiVector& Y) const
00078 {
00079 const LOCA::Hopf::ComplexMultiVector& cX =
00080 dynamic_cast<const LOCA::Hopf::ComplexMultiVector&>(X);
00081 LOCA::Hopf::ComplexMultiVector& cY =
00082 dynamic_cast<LOCA::Hopf::ComplexMultiVector&>(Y);
00083 return grpPtr->applyComplexMultiVector(*(cX.getRealMultiVec()),
00084 *(cX.getImagMultiVec()),
00085 *(cY.getRealMultiVec()),
00086 *(cY.getImagMultiVec()));
00087 }
00088
00089 NOX::Abstract::Group::ReturnType
00090 LOCA::BorderedSolver::ComplexOperator::
00091 applyTranspose(const NOX::Abstract::MultiVector& X,
00092 NOX::Abstract::MultiVector& Y) const
00093 {
00094 Teuchos::RCP<const LOCA::Hopf::MinimallyAugmented::AbstractGroup> magrp = Teuchos::rcp_dynamic_cast<const LOCA::Hopf::MinimallyAugmented::AbstractGroup>(grpPtr);
00095 const LOCA::Hopf::ComplexMultiVector& cX =
00096 dynamic_cast<const LOCA::Hopf::ComplexMultiVector&>(X);
00097 LOCA::Hopf::ComplexMultiVector& cY =
00098 dynamic_cast<LOCA::Hopf::ComplexMultiVector&>(Y);
00099
00100 if (magrp != Teuchos::null)
00101 return magrp->applyComplexTransposeMultiVector(*(cX.getRealMultiVec()),
00102 *(cX.getImagMultiVec()),
00103 *(cY.getRealMultiVec()),
00104 *(cY.getImagMultiVec()));
00105 else
00106 return NOX::Abstract::Group::NotDefined;
00107 }
00108
00109 NOX::Abstract::Group::ReturnType
00110 LOCA::BorderedSolver::ComplexOperator::
00111 applyInverse(Teuchos::ParameterList& params,
00112 const NOX::Abstract::MultiVector& B,
00113 NOX::Abstract::MultiVector& X) const
00114 {
00115 const LOCA::Hopf::ComplexMultiVector& cB =
00116 dynamic_cast<const LOCA::Hopf::ComplexMultiVector&>(B);
00117 LOCA::Hopf::ComplexMultiVector& cX =
00118 dynamic_cast<LOCA::Hopf::ComplexMultiVector&>(X);
00119 return grpPtr->applyComplexInverseMultiVector(params,
00120 *(cB.getRealMultiVec()),
00121 *(cB.getImagMultiVec()),
00122 *(cX.getRealMultiVec()),
00123 *(cX.getImagMultiVec()));
00124 }
00125
00126 NOX::Abstract::Group::ReturnType
00127 LOCA::BorderedSolver::ComplexOperator::
00128 applyInverseTranspose(Teuchos::ParameterList& params,
00129 const NOX::Abstract::MultiVector& B,
00130 NOX::Abstract::MultiVector& X) const
00131 {
00132 Teuchos::RCP<const LOCA::Hopf::MinimallyAugmented::AbstractGroup> magrp = Teuchos::rcp_dynamic_cast<const LOCA::Hopf::MinimallyAugmented::AbstractGroup>(grpPtr);
00133 const LOCA::Hopf::ComplexMultiVector& cB =
00134 dynamic_cast<const LOCA::Hopf::ComplexMultiVector&>(B);
00135 LOCA::Hopf::ComplexMultiVector& cX =
00136 dynamic_cast<LOCA::Hopf::ComplexMultiVector&>(X);
00137
00138 if (magrp != Teuchos::null)
00139 return magrp->applyComplexTransposeInverseMultiVector(
00140 params,
00141 *(cB.getRealMultiVec()),
00142 *(cB.getImagMultiVec()),
00143 *(cX.getRealMultiVec()),
00144 *(cX.getImagMultiVec()));
00145 else
00146 return NOX::Abstract::Group::NotDefined;
00147 }