00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef O2SCL_TPTR_GEOSERIES_H
00024 #define O2SCL_TPTR_GEOSERIES_H
00025
00026 #include <iostream>
00027 #include <o2scl/collection.h>
00028 #include <o2scl/tptr_schedule.h>
00029
00030 #ifndef DOXYGENP
00031 namespace o2scl {
00032 #endif
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 template<class vec_t=ovector_view>
00049 class tptr_geoseries : public tptr_schedule<vec_t> {
00050 public:
00051
00052 tptr_geoseries() {
00053 dstart=1.0;
00054 end=1.0e-2;
00055 ratio=1.01;
00056 last=dstart*ratio;
00057 }
00058
00059 virtual ~tptr_geoseries() {}
00060
00061
00062 int set_series(double udstart, double uend, double uratio) {
00063 if ((udstart>uend && uratio<1.0) || (udstart<uend && uratio>1.0)) {
00064 set_err_ret("Series will never end in tptr_geoseries::set_series()",
00065 gsl_einval);
00066 }
00067 dstart=udstart;
00068 end=uend;
00069 ratio=uratio;
00070 last=dstart*ratio;
00071 return 0;
00072 }
00073
00074
00075 int get_npoints() {
00076 double n=log(dstart/end*sqrt(ratio))/log(ratio);
00077 return ((int)n)+1;
00078 }
00079
00080 virtual double start(double min, int nv, const vec_t &best, void *vp) {
00081 last=dstart;
00082 return last;
00083 }
00084
00085 virtual double next(double min, int nv, const vec_t &best, void *vp) {
00086 last=last/ratio;
00087 return last;
00088 }
00089
00090 virtual bool done(double min, int nv, const vec_t &best, void *vp) {
00091 if (last<end/sqrt(ratio)) return true;
00092 return false;
00093 }
00094
00095
00096 virtual const char *type() { return "tptr_geoseries"; }
00097
00098 protected:
00099
00100 #ifndef DOXYGEN_INTERNAL
00101
00102
00103
00104 double dstart, end, ratio;
00105
00106
00107
00108 double last;
00109
00110 #endif
00111
00112 };
00113
00114 #ifndef DOXYGENP
00115 }
00116 #endif
00117
00118 #endif
00119