dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #16356
Re: [Bug 457262] [NEW] function and expression does not give the same result
Garth Wells wrote:
> logg wrote:
>> On Wed, Oct 21, 2009 at 04:31:12PM -0000, Garth Wells wrote:
>>> oelgaard wrote:
>>>> Quoting Garth Wells <gnw20@xxxxxxxxx>:
>>>>
>>>>> oelgaard wrote:
>>>>>> Public bug reported:
>>>>>>
>>>>>> The following two files will reproduce the bug.
>>>>>>
>>>>>> M.ufl:
>>>>>>
>>>>>> exact = FiniteElement("Lagrange", triangle, 6)
>>>>>> approx = FiniteElement("Lagrange", triangle, 1)
>>>>>>
>>>>>> u = Function(exact)
>>>>>> uh = Function(approx)
>>>>>>
>>>>>> M = (uh - u)*(uh - u)*dx
>>>>>>
>>>>>>
>>>>>> main.cpp:
>>>>>>
>>>>>> #include <dolfin.h>
>>>>>> #include "M.h"
>>>>>>
>>>>>> using namespace dolfin;
>>>>>>
>>>>>> class Expr : public Expression
>>>>>> {
>>>>>> public:
>>>>>>
>>>>>> Expr() : Expression(2) {}
>>>>>>
>>>>>> void eval(double* values, const double* x) const
>>>>>> {
>>>>>> values[0] = 10*x[0]*x[1];
>>>>>> }
>>>>>>
>>>>>> };
>>>>>>
>>>>>> class Expr2 : public Expression
>>>>>> {
>>>>>> public:
>>>>>>
>>>>>> Expr2() : Expression(2) {}
>>>>>>
>>>>>> void eval(double* values, const double* x) const
>>>>>> {
>>>>>> values[0] = sin(5*x[0]);
>>>>>> }
>>>>>> };
>>>>>>
>>>>>> class Func2 : public Function
>>>>>> {
>>>>>> public:
>>>>>>
>>>>>> Func2(FunctionSpace& v) : Function(v) {}
>>>>>>
>>>>>> void eval(double* values, const double* x) const
>>>>>> {
>>>>>> values[0] = sin(5*x[0]);
>>>>>> }
>>>>>> };
>>>>>>
>>>>> The above class shouldn't be possible with the development version of
>>>>> DOLFIN. Are you using an older version?
>>>> Yes:
>>>>
>>>> changeset: 7392:70596970a173
>>>> tag: tip
>>>> user: Anders Logg <logg@xxxxxxxxx>
>>>> date: Wed Oct 21 17:34:32 2009 +0200
>>>> summary: Attempt at bug fix in application of periodic boundary conditions
>>>> on
>>>>
>>>>
>>>> Why shouldn't it be possible to derive a class from Function?
>>>>
>>> In the new design, Function is strictly a finite element function, and
>>> not a user-defined function. We may need to fix something to make it
>>> impossible to create a Function with a user-provided eval(..).
>>> Expression should be used instead.
>> I don't see how to do this. The eval function is virtual so there's
>> nothing "wrong" with overloading it.
>>
>> Unless there's some trick we can do with making it private or
>> protected in Function.
>>
>
> It should be made private.
>
Actually, that won't work so it's up to the user to use Function
correctly. The Function eval functions are not virtual, so that should
be a hint.
Garth
> Garth
>
>> --
>> Anders
>>
>>
>>>>>> Status: New
>>>>>>
>>>>> Status in DOLFIN: New
>>>>>
>>>>> Bug description:
>>>>> The following two files will reproduce the bug.
>>>>>
>>>>> M.ufl:
>>>>>
>>>>> exact = FiniteElement("Lagrange", triangle, 6)
>>>>> approx = FiniteElement("Lagrange", triangle, 1)
>>>>>
>>>>> u = Function(exact)
>>>>> uh = Function(approx)
>>>>>
>>>>> M = (uh - u)*(uh - u)*dx
>>>>>
>>>>>
>>>>> main.cpp:
>>>>>
>>>>> #include <dolfin.h>
>>>>> #include "M.h"
>>>>>
>>>>> using namespace dolfin;
>>>>>
>>>>> class Expr : public Expression
>>>>> {
>>>>> public:
>>>>>
>>>>> Expr() : Expression(2) {}
>>>>>
>>>>> void eval(double* values, const double* x) const
>>>>> {
>>>>> values[0] = 10*x[0]*x[1];
>>>>> }
>>>>>
>>>>> };
>>>>>
>>>>> class Expr2 : public Expression
>>>>> {
>>>>> public:
>>>>>
>>>>> Expr2() : Expression(2) {}
>>>>>
>>>>> void eval(double* values, const double* x) const
>>>>> {
>>>>> values[0] = sin(5*x[0]);
>>>>> }
>>>>> };
>>>>>
>>>>> class Func2 : public Function
>>>>> {
>>>>> public:
>>>>>
>>>>> Func2(FunctionSpace& v) : Function(v) {}
>>>>>
>>>>> void eval(double* values, const double* x) const
>>>>> {
>>>>> values[0] = sin(5*x[0]);
>>>>> }
>>>>> };
>>>>>
>>>>> int main()
>>>>> {
>>>>> // Create mesh and function space
>>>>> UnitSquare mesh(8, 8);
>>>>> M::CoefficientSpace_u Vu(mesh);
>>>>> M::CoefficientSpace_uh Vuh(mesh);
>>>>>
>>>>> Expr exact;
>>>>> // Expr2 approx; // 12.5251
>>>>> // Func2 approx(Vuh); // 11.1111
>>>>> Func2 approx(Vu); // 11.1111
>>>>>
>>>>> M::Functional m(mesh);
>>>>> m.u = exact;
>>>>> m.uh = approx;
>>>>>
>>>>> double error = assemble(m);
>>>>>
>>>>> std::cout << "error: " << error << std::endl;
>>>>>
>>>>> return 0;
>>>>> }
>>>>>
>
--
function and expression does not give the same result
https://bugs.launchpad.net/bugs/457262
You received this bug notification because you are subscribed to DOLFIN.
Status in DOLFIN: New
Bug description:
The following two files will reproduce the bug.
M.ufl:
exact = FiniteElement("Lagrange", triangle, 6)
approx = FiniteElement("Lagrange", triangle, 1)
u = Function(exact)
uh = Function(approx)
M = (uh - u)*(uh - u)*dx
main.cpp:
#include <dolfin.h>
#include "M.h"
using namespace dolfin;
class Expr : public Expression
{
public:
Expr() : Expression(2) {}
void eval(double* values, const double* x) const
{
values[0] = 10*x[0]*x[1];
}
};
class Expr2 : public Expression
{
public:
Expr2() : Expression(2) {}
void eval(double* values, const double* x) const
{
values[0] = sin(5*x[0]);
}
};
class Func2 : public Function
{
public:
Func2(FunctionSpace& v) : Function(v) {}
void eval(double* values, const double* x) const
{
values[0] = sin(5*x[0]);
}
};
int main()
{
// Create mesh and function space
UnitSquare mesh(8, 8);
M::CoefficientSpace_u Vu(mesh);
M::CoefficientSpace_uh Vuh(mesh);
Expr exact;
// Expr2 approx; // 12.5251
// Func2 approx(Vuh); // 11.1111
Func2 approx(Vu); // 11.1111
M::Functional m(mesh);
m.u = exact;
m.uh = approx;
double error = assemble(m);
std::cout << "error: " << error << std::endl;
return 0;
}
References