annotate main-Laplace.cpp @ 0:4fa56dc7e271

Initial commit
author jordi@Iris
date Fri, 27 Jun 2008 22:32:19 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
1 //Solves
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
2 //
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
3 // nabla^2 u = f on Omega
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
4 // u = g on dOmega
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
5 //
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
6 //Input data is read from interior.matrix and boundary.matrix
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
7 //files. Each row in interior.matrix corresponds to an interior
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
8 //point of Omega, and similarly for boundary.matrix. Although it's not
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
9 //used, also need a normal vector at each point of the boundary as
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
10 //given by normals.matrix
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
11
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
12 #include <iostream>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
13 #include <fstream>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
14 #include <list>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
15 #include <cmath>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
16
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
17 #include <boost/shared_ptr.hpp>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
18
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
19 #include "include/linalg.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
20 #include "include/error.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
21 #include "include/rbf.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
22 #include "include/diff_op.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
23 #include "include/bvp.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
24 #include "include/interpolator.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
25 #include "include/utils.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
26 #include "include/func.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
27
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
28 #define RBF_TYPE inverse_multiquadric //Replace by template later.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
29
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
30 using namespace std;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
31 using namespace linalg;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
32 using namespace rbf;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
33 using namespace bvp;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
34
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
35 //Some arbitrary interior function for Poisson equation (change to
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
36 //"return 0*p(1);", for example, for Laplace equation).
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
37 class intr_func : public realfunc{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
38 public:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
39 double at(const point& p) const{return 0*(p(1)+p(2));};
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
40 };
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
41
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
42 //Boundary function for Poisson equation
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
43 class bdry_func : public realfunc{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
44 public:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
45 //sin(theta)^3
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
46 double at(const point& p) const{return
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
47 std::pow(std::sin(std::atan2(p(1),p(2))),3);};
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
48 };
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
49
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
50 void output_result(const interpolator<RBF_TYPE>& u);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
51
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
52 int main(){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
53 using linalg::vector;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
54
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
55 try{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
56 gsl_set_error_handler(&error_handling::errorHandler);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
57
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
58 //Define the domain from given data
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
59 shared_ptr<domain> Omega(new domain("data/interior.matrix",
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
60 "data/boundary.matrix",
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
61 "data/normals.matrix"));
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
62
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
63 //Define the interior and boundary operators
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
64 shared_ptr<Laplacian> L(new Laplacian);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
65 shared_ptr<dirichlet_op> B(new dirichlet_op);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
66
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
67 //rhs of BVP
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
68 intr_func f;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
69 bdry_func g;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
70
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
71 //Define the Poisson boundary value problem.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
72 shared_ptr<linear_BVP2> Poisson_BVP (new linear_BVP2(Omega, L, B, f, g));
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
73
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
74 //Define interpolator and solve the BVP.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
75 interpolator<RBF_TYPE> u(Poisson_BVP);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
76
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
77 //Write result to file
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
78 output_result(u);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
79
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
80 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
81 catch(error& exc){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
82 utils::show_exception(exc);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
83 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
84
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
85 return 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
86 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
87
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
88 void output_result(const interpolator<RBF_TYPE>& u)
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
89 {
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
90 //Output result as a 41x41 meshgrid (to be plotted, say, with
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
91 //Octave; show_sol script included to work with this data).
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
92 matrix sol(41,41);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
93
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
94 double r, th;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
95 const double pi = atan(1)*4;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
96 point p(2);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
97 th = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
98 for(size_t i = 1; i <= 41; i++){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
99 r = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
100 for(size_t j = 1; j <= 41; j++){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
101 p(1) = r*cos(th);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
102 p(2) = r*sin(th);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
103 sol(i,j) = u(p); //Evaluate interpolator at point p
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
104 r += 1.0/40;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
105 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
106
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
107 th += 2.0*pi/40;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
108 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
109
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
110
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
111 ofstream ofs("data/sol.matrix");
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
112 ofs << sol;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
113 }