2009/2/18 Anders Logg <[email protected]>: > On Wed, Feb 18, 2009 at 04:48:00PM +0000, A Navaei wrote: >> 2009/2/18 Anders Logg <[email protected]>: >> > On Wed, Feb 18, 2009 at 02:04:35PM +0000, A Navaei wrote: >> >> 2009/2/17 Anders Logg <[email protected]>: >> >> > On Tue, Feb 17, 2009 at 03:28:08PM +0000, Garth N. Wells wrote: >> >> >> >> >> >> >> >> >> A Navaei wrote: >> >> >> > The following minimal test for Function in c++ reveals some bugs. I >> >> >> > guess this example can help me with dealing with the current issues >> >> >> > of >> >> >> > ImageFunction. >> >> >> > >> >> >> > (1) interpolate.py does not work when a Function is created in c++ >> >> >> > and >> >> >> > wrapped (see comment [2]). It seems that the bug is originated from >> >> >> > the copy constructor (see comment [3]) >> >> >> > >> >> >> > (2) In order to perform the interpolation, why is it necessary to >> >> >> > create another Function and then copy it? >> >> >> > >> >> >> > (3) Signature checkes seem not working properly (see comment [1]). >> >> >> > The >> >> >> > signature-based assignments are error-prone anyway, why the >> >> >> > object-oriented approach is not used? >> >> >> > >> >> >> >> >> >> Signatures are used to permit reading/writing Functions to a file. They >> >> >> are indeed error prone, so I believe that we reached a consensus a >> >> >> short >> >> >> while ago that we would remove pre-compiled elements. >> >> >> >> >> >> Garth >> >> > >> >> > Instead of signatures, I'd recommend that you define a simple form >> >> > file for each of the different types of FunctionSpace you need, for >> >> > example: >> >> > >> >> > element = FiniteElement("CG", "triangle", 1) >> >> > >> >> > v = TestFunction(element) >> >> > u = TrialFunction(element) >> >> > a = v*u*dx >> >> > >> >> > If you put this in a file named My.form and compile it with FFC using >> >> > -l dolfin, you will get a class named MyFunctionSpace that you can >> >> > then instantiate using just a mesh: >> >> > >> >> > MyFunctionSpace V(mesh); >> >> > >> >> > Create one form file for each of the different types of FunctionSpace >> >> > that you need, name the files to something suitable and use the >> >> > generated code. That way you won't need to worry about signatures, >> >> > dofmaps and finite elements. >> >> >> >> Effectively, I've been using the very same method all this time, it >> >> does not work. >> > >> > Yes, it does. It's used in about 20 of the demos. >> > >> >> The copy constructor fix never worked. I've been trying to explain >> >> this in many different ways, but the right attention was never paid to >> >> this. Let's see if the sandbox example can convince you this time. >> >> >> >> A Function instance still cannot be returned by reference (or value). >> >> Returning as shared_ptr seems to work initially, but eventually it >> >> generates segmentation fault -- see attached. >> > >> > Yes, it can. There's absolutely no problem to return a Function by >> > reference. See the updated sandbox demo. >> >> That's correct. There are 2 Function assignment, one inside >> FunctionContainer ctor and the other in main(). I thought the latter >> was the problem, which was returned by referece, but the problem was >> initiated by the latter. >> >> > >> > The only problem is when you want to copy a Function which is only >> > defined in terms of an eval() operator. In those cases the Function >> > cannot be copied. >> > >> > If you do the following: >> > >> > class MyFunction : public Function >> > { >> > public: >> > >> > MyFunction(const FunctionSpace& V) : Function(V) {}; >> > >> > void eval(double* values, const double* x) const >> > { >> > values[0] = sin(x[0]); >> > } >> > }; >> > >> > MyFunction f(V); >> > Function g = f; >> > >> > Do you then expect g to return sin(x)? It would be possible to >> > implement this but it would require g to keep a pointer to f so that >> > the eval() in g may call the eval() in f. >> >> In the that example, MyFunction was not of interest. I want >> FunctionContainer to have a member function of type Function which can >> be eventually initialised inside the class using an input >> FunctionSpace. Forget about user defined functions, let's make the >> problem as simple as possible. In FunctionContainer, the assignment in >> ctor does not work, see comment [1]: >> >> class FunctionContainer >> { >> public: >> FunctionContainer(const FunctionSpace& V) >> { >> _f = Function(V); // [1] >> }; >> >> const Function& get_function() >> { >> message("returning"); >> return _f; >> }; >> protected: >> Function _f; >> }; >> >> I hope you're not going to argue again that this is not a bug, but an >> expected behaviour. > > Yes, this is expected behavior. What happens when you do > > _f = Function(V); > > are the following two things: > > 1. The constructor in Function is called with V to create a > user-defined function with a missing eval operator (and no vector). > > 2. The assignment operator is called to assign that function to _f. > > This won't work since what you are assigning from does not have a > vector. > > The following will work: > > Function g(V); > g.vector(); > _f = g;
I didn't know that g.vector() is supposed to initialise a vector? I thought it would return one: http://www.fenics.org/pub/documents/dolfin/dolfin-progr-reference/d2/d42/classdolfin_1_1Function.html#db09253826459af5460acd5e3f52ea78 Anyway, as long as it works, that's all I wanted to know. -Ali > -- > Anders > > >> >> -Ali >> > >> > >> > >> >> >> >> -Ali >> >> >> >> > >> >> > >> >> > -----BEGIN PGP SIGNATURE----- >> >> > Version: GnuPG v1.4.9 (GNU/Linux) >> >> > >> >> > iEYEARECAAYFAkma2rQACgkQTuwUCDsYZdHp4ACfSbCXc2FAulzIdDsKvhz/6EGV >> >> > aY4An0eyftGV3hxR3L25M9LPu3X7KFg+ >> >> > =z1cY >> >> > -----END PGP SIGNATURE----- >> >> > >> >> > _______________________________________________ >> >> > DOLFIN-dev mailing list >> >> > [email protected] >> >> > http://www.fenics.org/mailman/listinfo/dolfin-dev >> >> > >> >> > >> > >> >> // Place for random tests >> >> >> >> #include <dolfin.h> >> >> #include "Poisson.h" >> >> >> >> using namespace dolfin; >> >> >> >> class MyFunction : public Function >> >> { >> >> public: >> >> >> >> MyFunction(const FunctionSpace& V) : Function(V) {}; >> >> >> >> void eval(double* values, const double* x) const >> >> { >> >> message("Calling eval"); >> >> double dx = x[0] - 0.5; >> >> double dy = x[1] - 0.5; >> >> values[0] = 500.0*exp(-(dx*dx + dy*dy) / 0.02); >> >> } >> >> }; >> >> >> >> class FunctionContainer >> >> { >> >> public: >> >> FunctionContainer(const FunctionSpace& V) >> >> { >> >> _f = Function(V); >> >> }; >> >> >> >> const Function& get_function() >> >> { >> >> return _f; >> >> }; >> >> protected: >> >> Function _f; >> >> }; >> >> >> >> >> >> int main() >> >> { >> >> UnitSquare mesh(2, 2); >> >> PoissonFunctionSpace V(mesh); >> >> MyFunction f(V); >> >> Vector x; >> >> >> >> message("Interpolating to another vector"); >> >> f.interpolate(x, f.function_space()); >> >> x.disp(); >> >> >> >> message("Interpolating to the function vector"); >> >> f.interpolate(f.vector(), f.function_space()); >> >> f.vector().disp(); >> >> >> >> message("Interpolating using initialising by an external function"); >> >> MyFunction f_(f); >> >> f.interpolate(f_.vector(), f.function_space()); >> >> f.vector().disp(); >> >> >> >> message("Returning Function by reference"); >> >> FunctionContainer fc(V); >> >> Function f2 = fc.get_function(); >> >> } >> >> >> > >> >> _______________________________________________ >> >> DOLFIN-dev mailing list >> >> [email protected] >> >> http://www.fenics.org/mailman/listinfo/dolfin-dev >> > >> > >> > -----BEGIN PGP SIGNATURE----- >> > Version: GnuPG v1.4.9 (GNU/Linux) >> > >> > iEYEARECAAYFAkmcOUcACgkQTuwUCDsYZdE/tACghYR+pHvXwurxKi2rKdcAPrtr >> > XaEAnihNPT9ar+ZLx07ltK+uZM03Ntlc >> > =8wBa >> > -----END PGP SIGNATURE----- >> > >> > _______________________________________________ >> > DOLFIN-dev mailing list >> > [email protected] >> > http://www.fenics.org/mailman/listinfo/dolfin-dev >> > >> > >> _______________________________________________ >> DOLFIN-dev mailing list >> [email protected] >> http://www.fenics.org/mailman/listinfo/dolfin-dev > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.9 (GNU/Linux) > > iEYEARECAAYFAkmcPfoACgkQTuwUCDsYZdFPDwCfbkDdJK9DIIaZqiZcOtCEXp9I > FHIAn3NZGNVb7YMONFF19771JPrYd2Tx > =6fEC > -----END PGP SIGNATURE----- > > _______________________________________________ > DOLFIN-dev mailing list > [email protected] > http://www.fenics.org/mailman/listinfo/dolfin-dev > > _______________________________________________ DOLFIN-dev mailing list [email protected] http://www.fenics.org/mailman/listinfo/dolfin-dev
