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 #ifdef __GNUG__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _chemistry_qc_basis_fjt_h
00033 #define _chemistry_qc_basis_fjt_h
00034
00035 #include <util/ref/ref.h>
00036
00037 namespace sc {
00038
00040 class Fjt: public RefCount {
00041 public:
00042 Fjt();
00043 ~Fjt();
00048 virtual double *values(int J, double T) =0;
00049 };
00050
00051 #define TAYLOR_INTERPOLATION_ORDER 6
00052 #define TAYLOR_INTERPOLATION_AND_RECURSION 0 // compute F_lmax(T) and then iterate down to F_0(T)? Else use interpolation only
00054 class Taylor_Fjt : public Fjt {
00055 static double relative_zero_;
00056 public:
00057 static const int max_interp_order = 8;
00058
00059 Taylor_Fjt(unsigned int jmax, double accuracy);
00060 ~Taylor_Fjt();
00062 double *values(int J, double T);
00063 private:
00064 double **grid_;
00065
00066
00067 double delT_;
00068 double oodelT_;
00069 double cutoff_;
00070 int interp_order_;
00071 int max_m_;
00072
00073 int max_T_;
00074
00075 double *T_crit_;
00076
00077
00078 double *F_;
00079
00080 class ExpensiveMath {
00081 public:
00082 ExpensiveMath(int ifac, int idf);
00083 ~ExpensiveMath();
00084 double *fac;
00085 double *df;
00086 };
00087 ExpensiveMath ExpMath_;
00088 };
00089
00092 class FJT: public Fjt {
00093 private:
00094 double **gtable;
00095
00096 int maxj;
00097 double *denomarray;
00098 double wval_infinity;
00099 int itable_infinity;
00100
00101 double *int_fjttable;
00102
00103 int ngtable() const { return maxj + 7; }
00104 public:
00105 FJT(int n);
00106 ~FJT();
00108 double *values(int J, double T);
00109 };
00110
00111 }
00112
00113 #endif // header guard
00114
00115
00116
00117
00118