Files Classes Functions Hierarchy
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
1.5.8