1
// Copyright (C) 2003-2005 Anders Logg.
2
// Licensed under the GNU LGPL Version 2.1.
4
// Modified by Garth N. Wells, 2006.
7
// Last changed: 2006-03-27
9
#include <dolfin/dolfin_log.h>
10
#include <dolfin/dolfin_math.h>
11
#include <dolfin/Lagrange.h>
12
#include <dolfin/Method.h>
14
using namespace dolfin;
16
//-----------------------------------------------------------------------------
17
Method::Method(unsigned int q, unsigned int nq, unsigned int nn)
19
dolfin_assert(nq > 0);
20
dolfin_assert(nn > 0);
26
// Allocate quadrature points
27
qpoints = new real[nq];
28
for (unsigned int i = 0; i < nq; i++)
31
// Allocate nodal points
32
npoints = new real[nn];
33
for (unsigned int i = 0; i < nn; i++)
36
// Allocate quadrature weights
37
qweights = new real[nq];
38
for (unsigned int i = 0; i < nq; i++)
42
nweights = new real*[nn];
43
for (unsigned int i = 0; i < nn; i++)
45
nweights[i] = new real[nq];
46
for (unsigned int j = 0; j < nq; j++)
50
// Allocate derivatives
51
derivatives = new real[nq];
52
for (unsigned int i = 0; i < nq; i++)
60
//-----------------------------------------------------------------------------
63
if ( qpoints ) delete [] qpoints;
64
if ( npoints ) delete [] npoints;
65
if ( qweights ) delete [] qweights;
69
for (unsigned int i = 0; i < nn; i++)
70
delete [] nweights[i];
74
if ( derivatives ) delete [] derivatives;
76
if ( trial ) delete trial;
77
if ( test ) delete test;
79
//-----------------------------------------------------------------------------
87
//-----------------------------------------------------------------------------
88
void Method::update(real x0, real f[], real k, real values[]) const
91
for (uint i = 0; i < nn; i++)
94
for (uint j = 0; j < nq; j++)
95
sum += nweights[i][j] * f[j];
96
values[i] = x0 + k*sum;
99
//-----------------------------------------------------------------------------
100
void Method::update(real x0, real f[], real k, real values[], real alpha) const
103
for (uint i = 0; i < nn; i++)
106
for (uint j = 0; j < nq; j++)
107
sum += nweights[i][j] * f[j];
108
values[i] += alpha*(x0 + k*sum - values[i]);
111
//-----------------------------------------------------------------------------
112
void Method::computeDerivatives()
114
for (unsigned int i = 0; i < nq; i++)
115
derivatives[i] = trial->ddx(i, 1.0);
117
//-----------------------------------------------------------------------------