File: GaussLobatto.cpp

package info (click to toggle)
freefem3d 1.0pre10-2
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 24,816 kB
  • ctags: 8,361
  • sloc: cpp: 57,201; sh: 8,788; yacc: 2,975; makefile: 1,148; ansic: 508; perl: 110
file content (83 lines) | stat: -rw-r--r-- 2,337 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//  This file is part of ff3d - http://www.freefem.org/ff3d
//  Copyright (C) 2007 Driss Yakoubi

//  This program is free software; you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation; either version 2, or (at your option)
//  any later version.

//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.

//  You should have received a copy of the GNU General Public License
//  along with this program; if not, write to the Free Software Foundation,
//  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

//  $Id: GaussLobatto.cpp,v 1.2 2007/06/09 10:37:07 delpinux Exp $

#include <cmath>
#include <LegendreBasis.hpp>
#include <Interval.hpp>
#include <GaussLobatto.hpp>

void GaussLobatto::
__bisection(const Interval& interval,
	    real_t& root)
{
  LegendreBasis Ln(__degree);
  const real_t epsilon = 1e-10;

  real_t a = interval.a();
  real_t b = interval.b();

  do {
    root= 0.5*(a+b);
 
    if (Ln.getDerivativeValue(root,__degree)== 0) return;
    if (Ln.getDerivativeValue(root,__degree)*Ln.getDerivativeValue(a,__degree) <0) {
      b=root;
    } else {
      a=root;
    }
  } while (std:: abs(b-a) > epsilon );
}

GaussLobatto::
GaussLobatto(const size_t& degree,
	     const bool computeWeight)
  : __degree(degree),
    __vertices(degree+1),
    __weights(degree+1)
{   
  __vertices[0] = -1; 
  __vertices[degree] = 1;
  
  if (__degree!=1) {
    if (__degree==2) {
      Interval intervalRef(-1.,1.);
      __bisection(intervalRef,__vertices[1]);
    } else {
      Interval intervalRef(-1.,1.);
      GaussLobatto gaussN_1(__degree-1,false);   
          
      for (size_t i=1; i<__degree; ++i) {
	Interval interval( gaussN_1(i-1),gaussN_1(i));	
	__bisection(interval,__vertices[i]);
      }
    }
  }

  if (computeWeight) {

    const real_t w0= 2./(__degree*(__degree+1));
    __weights[0]= w0;
    __weights[__degree]=w0;

    LegendreBasis Ln(__degree);
    for (size_t i=1;i<__degree; ++i) {
      __weights[i]= w0 / (Ln.getValue(__vertices[i],__degree) * Ln.getValue(__vertices[i],__degree));
    }
  }
}