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_MultiContinuation_CompositeConstraint.H"
00043 #include "LOCA_GlobalData.H"
00044 #include "LOCA_ErrorCheck.H"
00045
00046 LOCA::MultiContinuation::CompositeConstraint::CompositeConstraint() :
00047 globalData(),
00048 numConstraintObjects(0),
00049 constraintPtrs(),
00050 indices(),
00051 totalNumConstraints(0),
00052 constraints(),
00053 isValidConstraints(false),
00054 isValidDX(false)
00055 {
00056 }
00057
00058 LOCA::MultiContinuation::CompositeConstraint::CompositeConstraint(
00059 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00060 const vector< Teuchos::RCP<
00061 LOCA::MultiContinuation::ConstraintInterface> >& constraintObjects) :
00062 globalData(),
00063 numConstraintObjects(0),
00064 constraintPtrs(),
00065 indices(),
00066 totalNumConstraints(0),
00067 constraints(),
00068 isValidConstraints(false),
00069 isValidDX(false)
00070 {
00071 init(global_data, constraintObjects);
00072 }
00073
00074 LOCA::MultiContinuation::CompositeConstraint::CompositeConstraint(
00075 const LOCA::MultiContinuation::CompositeConstraint& source,
00076 NOX::CopyType type) :
00077 globalData(source.globalData),
00078 numConstraintObjects(source.numConstraintObjects),
00079 constraintPtrs(source.constraintPtrs),
00080 indices(source.indices),
00081 totalNumConstraints(source.totalNumConstraints),
00082 constraints(source.constraints),
00083 isValidConstraints(source.isValidConstraints),
00084 isValidDX(source.isValidDX)
00085 {
00086 }
00087
00088 LOCA::MultiContinuation::CompositeConstraint::~CompositeConstraint()
00089 {
00090 }
00091
00092 void
00093 LOCA::MultiContinuation::CompositeConstraint::copy(
00094 const LOCA::MultiContinuation::ConstraintInterface& src)
00095 {
00096 const LOCA::MultiContinuation::CompositeConstraint& source =
00097 dynamic_cast<const LOCA::MultiContinuation::CompositeConstraint&>(src);
00098
00099
00100
00101 if (this != &source) {
00102 globalData = source.globalData;
00103 numConstraintObjects = source.numConstraintObjects;
00104 constraintPtrs = source.constraintPtrs;
00105 indices = source.indices;
00106 totalNumConstraints = source.totalNumConstraints;
00107 constraints.assign(source.constraints);
00108 isValidConstraints = source.isValidConstraints;
00109 isValidDX = source.isValidDX;
00110 }
00111 }
00112
00113 Teuchos::RCP<LOCA::MultiContinuation::ConstraintInterface>
00114 LOCA::MultiContinuation::CompositeConstraint::clone(NOX::CopyType type) const
00115 {
00116 return Teuchos::rcp(new CompositeConstraint(*this, type));
00117 }
00118
00119 int
00120 LOCA::MultiContinuation::CompositeConstraint::numConstraints() const
00121 {
00122 return totalNumConstraints;
00123 }
00124
00125 void
00126 LOCA::MultiContinuation::CompositeConstraint::setX(
00127 const NOX::Abstract::Vector& y)
00128 {
00129 for (int i=0; i<numConstraintObjects; i++)
00130 constraintPtrs[i]->setX(y);
00131 isValidConstraints = false;
00132 isValidDX = false;
00133 }
00134
00135 void
00136 LOCA::MultiContinuation::CompositeConstraint::setParam(int paramID, double val)
00137 {
00138 for (int i=0; i<numConstraintObjects; i++)
00139 constraintPtrs[i]->setParam(paramID, val);
00140 isValidConstraints = false;
00141 isValidDX = false;
00142 }
00143
00144 void
00145 LOCA::MultiContinuation::CompositeConstraint::setParams(
00146 const vector<int>& paramIDs,
00147 const NOX::Abstract::MultiVector::DenseMatrix& vals)
00148 {
00149 for (int i=0; i<numConstraintObjects; i++)
00150 constraintPtrs[i]->setParams(paramIDs, vals);
00151 isValidConstraints = false;
00152 isValidDX = false;
00153 }
00154
00155 NOX::Abstract::Group::ReturnType
00156 LOCA::MultiContinuation::CompositeConstraint::computeConstraints()
00157 {
00158 if (isValidConstraints)
00159 return NOX::Abstract::Group::Ok;
00160
00161 string callingFunction =
00162 "LOCA::MultiContinuation::CompositeConstraint::computeConstraints()";
00163 NOX::Abstract::Group::ReturnType status;
00164 NOX::Abstract::Group::ReturnType finalStatus = NOX::Abstract::Group::Ok;
00165
00166 const NOX::Abstract::MultiVector::DenseMatrix *g;
00167
00168 for (int i=0; i<numConstraintObjects; i++) {
00169 status = constraintPtrs[i]->computeConstraints();
00170 finalStatus =
00171 globalData->locaErrorCheck->combineAndCheckReturnTypes(status,
00172 finalStatus,
00173 callingFunction);
00174 g = &(constraintPtrs[i]->getConstraints());
00175 for (int j=0; j<constraintPtrs[i]->numConstraints(); j++)
00176 constraints(indices[i][j],0) = (*g)(j,0);
00177 }
00178
00179 isValidConstraints = true;
00180
00181 return finalStatus;
00182 }
00183
00184 NOX::Abstract::Group::ReturnType
00185 LOCA::MultiContinuation::CompositeConstraint::computeDX()
00186 {
00187 if (isValidDX)
00188 return NOX::Abstract::Group::Ok;
00189
00190 string callingFunction =
00191 "LOCA::MultiContinuation::CompositeConstraint::computeConstraints()";
00192 NOX::Abstract::Group::ReturnType status;
00193 NOX::Abstract::Group::ReturnType finalStatus = NOX::Abstract::Group::Ok;
00194
00195 for (int i=0; i<numConstraintObjects; i++) {
00196 status = constraintPtrs[i]->computeDX();
00197 finalStatus =
00198 globalData->locaErrorCheck->combineAndCheckReturnTypes(status,
00199 finalStatus,
00200 callingFunction);
00201 }
00202
00203 return finalStatus;
00204 }
00205
00206 NOX::Abstract::Group::ReturnType
00207 LOCA::MultiContinuation::CompositeConstraint::computeDP(
00208 const vector<int>& paramIDs,
00209 NOX::Abstract::MultiVector::DenseMatrix& dgdp,
00210 bool isValidG)
00211 {
00212 string callingFunction =
00213 "LOCA::MultiContinuation::CompositeConstraint::computeDP()";
00214 NOX::Abstract::Group::ReturnType status;
00215 NOX::Abstract::Group::ReturnType finalStatus = NOX::Abstract::Group::Ok;
00216
00217 Teuchos::RCP<NOX::Abstract::MultiVector::DenseMatrix> dgdp_sub;
00218 int num_rows;
00219 int num_cols = dgdp.numCols();
00220 for (int i=0; i<numConstraintObjects; i++) {
00221
00222
00223 num_rows = indices[i][constraintPtrs[i]->numConstraints()-1] -
00224 indices[i][0] + 1;
00225 dgdp_sub =
00226 Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(Teuchos::View,
00227 dgdp,
00228 num_rows,
00229 num_cols,
00230 indices[i][0],
00231 0));
00232
00233 status = constraintPtrs[i]->computeDP(paramIDs, *dgdp_sub, isValidG);
00234 finalStatus =
00235 globalData->locaErrorCheck->combineAndCheckReturnTypes(status,
00236 finalStatus,
00237 callingFunction);
00238 }
00239
00240 return finalStatus;
00241 }
00242
00243 bool
00244 LOCA::MultiContinuation::CompositeConstraint::isConstraints() const
00245 {
00246 return isValidConstraints;
00247 }
00248
00249 bool
00250 LOCA::MultiContinuation::CompositeConstraint::isDX() const
00251 {
00252 return isValidDX;
00253 }
00254
00255 const NOX::Abstract::MultiVector::DenseMatrix&
00256 LOCA::MultiContinuation::CompositeConstraint::getConstraints() const
00257 {
00258 return constraints;
00259 }
00260
00261 NOX::Abstract::Group::ReturnType
00262 LOCA::MultiContinuation::CompositeConstraint::multiplyDX(
00263 double alpha,
00264 const NOX::Abstract::MultiVector& input_x,
00265 NOX::Abstract::MultiVector::DenseMatrix& result_p) const
00266 {
00267 string callingFunction =
00268 "LOCA::MultiContinuation::CompositeConstraint::multiplyDX()";
00269 NOX::Abstract::Group::ReturnType status;
00270 NOX::Abstract::Group::ReturnType finalStatus = NOX::Abstract::Group::Ok;
00271
00272
00273 if (isDXZero()) {
00274 result_p.putScalar(0.0);
00275 return finalStatus;
00276 }
00277
00278 Teuchos::RCP<NOX::Abstract::MultiVector::DenseMatrix> result_p_sub;
00279 int num_rows;
00280 int num_cols = result_p.numCols();
00281 for (int i=0; i<numConstraintObjects; i++) {
00282
00283 num_rows = constraintPtrs[i]->numConstraints();
00284
00285
00286
00287 if (constraintPtrs[i]->isDXZero()) {
00288 for (int j=0; j<num_rows; j++)
00289 for (int k=0; k<num_cols; k++)
00290 result_p(indices[i][j],k) = 0.0;
00291 }
00292 else {
00293
00294
00295
00296 result_p_sub =
00297 Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(Teuchos::View,
00298 result_p,
00299 num_rows,
00300 num_cols,
00301 indices[i][0],
00302 0));
00303
00304 status = constraintPtrs[i]->multiplyDX(alpha, input_x,
00305 *result_p_sub);
00306 finalStatus =
00307 globalData->locaErrorCheck->combineAndCheckReturnTypes(
00308 status,
00309 finalStatus,
00310 callingFunction);
00311 }
00312
00313 }
00314
00315 return finalStatus;
00316 }
00317
00318 NOX::Abstract::Group::ReturnType
00319 LOCA::MultiContinuation::CompositeConstraint::addDX(
00320 Teuchos::ETransp transb,
00321 double alpha,
00322 const NOX::Abstract::MultiVector::DenseMatrix& b,
00323 double beta,
00324 NOX::Abstract::MultiVector& result_x) const
00325 {
00326 string callingFunction =
00327 "LOCA::MultiContinuation::CompositeConstraint::addDX()";
00328 NOX::Abstract::Group::ReturnType status;
00329 NOX::Abstract::Group::ReturnType finalStatus = NOX::Abstract::Group::Ok;
00330
00331
00332 result_x.scale(beta);
00333
00334
00335 if (isDXZero())
00336 return finalStatus;
00337
00338 Teuchos::RCP<NOX::Abstract::MultiVector::DenseMatrix> b_sub;
00339 Teuchos::RCP<NOX::Abstract::MultiVector> result_x_sub;
00340 int num_rows;
00341 int num_cols = result_x.numVectors();
00342 for (int j=0; j<numConstraintObjects; j++) {
00343
00344 if (!constraintPtrs[j]->isDXZero()) {
00345
00346
00347
00348 num_rows = constraintPtrs[j]->numConstraints();
00349 if (transb == Teuchos::NO_TRANS) {
00350 b_sub =
00351 Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(
00352 Teuchos::View,
00353 b,
00354 num_rows,
00355 num_cols,
00356 indices[j][0],
00357 0));
00358 }
00359 else {
00360 b_sub =
00361 Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(
00362 Teuchos::View,
00363 b,
00364 num_cols,
00365 num_rows,
00366 0,
00367 indices[j][0]));
00368 }
00369
00370
00371 status = constraintPtrs[j]->addDX(transb, alpha, *b_sub, 1.0,
00372 result_x);
00373 finalStatus =
00374 globalData->locaErrorCheck->combineAndCheckReturnTypes(
00375 status,
00376 finalStatus,
00377 callingFunction);
00378 }
00379
00380 }
00381
00382 return finalStatus;
00383 }
00384
00385 bool
00386 LOCA::MultiContinuation::CompositeConstraint::isDXZero() const
00387 {
00388 for (int i=0; i<numConstraintObjects; i++)
00389 if (!constraintPtrs[i]->isDXZero())
00390 return false;
00391
00392 return true;
00393 }
00394
00395 void
00396 LOCA::MultiContinuation::CompositeConstraint::preProcessContinuationStep(
00397 LOCA::Abstract::Iterator::StepStatus stepStatus)
00398 {
00399 for (int i=0; i<numConstraintObjects; i++)
00400 constraintPtrs[i]->preProcessContinuationStep(stepStatus);
00401 }
00402
00403 void
00404 LOCA::MultiContinuation::CompositeConstraint::postProcessContinuationStep(
00405 LOCA::Abstract::Iterator::StepStatus stepStatus)
00406 {
00407 for (int i=0; i<numConstraintObjects; i++)
00408 constraintPtrs[i]->postProcessContinuationStep(stepStatus);
00409 }
00410
00411 void
00412 LOCA::MultiContinuation::CompositeConstraint::init(
00413 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00414 const vector< Teuchos::RCP<
00415 LOCA::MultiContinuation::ConstraintInterface> >& constraintObjects)
00416 {
00417 globalData = global_data;
00418 numConstraintObjects = constraintObjects.size();
00419 constraintPtrs = constraintObjects;
00420 indices.resize(numConstraintObjects);
00421 totalNumConstraints = 0;
00422
00423 int n;
00424 for (int i=0; i<numConstraintObjects; i++) {
00425 n = constraintPtrs[i]->numConstraints();
00426 indices[i].resize(n);
00427 for (int j=0; j<n; j++)
00428 indices[i][j] = totalNumConstraints + j;
00429 totalNumConstraints += n;
00430 }
00431 constraints.shape(totalNumConstraints, 1);
00432 }