view src/main-ddm-diff-adv.cpp @ 34:7f31f9e2d196

Rename kwantxi to kwantix
author Jordi Gutiérrez Hermoso <jordigh@gmail.com>
date Thu, 04 Feb 2010 21:55:30 -0600
parents d22bce6382d7
children
line wrap: on
line source

#include <iostream>
#include <fstream>
#include <set>
#include <boost/shared_ptr.hpp>
#include "include/linalg.hpp"
#include "include/rbf.hpp"
#include "include/bvp.hpp"
#include "include/error.hpp"
#include "include/utils.hpp"
#include "include/diff_op.hpp"
#include "include/ddm.hpp"
#include "include/func.hpp"

using namespace kwantix;

class conv_diff : public linear_diff_op2{
public:
  conv_diff(double u_in) : u(u_in) {} ;
  double at(const realfunc& f, const point &p) const;
private:
  Laplacian L;
  del1 D;
  double u;
};

double conv_diff::at(const realfunc& f, const point &p) const{
  return L.at(f,p) - u*D.at(f,p);
}

class bdry_conv_diff : public bdry_diff_op{
public:
  double at(const realfunc& f, const point &p) const{
    f(p);
    throw "this function shouldn't be called";
  };
  double at(const realfunc& f, const point &p, 
	    const vector &n) const{
    if(p(1) == 0 or p(1) == 1)
      return D(f,p,n);
    else
      return N(f,p,n);
  };
private:
  neumann_op N;
  dirichlet_op D;
};

double f(const kwantix::point& p){
  p.size();
  return 0;
}

double g(const kwantix::point& p){
  if(p(1) == 0)
    return 1;
  if(p(1) == 1)
    return 2;
  return 0;  
}

using boost::shared_ptr;

int main(){
  
  gsl_set_error_handler(&kwantix::errorHandler);

  try{
    using namespace std;
    using kwantix::vector;
    shared_ptr<domain> 
      Omega(new domain("data/intr.v", "data/bdry.v", "data/nrml.v"));

    shared_ptr<overlapping_domain>
      O1(new overlapping_domain("data/intr1.v", 
				"data/bdry1.v", "data/nrml1.v")),
      O2(new overlapping_domain("data/intr2.v", 
				"data/bdry2.v", "data/nrml2.v")),
      O3(new overlapping_domain( "data/intr3.v", 
				 "data/bdry3.v","data/nrml3.v")),
      O4(new overlapping_domain("data/intr4.v", 
				"data/bdry4.v", "data/nrml4.v"));
    set<shared_ptr<overlapping_domain> > dd;
    dd.insert(O1);
    dd.insert(O2);
    dd.insert(O3);
    dd.insert(O4);
    set_overlapper_info(dd);
    
    shared_ptr<conv_diff> L(new conv_diff(10));
    shared_ptr<bdry_conv_diff> B(new bdry_conv_diff);
    shared_ptr<linear_BVP2> thebvp (new linear_BVP2(Omega,L,B,f,g));
    
    set<shared_ptr<const domain> > dd_in;
    dd_in.insert(O1);
    dd_in.insert(O2);
    dd_in.insert(O3);
    dd_in.insert(O4);

    piecewise_polynomial::set_n(7);
    thin_plate_spline::set_n(8);
    c_infty_kwantix::set_epsilon(7.234);

    additive_schwarz_ddm<thin_plate_spline> solver(dd_in, thebvp);
    
    matrix out(Omega->get_interior().size() + Omega ->get_boundary().size(),
	       3);
    slice s(2,3);
    
    size_t i = 1;
    set<point>::iterator I;
    for(I = Omega -> get_interior().begin(); I != Omega->get_interior().end();
	I++){
      out(i,1) = solver(*I);
      out(i,s) = *I;
      i++;
    }
    for(I = Omega -> get_boundary().begin(); I != Omega->get_boundary().end();
	I++){
      out(i,1) = solver(*I);
      out(i,s) = *I;
      i++;
    }

    matrix::set_precision(30);
    ofstream ofs("results/result.matrix");
    ofs << out;
    ofs.close();

    return 0;
    
  }
  catch(error exc){
    kwantix::show_exception(exc);
  }
  return 0;
}