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 "NOX_Belos_MultiVector.H"
00043
00044 NOX::Belos::MultiVector::MultiVector(NOX::Abstract::MultiVector& noxMultiVec)
00045 : vecPtr(&noxMultiVec),
00046 ownsVec(false)
00047 {
00048 }
00049
00050 NOX::Belos::MultiVector::MultiVector(const NOX::Belos::MultiVector& source)
00051 : vecPtr(source.vecPtr->clone(NOX::DeepCopy).release()),
00052 ownsVec(true)
00053 {
00054 }
00055
00056 NOX::Belos::MultiVector::MultiVector(NOX::Abstract::MultiVector& noxMultiVec,
00057 bool ownsVecFlag)
00058 : vecPtr(&noxMultiVec),
00059 ownsVec(ownsVecFlag)
00060 {
00061 }
00062
00063 NOX::Belos::MultiVector::~MultiVector()
00064 {
00065 if (ownsVec)
00066 delete vecPtr;
00067 }
00068
00069 NOX::Belos::MultiVector&
00070 NOX::Belos::MultiVector::operator=(const NOX::Belos::MultiVector& source)
00071 {
00072 if (this != &source) {
00073 *vecPtr = *source.vecPtr;
00074 }
00075
00076 return *this;
00077 }
00078
00079 ::Belos::MultiVec<double>*
00080 NOX::Belos::MultiVector::Clone(const int numvecs)
00081 {
00082 NOX::Abstract::MultiVector *newVec = vecPtr->clone(numvecs).release();
00083 return new NOX::Belos::MultiVector(*newVec, true);
00084 }
00085
00086 ::Belos::MultiVec<double>*
00087 NOX::Belos::MultiVector::CloneCopy()
00088 {
00089 NOX::Abstract::MultiVector *newVec = vecPtr->clone(NOX::ShapeCopy).release();
00090 return new NOX::Belos::MultiVector(*newVec, true);
00091 }
00092
00093 ::Belos::MultiVec<double>*
00094 NOX::Belos::MultiVector::CloneCopy(int index[], int numvecs)
00095 {
00096 vector<int> idx(index, index+numvecs);
00097 NOX::Abstract::MultiVector *newVec = vecPtr->subCopy(idx).release();
00098 return new NOX::Belos::MultiVector(*newVec, true);
00099 }
00100
00101 ::Belos::MultiVec<double>*
00102 NOX::Belos::MultiVector::CloneView(int index[], int numvecs)
00103 {
00104 vector<int> idx(index, index+numvecs);
00105 NOX::Abstract::MultiVector *newVec = vecPtr->subView(idx).release();
00106 return new NOX::Belos::MultiVector(*newVec, true);
00107 }
00108
00109 int
00110 NOX::Belos::MultiVector::GetVecLength() const
00111 {
00112 return vecPtr->length();
00113 }
00114
00115 int
00116 NOX::Belos::MultiVector::GetNumberVecs() const
00117 {
00118 return vecPtr->numVectors();
00119 }
00120
00121 void
00122 NOX::Belos::MultiVector::MvTimesMatAddMv(double alpha,
00123 ::Belos::MultiVec<double>& A,
00124 Teuchos::SerialDenseMatrix<int,double>& B,
00125 double beta)
00126 {
00127
00128 NOX::Belos::MultiVector& nox_belos_A =
00129 dynamic_cast<NOX::Belos::MultiVector&>(A);
00130
00131 vecPtr->update(Teuchos::NO_TRANS, alpha, *(nox_belos_A.vecPtr), B, beta);
00132 }
00133
00134 void
00135 NOX::Belos::MultiVector:: MvAddMv(double alpha,
00136 ::Belos::MultiVec<double>& A,
00137 double beta,
00138 ::Belos::MultiVec<double>& B)
00139 {
00140
00141 NOX::Belos::MultiVector& nox_belos_A =
00142 dynamic_cast<NOX::Belos::MultiVector&>(A);
00143
00144
00145 NOX::Belos::MultiVector& nox_belos_B =
00146 dynamic_cast<NOX::Belos::MultiVector&>(B);
00147
00148 vecPtr->update(alpha, *(nox_belos_A.vecPtr), beta, *(nox_belos_B.vecPtr),
00149 0.0);
00150 }
00151
00152 void
00153 NOX::Belos::MultiVector::MvTransMv(double alpha,
00154 ::Belos::MultiVec<double>& A,
00155 Teuchos::SerialDenseMatrix<int,double>& B)
00156 {
00157
00158 NOX::Belos::MultiVector& nox_belos_A =
00159 dynamic_cast<NOX::Belos::MultiVector&>(A);
00160
00161 vecPtr->multiply(alpha, *(nox_belos_A.vecPtr), B);
00162 }
00163
00164 ::Belos::ReturnType
00165 NOX::Belos::MultiVector::MvNorm(double *normvec,
00166 ::Belos::NormType norm_type)
00167 {
00168 NOX::Abstract::Vector::NormType nox_norm_type;
00169 if (norm_type == ::Belos::OneNorm)
00170 nox_norm_type = NOX::Abstract::Vector::OneNorm;
00171 else if (norm_type == ::Belos::TwoNorm)
00172 nox_norm_type = NOX::Abstract::Vector::TwoNorm;
00173 else
00174 nox_norm_type = NOX::Abstract::Vector::MaxNorm;
00175
00176 vector<double> res(vecPtr->numVectors());
00177 vecPtr->norm(res, nox_norm_type);
00178
00179 for (unsigned int i=0; i<res.size(); i++)
00180 normvec[i] = res[i];
00181
00182 return ::Belos::Ok;
00183 }
00184
00185 void
00186 NOX::Belos::MultiVector::SetBlock(::Belos::MultiVec<double>& A, int index[],
00187 int numvecs)
00188 {
00189 vector<int> idx(index, index+numvecs);
00190
00191
00192 NOX::Belos::MultiVector& nox_belos_A =
00193 dynamic_cast<NOX::Belos::MultiVector&>(A);
00194
00195 vecPtr->setBlock(*(nox_belos_A.vecPtr), idx);
00196 }
00197
00198 void
00199 NOX::Belos::MultiVector::MvRandom()
00200 {
00201 vecPtr->random();
00202 }
00203
00204 void
00205 NOX::Belos::MultiVector::MvInit(double alpha)
00206 {
00207 vecPtr->init(alpha);
00208 }
00209
00210 void
00211 NOX::Belos::MultiVector::MvPrint(ostream& os)
00212 {
00213 vecPtr->print(os);
00214 }
00215
00216 NOX::Abstract::MultiVector&
00217 NOX::Belos::MultiVector::getNoxMultiVector()
00218 {
00219 return *vecPtr;
00220 }
00221
00222 const NOX::Abstract::MultiVector&
00223 NOX::Belos::MultiVector::getNoxMultiVector() const
00224 {
00225 return *vecPtr;
00226 }
00227
00228 ::Belos::ReturnType
00229 NOX::Belos::MultiVector::noxReturnTypeToBelos(
00230 NOX::Abstract::Group::ReturnType noxStatus) const
00231 {
00232 if (noxStatus == NOX::Abstract::Group::Ok ||
00233 noxStatus == NOX::Abstract::Group::NotConverged)
00234 return ::Belos::Ok;
00235 else if (noxStatus == NOX::Abstract::Group::NotDefined)
00236 return ::Belos::Undefined;
00237 else
00238 return ::Belos::Error;
00239 }
00240
00241