diff main.cpp @ 21:4c5bac1f2612

Testing Euler's method
author Jordi GutiƩrrez Hermoso <jordigh@gmail.com>
date Fri, 12 Sep 2008 11:13:18 -0500 (2008-09-12)
parents 9cd42f1be76e
children 532145a38fa2
line wrap: on
line diff
--- a/main.cpp
+++ b/main.cpp
@@ -1,4 +1,5 @@
 #include <iostream>
+#include <iomanip>
 #include <fstream>
 #include <map>
 #include <set>
@@ -18,7 +19,7 @@
 using namespace linalg;
 using namespace bvp;
 
-#define RBF_TYPE rbf::thin_plate_spline
+#define RBF_TYPE rbf::conical
 
 //Will solve the system
 //
@@ -35,6 +36,8 @@
 
 const double g = 9.8; // m/s^2
 
+const double pi = 3.141592653589793238462643383279502;
+
 template<typename RBF>
 class Fgen {
 public:
@@ -125,8 +128,8 @@
     
     //init the interps.
     using namespace rbf;
-    conical::set_n(5); thin_plate_spline::set_n(6); 
-    c_infty_rbf::set_epsilon(10);
+    conical::set_n(7); thin_plate_spline::set_n(6); 
+    c_infty_rbf::set_epsilon(0.01);
 
     cout << "Initialising... please wait." << endl;
 
@@ -143,27 +146,30 @@
     std::vector<interpolator<RBF_TYPE> >
       // FIXME: make the copy ctor for interps make different copies
       // of the bvp.
-      k1(3,h0), k2(3,h0), k3(3,h0), k4(3,h0); 
+      k1(3,u0), k2(3,u0), k3(3,u0), k4(3,u0); 
+
+    //debug
+    cout << "Size of interpolator is " << sizeof(k1[0]) << endl;
 
     Fu<RBF_TYPE> f_u;
     Fv<RBF_TYPE> f_v;
     Fh<RBF_TYPE> f_h;
 
     //Negative because of the way the F's below are written.
-    double dt = -0.01;
+    double dt = -0.0001;
 
     f_u.set_dt(dt);
     f_v.set_dt(dt);
     f_h.set_dt(dt);
 
     //main loop, timestepping with RK4.
-    size_t maxiter = 1000;
+    size_t maxiter = 5000;
     for(size_t i = 1; i <= maxiter; i++){ 
       cout << "Now on iteration #" << i << endl;
       if(i % 1 == 0){
-	save_interp(Omega,u0,i,"u");
-	save_interp(Omega,v0,i,"v");
-	save_interp(Omega,h0,i,"h");
+ 	save_interp(Omega,u0,i,"u");
+ 	save_interp(Omega,v0,i,"v");
+ 	save_interp(Omega,h0,i,"h");
       }
 
       //k1 
@@ -171,13 +177,21 @@
       f_v.set_interps(u0,v0,h0);
       f_h.set_interps(u0,v0,h0);
 
-      k1[0].interpolate(f_u.at());
-      k1[1].interpolate(f_v.at());
-      k1[2].interpolate(f_h.at());
+//       k1[0].interpolate(f_u.at());
+//       k1[1].interpolate(f_v.at());
+//       k1[2].interpolate(f_h.at());
+
+      //debug Euler
+      k1[0].interpolate(u0.at() + f_u.at());
+      k1[1].interpolate(v0.at() + f_v.at());
+      k1[2].interpolate(h0.at() + f_h.at());
 
       set_bdry_conds(k1[0],k1[1]);
       
       cout << "k1 done!" << endl;
+
+      //debug Euler
+      u0 = k1[0]; v0 = k1[1]; h0 = k1[2]; continue;
            
       //k2
       f_u.set_interps(u0+(k1[0]/2), v0+(k1[1]/2), h0+(k1[2]/2));
@@ -298,38 +312,49 @@
 {
   using namespace std;
   string filename = "results/" + which_interp;
-  if(n < 10000)
-    filename += "0";
-  if(n < 1000)
-    filename += "0";
-  if(n < 100)
-    filename += "0";
-  if(n < 10)
-    filename += "0";
   stringstream ss;
+  ss << std::setw(5) << setfill('0') << n;
   string n_string;
-  ss << n;
   ss >> n_string;
   filename += n_string + ".map";
-  ofstream ofs(filename.c_str());
+  ofstream ofs(filename.c_str());    
+  {
+    slice s(1,2);
+    matrix M(Omega -> get_interior().size() +
+	     Omega -> get_boundary().size(), 3);
+    size_t k = 1;
+    for(set<point>::const_iterator i = Omega -> get_interior().begin();
+	i != Omega -> get_interior().end(); i++){
+      M(k,s) = *i;
+      M(k,3) = u(*i);
+      k++;
+    }
+    for(set<point>::const_iterator i = Omega -> get_boundary().begin();
+	i != Omega -> get_boundary().end(); i++){
+      M(k,s) = *i;
+      M(k,3) = u(*i);
+      k++;
+    }
+    ofs << M;
+  }
 
-  slice s(1,2);
-  matrix M(Omega -> get_interior().size() +
-	   Omega -> get_boundary().size(), 3);
-  size_t k = 1;
-  for(set<point>::const_iterator i = Omega -> get_interior().begin();
-      i != Omega -> get_interior().end(); i++){
-    M(k,s) = *i;
-    M(k,3) = u(*i);
-    k++;
-  }
-  for(set<point>::const_iterator i = Omega -> get_boundary().begin();
-      i != Omega -> get_boundary().end(); i++){
-    M(k,s) = *i;
-    M(k,3) = u(*i);
-    k++;
-  }
-  ofs << M;
+
+  if(false){ //debug
+    double r, th, N, M;
+    N = 30; M  = 70;
+    linalg::matrix out(static_cast<size_t>(N),static_cast<size_t>(M));
+    size_t i,j;
+    for(r = 0, j=1;  j <= N; r += 1/(N-1),j++){
+      for(th = 0,i=1; i <= M; th += 2*pi/(M-1),i++){
+	linalg::vector p(2); 
+	p(1) = r*cos(th); 
+	p(2) = r*sin(th);
+	out(j,i) = u(p);
+      }
+    }
+  
+    ofs << out;
+  }//debug
 }