On Thu, 30 Apr 2009, Anders Logg wrote:

> On Thu, Apr 30, 2009 at 08:54:23AM -0400, Shawn Walker wrote:
>>
>> On Thu, 30 Apr 2009, Ola Skavhaug wrote:
>>
>>> Why not go for Martin's suggestion?
>>>
>>> Inheritance is a well known concept in C++, and it avoids using the
>>> evil macros that notoriously break compilation when people forget
>>> their ifndefs. Extending ufc with subclasss in a namespace, say eufc,
>>> dynamic casting in experimental assemblers when needed, and finally,
>>> moving functionality up the inheritance chain when settled seems to me
>>> a better solution than what is happening now?
>>
>> Why not do it?
>>
>> Reasons:
>>
>> 1. I'm not that adept at C++ to know how to do what you are saying.  Nor
>> do I forsee myself learning this in the near future. (i.e. like all this
>> dynamic casting stuff).
>>
>> 2. This `eufc' is only for experimentation and I would assume it will not
>> be a permanent piece of the code.
>>
>> 3. The original reason for doing this, was to basically just add some
>> freaking variables!
>
> I know, and that's exactly the point. Before we had UFC, the interface
> between FFC and DOLFIN changed all the time. Now we have two form
> compilers and other projects using UFC or considering using it. So we
> need to keep it stable and make sure we know what we want before
> making changes. Any change to ufc.h will require changes to DOLFIN, FFC,
> SyFi/SFC, and all code that has ever been generated for UFC 1.1.

ok, ok.

>> Why do we have to make it so complicated?
>> Furthermore, these additions (if made to the real ufc.h) would not have
>> changed anything.  The current modules now would just not use those new
>> data structs.  It would have been completely backwards compatible.  But I
>> understand you want to keep ufc and its doc's up to date.
>>
>> If someone wants to set this up, be my guest (see #1).  I would certainly
>> appreciate it.  I don't know how to do it.
>
> I talked to Martin and Ola today and they convinced me we should use
> inheritance, not macros (#ifdef).
>
> The reason is that with inheritance, we can freely extend the classes
> in ufc.h and the code (DOLFIN) will still work with the official UFC
> interface. With #ifdef, one would not be able to assemble forms
> compiled for the official UFC interface with DOLFIN when the
> UFC_EXPERIMENTAL flag is set.

ok.

> Here's a summary of what needs to be done:
>
> 1. Create a file named ufce.h and place it in dolfin/fem/ as part of
> DOLFIN.

This should be named ufcexp.h.  If someone is visually scanning the code, 
this can be missed.

> 2. This file defines subclasses of the UFC classes that need to be
> extended. It can look something like this:
>
> #include <ufc.h>
>
> namespace ufce

namespace ufcexp

> {
>
>  class cell : public ufc::cell
>  {
>  public:
>
>    /// Array of coordinates for higher order vertices of the cell
>    double** higher_order_coordinates;
>
>  };
>
> }
>
> 3. UFCCell needs to inherit from ufce::cell, not ufc::cell. That means
> it is still a ufc::cell since ufce::cell is a ufc::cell.

This seems reasonable...  again ufcexp::cell.  the other way can be easily 
overlooked.

> 4. In places where we assume that we have a ufce::cell and not a
> ufc::cell, we make a dynamic_cast and issue an error if the cast fails
> (which indicates that the form that comes in is not a ufce form but a
> ufc form). A dynamic_cast of a pointer can be done like this:
>
>  Bar* bar = dynamic_cast<Bar*>(foo);
>
> Here, foo is a pointer to a Foo and Bar is a subclass of Foo.
> If the cast fails, a zero pointer will be returned indicating that foo
> is not a Bar, only a Foo.

ok, so for example, say we are inside a tabulate_tensor routine.

when we read in `c.coordinates', everything is fine.  No problem.

Now, we want to read in the `higher_order_coordinates'.  So, we cannot do 
`c.higher_order_coordinates' because the routine only sees it as a 
ufc::cell (because we want to be backwards compatible).

So, we have to do this:

ufcexp::cell MYc = dynamic_cast<ufcexp::cell>(c);

Then we can read:

`MYc.higher_order_coordinates'.

Is this right?  If so, that doesn't sound too bad.

- Shawn
_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev

Reply via email to