proj home

Files   Classes   Functions   Hierarchy  

desys.h

Go to the documentation of this file.
00001 #ifndef DESYS_H
00002 #define DESYS_H
00003 
00004 #include <cassert>
00005 #include <iostream>
00006 using namespace std;
00007 
00008 #include <print.h>
00009 
00092 template< typename NINT, typename T >
00093 class desys
00094 {
00095   void cleanup();
00096   desys()
00097     { assert(false); }
00098 public:
00099 
00101   uint dim;
00103   uint order;
00104 
00106   T * dy;
00107 
00109   T xval;
00111   T * yi;
00112 
00114   T & yiGet(uintc i, uintc k)
00115     { assert(i<dim); assert(k<order); return yi[k+i*order]; }
00116 
00118   T const yiGet(uintc i, uintc k) const
00119     { assert(i<dim); assert(k<order); return yi[k+i*order]; }
00120 
00122   NINT integrator;
00123 
00125   T hstep;
00126 
00128   desys(uintc dim_, uintc order_);
00129 
00131   ~desys();
00132 
00134   void eval();
00135 
00137   ostream & print(ostream & os) const;
00138 };
00139 
00140 
00141 template< typename NINT, typename T >
00142 ostream & operator << (ostream & os, desys<NINT,T> const & x)
00143   { return x.print(os); }
00144 
00145 //---------------------------------------------------
00146 //  Implementation
00147 
00148 
00149 template< typename NINT, typename T >
00150 ostream & desys<NINT,T>::print(ostream & os) const
00151 {
00152   os << "dim=" << dim << endl;
00153   os << "order=" << order << endl;
00154   os << "hstep=" << hstep << endl;
00155   os << "xval=" << xval << endl;
00156   os << "(y0, y0', ...)" << endl;
00157   os << "(y1, y1', ...)" << endl;
00158   os << "=" << endl;
00159 
00160   os << "yi" << endl;
00161   for (uint i=0; i<dim; ++i)
00162   {
00163     os << "[" << i << "]: ";
00164     for (uint k=0; k<order; ++k)
00165       os << yi[i*order+k] << " ";
00166     os << endl;
00167   }
00168  
00169   return os;
00170 }
00171 
00172 
00173 template< typename NINT, typename T >
00174 desys<NINT,T>::~desys()
00175 {
00176   delete[] dy;
00177   delete[] yi;
00178 }
00179 
00180 template< typename NINT, typename T >
00181 desys<NINT,T>::desys(uintc dim_, uintc order_)
00182   : dim(dim_), order(order_), dy(new T[dim]),
00183     yi(new T[order*dim]), integrator(&xval,yi) 
00184 {
00185   assert(dim>0);
00186   assert(order>0);
00187   xval=0.0;
00188 }
00189 
00190 
00191 template< typename NINT, typename T >
00192 void desys<NINT,T>::eval()
00193 {
00194   uint c;
00195   assert(hstep!=0);
00196   for (uint i=0; i<dim; ++i )
00197   {
00198     c = i*order+order-1;
00199 
00200 //cout << SHOW(xval) << endl;
00201 
00202 //cout << SHOW(order) << endl;
00203 //cout << SHOW(c) << endl;
00204 //cout << SHOW(order+c) << endl;
00205 //cout << SHOW(i*(order+1)) << endl;
00206 //cout << SHOW(yi[c]) << endl;
00207     integrator.eval(dy[i],hstep,yi[c],xval); 
00208 //print(cout); cout << endl;
00210     yi[c] += dy[i];
00211 //cout << SHOW(yi[c]) << endl;
00212 //cout << SHOW(yi[order-1+c]) << endl;
00213 //cout << "*";
00214 //print(cout); cout << endl;
00215 
00216     ++integrator.yDorder;
00217   }
00218   xval += hstep;
00219 
00220   if (order<=1)
00221     return;
00222     
00223   for (uint i=0; i<dim; ++i )
00224   {
00225     c = i*order + order;
00226 
00227     for (uint k=2; k<=order; ++k ) 
00228       yi[c-k] += yi[c-k+1]*hstep;
00229   }
00230 }
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 #endif
00240 
00241 

Generated on Fri Mar 4 00:49:29 2011 for Chelton Evans Source by  doxygen 1.5.8