~njansson/dolfin/hpc

« back to all changes in this revision

Viewing changes to src/kernel/ode/dolfin/ODE.h

  • Committer: Anders Logg
  • Date: 2007-01-10 09:04:44 UTC
  • mfrom: (1689.1.221 trunk)
  • Revision ID: logg@simula.no-20070110090444-ecyux3n1qnei4i8h
RemoveĀ oldĀ head

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Copyright (C) 2003-2005 Johan Jansson and Anders Logg.
 
1
// Copyright (C) 2003-2006 Johan Jansson and Anders Logg.
2
2
// Licensed under the GNU GPL Version 2.
3
3
//
4
 
// First added:  2003
5
 
// Last changed: 2005-11-10
 
4
// First added:  2003-10-21
 
5
// Last changed: 2006-08-21
6
6
 
7
7
#ifndef __ODE_H
8
8
#define __ODE_H
9
9
 
10
10
#include <dolfin/constants.h>
11
11
#include <dolfin/Event.h>
 
12
#include <dolfin/uBlasVector.h>
 
13
#include <dolfin/uBlasSparseMatrix.h>
12
14
#include <dolfin/Dependencies.h>
13
15
#include <dolfin/Sample.h>
14
16
 
15
17
namespace dolfin
16
18
{
 
19
 
17
20
  /// A ODE represents an initial value problem of the form
18
21
  ///
19
22
  ///     u'(t) = f(u(t),t) on (0,T],
21
24
  ///     u(0)  = u0,
22
25
  ///
23
26
  /// where u(t) is a vector of length N.
 
27
  ///
 
28
  /// To define an ODE, a user must create a subclass of ODE and
 
29
  /// create the function u0() defining the initial condition, as well
 
30
  /// the function f() defining the right-hand side.
 
31
  ///
 
32
  /// DOLFIN provides two types of ODE solvers: a set of standard
 
33
  /// mono-adaptive solvers with equal adaptive time steps for all
 
34
  /// components as well as a set of multi-adaptive solvers with
 
35
  /// individual and adaptive time steps for the different
 
36
  /// components. The right-hand side f() is defined differently for
 
37
  /// the two sets of methods, with the multi-adaptive solvers
 
38
  /// requiring a component-wise evaluation of the right-hand
 
39
  /// side. Only one right-hand side function f() needs to be defined
 
40
  /// for use of any particular solver.
 
41
  ///
 
42
  /// It is also possible to solve implicit systems of the form
 
43
  ///
 
44
  ///     M(u(t), t) u'(t) = f(u(t),t) on (0,T],
 
45
  ///         
 
46
  ///     u(0)  = u0,
 
47
  ///
 
48
  /// by setting the option "implicit" to true and defining the
 
49
  /// function M().
24
50
 
25
51
  class ODE
26
52
  {
27
53
  public:
28
54
 
29
 
    /// Constructor
 
55
    /// Create an ODE of size N with final time T
30
56
    ODE(uint N, real T);
31
57
    
32
58
    /// Destructor
33
59
    virtual ~ODE();
34
60
 
35
 
    /// Return initial value for given component
36
 
    virtual real u0(uint i) = 0;
37
 
 
38
 
    /// Evaluate right-hand side (multi-adaptive version)
39
 
    // FIXME:: make this abstract?
40
 
    virtual real f(const real u[], real t, uint i);
41
 
 
42
 
    /// Evaluate right-hand side (mono-adaptive version)
43
 
    virtual void f(const real u[], real t, real y[]);
44
 
 
45
 
    /// Compute product y = Mx for implicit system
46
 
    virtual void M(const real x[], real y[], const real u[], real t);
47
 
 
48
 
    /// Compute product y = Jx for Jacobian J
49
 
    virtual void J(const real x[], real y[], const real u[], real t);
50
 
 
51
 
    /// Jacobian (optional)
52
 
    virtual real dfdu(const real u[], real t, uint i, uint j);
53
 
 
54
 
    /// Time step to use for whole system (optional)
 
61
    /// Set initial values
 
62
    virtual void u0(uBlasVector& u) = 0;
 
63
 
 
64
    /// Evaluate right-hand side y = f(u, t), mono-adaptive version (default, optional)
 
65
    virtual void f(const uBlasVector& u, real t, uBlasVector& y);
 
66
 
 
67
    /// Evaluate right-hand side f_i(u, t), multi-adaptive version (optional)
 
68
    virtual real f(const uBlasVector& u, real t, uint i);
 
69
 
 
70
    /// Compute product y = Mx for implicit system (optional)
 
71
    virtual void M(const uBlasVector& x, uBlasVector& y, const uBlasVector& u, real t);
 
72
 
 
73
    /// Compute product y = Jx for Jacobian J (optional)
 
74
    virtual void J(const uBlasVector& x, uBlasVector& y, const uBlasVector& u, real t);
 
75
 
 
76
    /// Compute entry of Jacobian (optional)
 
77
    virtual real dfdu(const uBlasVector& u, real t, uint i, uint j);
 
78
 
 
79
    /// Time step to use for the whole system at a given time t (optional)
55
80
    virtual real timestep(real t, real k0) const;
56
81
    
57
 
    /// Time step to use for given component (optional)
 
82
    /// Time step to use for a given component at a given time t (optional)
58
83
    virtual real timestep(real t, uint i, real k0) const;
59
84
 
60
85
    /// Update ODE, return false to stop (optional)
61
 
    virtual bool update(const real u[], real t, bool end);
 
86
    virtual bool update(const uBlasVector& u, real t, bool end);
62
87
 
63
88
    /// Save sample (optional)
64
89
    virtual void save(Sample& sample);
65
90
 
66
 
    /// Number of components N
 
91
    /// Automatically detect sparsity (optional)
 
92
    void sparse();
 
93
 
 
94
    /// Compute sparsity from given matrix (optional)
 
95
    void sparse(const uBlasSparseMatrix& A);
 
96
 
 
97
    /// Return number of components N
67
98
    uint size() const;
68
99
 
69
 
    /// End time (final time)
 
100
    /// Return end time (final time T)
70
101
    real endtime() const;
71
102
 
72
103
    /// Solve ODE
73
104
    void solve();
74
105
 
75
 
    /// Automatically detect sparsity
76
 
    void sparse();
77
 
 
78
 
    /// Compute sparsity from given matrix
79
 
    void sparse(const Matrix& A);
80
 
 
81
106
    /// Friends
82
107
    friend class Dual;
83
108
    friend class RHS;
87
112
    friend class MonoAdaptiveJacobian;
88
113
    friend class MultiAdaptiveTimeSlab;
89
114
    friend class MultiAdaptiveJacobian;
 
115
    friend class MultiAdaptivity;
90
116
    friend class NewMultiAdaptiveJacobian;
91
117
    friend class MultiAdaptivePreconditioner;
92
118
    friend class ReducedModel;
111
137
 
112
138
  private:
113
139
 
114
 
    // Temporary array
115
 
    real* tmp;
 
140
    // Temporary vector used for computing Jacobian
 
141
    uBlasVector tmp;
116
142
 
117
143
    // Events
118
144
    Event not_impl_f;