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
00024 #include "NamespaceHeader.H"
00025
00026 template <int dim> class CutCellMoments;
00027
00028 template <int dim> class LSProblem
00029 {
00030 typedef IndexTM<int,dim>IvDim;
00031 typedef map<IvDim,int,LexLT <IvDim> > PthMomentLoc;
00032 typedef map<int,IvDim> LocPthMoment;
00033
00034 public:
00035
00036
00037 ~LSProblem();
00038
00039
00040 LSProblem(const int & a_degreeP,
00041 const bool & a_useConstraints);
00042
00043
00044 LSProblem(const int & a_orderAccuracy,
00045 const int & a_degreeP,
00046 const bool & a_useConstraints,
00047 const IndexTM<Real,dim> & a_normal);
00048
00049
00050 void invertNormalEq(const Vector<Real>& a_rhs,Vector<Real>& a_residual);
00051
00052
00053 int getDegree(){ return m_degreeP; }
00054 int getOrderAccuracy(){ return m_order;}
00055
00056 void getMatrix(Real ** a_matrix);
00057 void getRhs(Vector<Real>& a_rhs);
00058
00059
00060 void getUnknowns(Vector<Real>& a_unknown);
00061
00062
00063 void computeBounds(const IndexTM<Real,dim> & a_dx,
00064 const CutCellMoments<dim> & a_ccm);
00065
00066
00067
00068
00069 void print(ostream& out) const;
00070
00071 void outputMatrix()const;
00072 void outputRhs()const;
00073 void outputUnknowns()const;
00074
00075 const LocPthMoment& getLocMonomialMapDegreeP()const{return (const LocPthMoment&)m_locMonoP;}
00076 const PthMomentLoc& getMonomialLocMapDegreeP()const{return (const PthMomentLoc&)m_monoLocP;}
00077 const PthMomentLoc& getMonomialLocMapDegreePLess1()const{ return (const PthMomentLoc&)m_monoLocPLess1;}
00078 Real getUnknown(int loc){ return m_unknowns[loc]; }
00079 int getNumberDegP(){return m_numP;}
00080 int getNumberDegPLess1(){return m_numPLess1;}
00081
00082
00083 private:
00084 void setRhs(const Vector<Real>& a_rhs);
00085
00086
00087 void setMatrix();
00088
00089
00090
00091 void momentBounds(Real & lobnd,
00092 Real & hibnd,
00093 const IvDim & mono,
00094 const IndexTM<Real,dim>& a_dx);
00095
00096
00097
00098
00099
00100
00101 void differentiate(int & a_coeff,
00102 IvDim & a_Dmono,
00103 int & a_idir,
00104 const IvDim& a_mono);
00105
00106
00107
00108 int nChooseR(int n, int r);
00109
00110
00111 void fillMap(PthMomentLoc& m_monoLoc,
00112 LocPthMoment& m_locMono,
00113 const int& a_degree);
00114
00115
00116 int numMonomials(const int& a_monoDegree);
00117 int factorial(const int& a_n,const int &a_m=0);
00118
00119
00120 void allocArray(const int& rows,
00121 const int& cols,
00122 Real**& A);
00123
00124 void freeArray(const int& rows,
00125 const int& cols,
00126 Real**& A);
00127
00128
00129
00130 int m_order;
00131
00132
00133 int m_degreeP;
00134
00135
00136 bool m_useConstraints;
00137
00138
00139 IndexTM<Real,dim>m_normal;
00140
00141
00142 PthMomentLoc m_monoLocP;
00143 LocPthMoment m_locMonoP;
00144
00145 int m_numP;
00146
00147
00148 PthMomentLoc m_monoLocPLess1;
00149 LocPthMoment m_locMonoPLess1;
00150
00151 int m_numPLess1;
00152
00153
00154 Real** m_matrix;
00155 Vector<Real> m_unknowns;
00156 Vector<Real> m_rhs;
00157
00158
00159
00160 Real * m_constraintVec;
00161 Real ** m_constraintMat;
00162 int m_nInequality;
00163
00164 };
00165
00166 template<>class LSProblem<1>
00167 {
00168 public:
00169
00170
00171 int m_numP;
00172
00173
00174 int m_numPLess1;
00175
00176
00177 Real m_pMoments;
00178
00179
00180 int m_ithMoment;
00181
00182
00183
00184
00185 ~LSProblem();
00186
00187
00188 LSProblem(const LSProblem<1>& a_lsProblem);
00189
00190
00191
00192 LSProblem();
00193
00194
00195 int recursiveCount(const int& a_degreeP);
00196
00197 void setNumMonomials();
00198
00199
00200 void print(ostream& a_out)const;
00201
00202
00203 void operator = (const LSProblem & a_lSProblem);
00204
00205 };
00206
00207 #include "NamespaceFooter.H"
00208
00209 #include "LSProblemImplem.H"
00210
00211 #endif