00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #if !defined(BURGERS_SOLVER_HPP)
00013 #define BURGERS_SOLVER_HPP
00014
00015 #include "gstepper.hpp"
00016 #include "cg.hpp"
00017 #include "gtlist.hpp"
00018 #include "gttlist.hpp"
00019 #include "glinoplist.hpp"
00020 #include "gobjlist.hpp"
00021 #include "gelemlist.hpp"
00022 #include "gfieldlist.hpp"
00023 #include "helmholtzop.hpp"
00024 #include "gadvect.hpp"
00025 #include "massop.hpp"
00026 #include "vectorop.hpp"
00027 #include "ntree_adapt.hpp"
00028 #include "ab.hpp"
00029 #include "ext.hpp"
00030 #include "evforce.hpp"
00031
00032
00033 class BurgersSolver : public GStepper
00034 {
00035 public:
00036 enum TIME_EVOLTYPE {TE_OIFS=0, TE_ABBDF, TE_EXBDF, TE_EXBDF_Weak};
00037
00038
00039 BurgersSolver(GElemList *elems);
00040 BurgersSolver(GElemList *elems, GFieldList *ulist[], GINT nlist,
00041 GFieldList **cadv, GINT *iadv, GINT nadv);
00042 ~BurgersSolver();
00043
00044 GBOOL Step(GDOUBLE dt);
00045 GDOUBLE GetIntegTime();
00046 CG *GetSolver(GINT idir);
00047 LinOp *GetPreconditioner(GINT idir, GINT eid);
00048 GINT GetNumIterations(GINT idir);
00049 GINT GetErrorType(GINT idir);
00050 GDOUBLE GetError(GINT idir);
00051 GDOUBLE GetMinError(GINT idir);
00052 GDOUBLE GetMaxError(GINT idir);
00053
00054
00055 void SetFilter(GLinOpList *filter);
00056 void SetElemList(GElemList *elems);
00057 void SetEvolType(TIME_EVOLTYPE itype);
00058 void SetTime(GDOUBLE time);
00059 void SetNSubcycles(GINT nsub);
00060
00061 GBOOL SetFields(GFieldList *ulist[], GINT nfields,
00062 GFieldList **cadv, GINT ncadv,
00063 GINT *iadv, GINT nadv);
00064 void SetPreconditioner(GPC itype);
00065 void SetAdvectDim(GINT nto);
00066 void SetComm(GS *ggs);
00067 GCHandle SetCommHandle(GCHandle hIn) ;
00068 void SetVisc(const GDOUBLE nu, const GINT idir=0);
00069 void SetAdvOrder(GINT iorder);
00070 void SetAMOrder(GINT iorder_ab);
00071 void SetBDFOrder(GINT iorder);
00072 void SetVBdyData (GINT idir, GVecList *bdy_vals);
00073 void SetDoAdvection(GBOOL bDoAdv);
00074 void SetTimestepHistory(GDBuffer *dthist);
00075
00076 private:
00077
00078 GBOOL DoNormalStep(GDOUBLE dt);
00079
00080 GBOOL DoDiffusion(GDOUBLE dt, const GINT tmpLevel);
00081
00082
00083 GBOOL ResetExpandables(GFieldList *u1[], GINT nf);
00084 GBOOL CreateCompDynamic(GINT ncomps);
00085 GBOOL CreateAdvDynamic(GINT nadv);
00086 void DeleteDynamic();
00087 GBOOL Advect(GDOUBLE dt, GINT &iLevel);
00088
00089
00090 GBOOL DoForcing (GDOUBLE dt, GSHORT iLevel);
00091
00092 GBOOL InitPrecond();
00093 void UpdatePrecond(GDOUBLE dt);
00094 void UpdateSolver();
00095 void ResetErrors();
00096 void BuildCoeffs();
00097 GBOOL ElemListChange();
00098 GBOOL DoFilter();
00099
00100
00101 GCHandle hDSOp;
00102 TIME_EVOLTYPE itime_type_;
00103 SI_FORCE_TYPE isiforce_type_;
00104 GPC *upc_type_;
00105 GBOOL bConstAdvVel_;
00106 GBOOL bPrecond_;
00107 GBOOL bDoAdvection_;
00108 GBOOL bInitReqd_;
00109 GBOOL bDoDiffusion_;
00110 GINT nfields_;
00111 GINT nadv_;
00112 GINT *iadv_;
00113 GINT nelems_;
00114 GINT iorderadv_;
00115 GINT iorderbdf_;
00116 GINT ntimelevels_;
00117 GINT iorderam_;
00118 GINT icycle_;
00119 GDOUBLE maxCFL_;
00120 GDOUBLE dtlast_;
00121 GDOUBLE time_;
00122 GDOUBLE *nu_ ;
00123 GDOUBLE Lcoeff_[GDIM];
00124 GDOUBLE Mcoeff_;
00125 GDOUBLE *mu_;
00126 GDOUBLE gamma0_;
00127 GDOUBLE c_am [4][4];
00128 GFieldList **u_list_;
00129 GVecList **ubdyvals_;
00130 GVecList *up_;
00131 GVecList *up_rhs_;
00132 GVecList *Nj_;
00133 GVecList Hdiag_;
00134 GVecList uadv_[3];
00135 GFieldList *cadv_[3];
00136 GElemList *gelems_;
00137 GAdvect *advect_;
00138
00139
00140 GINT *niter_ ;
00141 GINT *ierror_ ;
00142 GDOUBLE *error_ ;
00143 GDOUBLE *min_error_;
00144 GDOUBLE *max_error_;
00145
00146
00147 CG **cgu_;
00148
00149
00150 GLinOpList M_;
00151 GLinOpList H_;
00152 GLinOpList *upc_;
00153 GVecOpList vecop_;
00154 GLinOpList *filter_;
00155
00156
00157 GS *gsop;
00158 };
00159
00160 #endif