00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _CONSTRAINEDLS_H_
00012 #define _CONSTRAINEDLS_H_
00013
00014 #include "Vector.H"
00015 #include "REAL.H"
00016 #include "RealVect.H"
00017 #include "NamespaceHeader.H"
00018
00019 class ConstrainedLS
00020 {
00021 public:
00022 enum Bound
00023 {
00024 LOWER_BOUND,
00025 UPPER_BOUND,
00026 UNCONSTRAINED
00027 };
00028
00029 enum LSResult
00030 {
00031 SUCCESS,
00032 INCONSISTENT_BOUNDS,
00033 UNDERDETERMINED,
00034 SINGULAR,
00035 UNCONVERGED
00036 };
00037
00038 ConstrainedLS();
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 LSResult solveBoundConstrained(Vector<Real> & a_x,
00049 Real** a_A,
00050 const Vector<Real>& a_rhs,
00051 const Vector<Real>& a_lowerBound,
00052 const Vector<Real>& a_upperBound);
00053
00054
00055
00056 LSResult solveUnconstrained(Vector<Real> & a_x,
00057 Real** a_A,
00058 const Vector<Real> & a_rhs);
00059
00060 bool boundsConsistent(const Vector<Real> & a_lowBound,
00061 const Vector<Real> & a_hiBound) const;
00062
00063
00064
00065 Vector<Bound> getConstraints() const;
00066
00067
00068
00069
00070 int numberActiveConstraints() const;
00071
00072
00073
00074
00075 Real getResidual() const;
00076
00077
00078
00079
00080 LSResult qrSolution(Real ** a_A,
00081 Vector<Real> & a_x,
00082 Vector<Real> & a_b,
00083 Real & resq);
00084
00085
00086
00087
00088 protected:
00089 Vector<Bound> m_boundState;
00090 int m_nbound;
00091
00092
00093
00094 private:
00095 Real m_residual;
00096 void allocArray(const int& rows,
00097 const int& cols,
00098 Real**& A);
00099
00100 void freeArray(const int& rows,
00101 const int& cols,
00102 Real**& A);
00103
00104
00105 };
00106
00107 #include "NamespaceFooter.H"
00108 #endif