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_CompositeConstraintMVDX.H"
00043 #include "LOCA_GlobalData.H"
00044 #include "LOCA_ErrorCheck.H"
00045
00046 LOCA::MultiContinuation::CompositeConstraintMVDX::CompositeConstraintMVDX(
00047 const Teuchos::RCP<LOCA::GlobalData>& global_data,
00048 const vector< Teuchos::RCP<LOCA::MultiContinuation::ConstraintInterfaceMVDX> >& constraintObjects) :
00049 LOCA::MultiContinuation::CompositeConstraint(),
00050 constraintMVDXPtrs(constraintObjects),
00051 compositeDX()
00052 {
00053
00054 vector<Teuchos::RCP<LOCA::MultiContinuation::ConstraintInterface> > tmp(constraintObjects.size());
00055 for (unsigned int i=0; i<constraintObjects.size(); i++)
00056 tmp[i] = constraintObjects[i];
00057
00058
00059 init(global_data, tmp);
00060
00061
00062 int i=0;
00063 while (i < numConstraintObjects && constraintPtrs[i]->isDXZero())
00064 i++;
00065
00066
00067 if (i < numConstraintObjects)
00068 compositeDX =
00069 constraintMVDXPtrs[i]->getDX()->clone(totalNumConstraints);
00070 else
00071 compositeDX = Teuchos::null;
00072 }
00073
00074 LOCA::MultiContinuation::CompositeConstraintMVDX::CompositeConstraintMVDX(
00075 const LOCA::MultiContinuation::CompositeConstraintMVDX& source,
00076 NOX::CopyType type) :
00077 LOCA::MultiContinuation::CompositeConstraint(source),
00078 constraintMVDXPtrs(source.constraintMVDXPtrs),
00079 compositeDX()
00080 {
00081 if (source.compositeDX.get() != NULL)
00082 compositeDX = source.compositeDX->clone(type);
00083 else
00084 compositeDX = Teuchos::null;
00085 }
00086
00087 LOCA::MultiContinuation::CompositeConstraintMVDX::~CompositeConstraintMVDX()
00088 {
00089 }
00090
00091 void
00092 LOCA::MultiContinuation::CompositeConstraintMVDX::copy(
00093 const LOCA::MultiContinuation::ConstraintInterface& src)
00094 {
00095 const LOCA::MultiContinuation::CompositeConstraintMVDX& source =
00096 dynamic_cast<const LOCA::MultiContinuation::CompositeConstraintMVDX&>(src);
00097
00098 if (this != &source) {
00099 LOCA::MultiContinuation::CompositeConstraint::copy(source);
00100 constraintMVDXPtrs = source.constraintMVDXPtrs;
00101 if (compositeDX.get() != NULL && source.compositeDX.get() != NULL)
00102 *compositeDX = *source.compositeDX;
00103 else if (source.compositeDX.get() != NULL)
00104 compositeDX = source.compositeDX->clone(NOX::DeepCopy);
00105 else
00106 compositeDX = Teuchos::null;
00107 }
00108 }
00109
00110 Teuchos::RCP<LOCA::MultiContinuation::ConstraintInterface>
00111 LOCA::MultiContinuation::CompositeConstraintMVDX::clone(NOX::CopyType type) const
00112 {
00113 return Teuchos::rcp(new CompositeConstraintMVDX(*this, type));
00114 }
00115
00116 NOX::Abstract::Group::ReturnType
00117 LOCA::MultiContinuation::CompositeConstraintMVDX::computeDX()
00118 {
00119 string callingFunction =
00120 "LOCA::MultiContinuation::CompositeConstraintMVDX::computeConstraints()";
00121 NOX::Abstract::Group::ReturnType status;
00122 NOX::Abstract::Group::ReturnType finalStatus = NOX::Abstract::Group::Ok;
00123
00124 if (isValidDX)
00125 return finalStatus;
00126
00127 if (isDXZero())
00128 return finalStatus;
00129
00130 Teuchos::RCP<NOX::Abstract::MultiVector> dx;
00131 for (int i=0; i<numConstraintObjects; i++) {
00132
00133 if (!constraintMVDXPtrs[i]->isDXZero()) {
00134
00135
00136 status = constraintMVDXPtrs[i]->computeDX();
00137 finalStatus =
00138 globalData->locaErrorCheck->combineAndCheckReturnTypes(
00139 status,
00140 finalStatus,
00141 callingFunction);
00142
00143
00144 dx = compositeDX->subView(indices[i]);
00145 *dx = *(constraintMVDXPtrs[i]->getDX());
00146 }
00147 }
00148
00149 return finalStatus;
00150 }
00151
00152 NOX::Abstract::Group::ReturnType
00153 LOCA::MultiContinuation::CompositeConstraintMVDX::multiplyDX(
00154 double alpha,
00155 const NOX::Abstract::MultiVector& input_x,
00156 NOX::Abstract::MultiVector::DenseMatrix& result_p) const
00157 {
00158 return
00159 LOCA::MultiContinuation::ConstraintInterfaceMVDX::multiplyDX(alpha,
00160 input_x,
00161 result_p);
00162 }
00163
00164 NOX::Abstract::Group::ReturnType
00165 LOCA::MultiContinuation::CompositeConstraintMVDX::addDX(
00166 Teuchos::ETransp transb,
00167 double alpha,
00168 const NOX::Abstract::MultiVector::DenseMatrix& b,
00169 double beta,
00170 NOX::Abstract::MultiVector& result_x) const
00171 {
00172 return
00173 LOCA::MultiContinuation::ConstraintInterfaceMVDX::addDX(transb, alpha, b,
00174 beta, result_x);
00175 }
00176
00177 const NOX::Abstract::MultiVector*
00178 LOCA::MultiContinuation::CompositeConstraintMVDX::getDX() const
00179 {
00180 return compositeDX.get();
00181 }