00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012 #ifndef _LSPROBLEM_H_
00013 #define _LSPROBLEM_H_
00014
00015 #include <map>
00016 using std::map;
00017
00018 #include "Vector.H"
00019 #include "REAL.H"
00020 #include "LSquares.H"
00021 #include "IndexTM.H"
00022 #include "Notation.H"
00023 #include "IFData.H"
00024
00025 #include "NamespaceHeader.H"
00026
00027 template <int dim> class CutCellMoments;
00028
00029 template <int dim> class LSProblem
00030 {
00031 typedef IndexTM<int,dim>IvDim;
00032 typedef map<IvDim,int > PthMomentLoc;
00033 typedef map<int,IvDim> LocPthMoment;
00034
00035 public:
00036
00037
00038 ~LSProblem();
00039
00040
00041 LSProblem(const int & a_degreeP,
00042 const bool & a_useConstraints);
00043
00044
00045 LSProblem(const int & a_orderAccuracy,
00046 const int & a_degreeP,
00047 const bool & a_useConstraints,
00048 const IndexTM<Real,dim> & a_normal);
00049
00050
00051 int invertNormalEq(const Vector<Real> & a_rhs,
00052 Vector<Real> & a_residual);
00053
00054
00055
00056 int getDegree()
00057 {
00058 return m_degreeP;
00059 }
00060
00061 int getOrderAccuracy()
00062 {
00063 return m_order;
00064 }
00065
00066 void getMatrix(Real ** a_matrix);
00067
00068 void getRhs(Vector<Real>& a_rhs);
00069
00070
00071 void getUnknowns(Vector<Real>& a_unknown);
00072
00073
00074 void monoMaxMin(Real & a_maxVal,
00075 Real & a_minVal,
00076 const IndexTM<int,dim> & a_mono,
00077 const IFData<dim> & a_IFData);
00078
00079 void computeBounds(const IndexTM<Real,dim> & a_dx,
00080 const CutCellMoments<dim> & a_ccm);
00081
00082 void print(ostream & a_out) const;
00083
00084 void outputMatrix() const;
00085 void outputRhs() const;
00086 void outputUnknowns() const;
00087 void outputBounds() const;
00088
00089 const LocPthMoment& getLocMonomialMapDegreeP() const
00090 {
00091 return (const LocPthMoment&)m_locMonoP;
00092 }
00093
00094 const PthMomentLoc& getMonomialLocMapDegreeP() const
00095 {
00096 return (const PthMomentLoc&)m_monoLocP;
00097 }
00098
00099 const PthMomentLoc& getMonomialLocMapDegreePLess1() const
00100 {
00101 return (const PthMomentLoc&)m_monoLocPLess1;
00102 }
00103
00104 Real getUnknown(int loc)
00105 {
00106 return m_unknowns[loc];
00107 }
00108
00109 int getNumberDegP()
00110 {
00111 return m_numP;
00112 }
00113
00114 int getNumberDegPLess1()
00115 {
00116 return m_numPLess1;
00117 }
00118
00119 int numActiveBounds() const
00120 {
00121 return m_numActiveBounds;
00122 }
00123
00124
00125
00126
00127 void setRhs(const Vector<Real>& a_rhs);
00128
00129
00130 void setMatrix();
00131
00132 void momentBounds(Real & a_lobnd,
00133 Real & a_hibnd,
00134 const IvDim & a_mono,
00135 const IFData<dim> & a_ifData);
00136
00137
00138 void differentiate(int & a_coeff,
00139 IvDim & a_Dmono,
00140 int & a_idir,
00141 const IvDim& a_mono);
00142
00143 int nChooseR(int a_n,
00144 int a_r);
00145
00146
00147 void fillMap(PthMomentLoc & a_monoLoc,
00148 LocPthMoment & a_locMono,
00149 const int & a_degree);
00150
00151
00152 int numMonomials(const int & a_monoDegree);
00153
00154 int factorial(const int & a_n,
00155 const int & a_m=0);
00156
00157
00158 void allocArray(const int & a_rows,
00159 const int & a_cols,
00160 Real** & a_A);
00161
00162 void freeArray(const int & a_rows,
00163 const int & a_cols,
00164 Real** & a_A);
00165
00166
00167 int m_order;
00168
00169
00170 int m_degreeP;
00171
00172
00173 int m_numActiveBounds;
00174
00175
00176 bool m_useConstraints;
00177
00178
00179 IndexTM<Real,dim> m_normal;
00180
00181
00182 PthMomentLoc m_monoLocP;
00183 LocPthMoment m_locMonoP;
00184
00185
00186 int m_numP;
00187
00188
00189 PthMomentLoc m_monoLocPLess1;
00190 LocPthMoment m_locMonoPLess1;
00191
00192
00193 int m_numPLess1;
00194
00195
00196
00197 Real** m_matrix;
00198 Vector<Real> m_unknowns;
00199 Vector<Real> m_rhs;
00200
00201 Vector<Real> m_lowerBound;
00202 Vector<Real> m_upperBound;
00203 };
00204
00205 template<>class LSProblem<1>
00206 {
00207 public:
00208
00209
00210 int m_numP;
00211
00212
00213 int m_numPLess1;
00214
00215
00216 Real m_pMoments;
00217
00218
00219 int m_ithMoment;
00220
00221
00222 ~LSProblem();
00223
00224
00225 LSProblem(const LSProblem<1> & a_lsProblem);
00226
00227
00228 LSProblem();
00229
00230
00231 int recursiveCount(const int & a_degreeP);
00232
00233 void setNumMonomials();
00234
00235
00236 void print(ostream & a_out)const;
00237
00238
00239 void operator=(const LSProblem & a_lSProblem);
00240 };
00241
00242 #include "NamespaceFooter.H"
00243
00244 #include "LSProblemImplem.H"
00245
00246 #endif