Subject: [Fenics-ufc] ufc_untils templates

From: Mehdi <[email-masked]>
Date: Wed, 16 Jun 2010 15:36:27 +0200

Hello,
        
I have a suggestion for ufc templates. In the current templates, it has
been assumed that sub classes derived from ufc::foo don't need to accept
any argument. 
        
However, this is not the case always. For example in the modeling
discontinuities we need to pass information related to new gauss
quadrature rule and new degrees of freedom to ufc::foo_integral.
        
I would suggest to extend templates such that it also accepts some
arguments in the constructor.
        
For example the constructor for ufc::form will be, 
        
/// Constructor
%(classname)s(%(argument)s) : ufc::form()%(initializer)s
{
%(constructor)s
}
        
instead of,
        
/// Constructor
%(classname)s() : ufc::form()
{
%(constructor)s
}

This need some minor updates inside ffc as well to generate empty string
for standard cases.
        
I can prepare patches for ffc and ufc, if there is no objection.
        
Mehdi

---

From: Anders Logg <[email-masked]>
Date: Wed, 16 Jun 2010 16:20:17 +0200

On Wed, Jun 16, 2010 at 03:36:27PM +0200, Mehdi wrote:
> _______________________________________________
> Mailing list: https://launchpad.net/~fenics-ufc
> Post to     : [email-masked]
> Unsubscribe : https://launchpad.net/~fenics-ufc
> More help   : https://help.launchpad.net/ListHelp

I'm not sure that's a good idea. If you add arguments to ufc::form,
you would no longer be able to use it as a ufc::form since DOLFIN
assumes that no arguments are needed when it creates a form instance.

I suggest instead creating a (virtual) subclass of ufc::form that you
can then generate subclasses of.

--
Anders

---

From: Mehdi <[email-masked]>
Date: Wed, 16 Jun 2010 16:35:41 +0200

> assumes that no arguments are needed when it creates a form instance.

Note that we don't add any argument to ufc::form. The generated sub
class is still child of ufc::form. We just add argument to the class
derived from ufc::form. 

For example the generated code for poisson will be something like

  /// Constructor
  poisson_form_0(const std::vector<pum::GenericPUM*> pums) :
ufc::form(), pums(pums)

instead of 

  poisson_form_0() : ufc::form()

Now I have my local templates inside ffcpum compiler. I can remove them,
if we generalize ufc templates.

Mehdi

---

From: Anders Logg <[email-masked]>
Date: Wed, 16 Jun 2010 16:50:17 +0200

> if we generalize ufc templates.

I understand, but DOLFIN assumes that there are no arguments even to
your subclasses. See for example Poisson.h in the Poisson demo where
we have

class Form_1: public dolfin::Form
{
public:

  // Constructor
  Form_1(const dolfin::FunctionSpace& V0):
    dolfin::Form(1, 2), f(*this, 0), g(*this, 1)
  {
    _function_spaces[0] = reference_to_no_delete_pointer(V0);

    _ufc_form = boost::shared_ptr<const ufc::form>(new poisson_form_1());
  }                                                ~~~~~~~~~~~~~~~~~~~~

--
Anders

---

From: Mehdi <[email-masked]>
Date: Wed, 16 Jun 2010 17:01:07 +0200

>     _ufc_form = boost::shared_ptr<const ufc::form>(new poisson_form_1());

This is the generated code by dolfin wrapper. Note that I have my own
wrappers which allows me add arguments to the derived classes when ever
it is necessary. 

The wrapper for the dolfin remains unchanged, since we don't have any
argument for the standard cases. The code is exactly as before, if we
don't need to have any argument.

Mehdi

---

From: Mehdi <[email-masked]>
Date: Wed, 16 Jun 2010 18:09:53 +0200

> don't need to have any argument.

In the attached files, you can find the patches for ufc and ffc to
address this issue. Please let me know, if they are OK.

Mehdi 

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: mehdi@mehdi-laptop-20100616155907-pem7mn10sjz6i790
# target_branch: bzr+ssh://bazaar.launchpad.net/~ufc-core/ufc/main/
# testament_sha1: 97dc2825d5697bd35483e036be6dd509f10f4ba1
# timestamp: 2010-06-16 17:59:35 +0200
# base_revision_id: [email-masked]
# 
# Begin patch
=== modified file 'src/utils/python/ufc/dof_map.py'
--- src/utils/python/ufc/dof_map.py	2010-02-01 22:42:56 +0000
+++ src/utils/python/ufc/dof_map.py	2010-06-16 15:35:04 +0000
@@ -11,8 +11,8 @@
 {%(members)s
 public:
 
-  /// Constructor
-  %(classname)s() : ufc::dof_map()
+   /// Constructor
+  %(classname)s(%(argument)s) : ufc::dof_map()%(initializer)s
   {
 %(constructor)s
   }
@@ -143,8 +143,8 @@
 public:
 
   /// Constructor
-  %(classname)s();
-
+  %(classname)s(%(argument)s);
+  
   /// Destructor
   virtual ~%(classname)s();
 
@@ -210,7 +210,7 @@
 
 dof_map_implementation = """\
 /// Constructor
-%(classname)s::%(classname)s() : ufc::dof_map()
+%(classname)s::%(classname)s(%(argument)s) : ufc::dof_map()%(initializer)s
 {
 %(constructor)s
 }

=== modified file 'src/utils/python/ufc/finite_element.py'
--- src/utils/python/ufc/finite_element.py	2010-02-01 22:42:56 +0000
+++ src/utils/python/ufc/finite_element.py	2010-06-16 15:35:04 +0000
@@ -11,7 +11,7 @@
 public:
 
   /// Constructor
-  %(classname)s() : ufc::finite_element()
+  %(classname)s(%(argument)s) : ufc::finite_element()%(initializer)s
   {
 %(constructor)s
   }
@@ -135,7 +135,7 @@
 public:
 
   /// Constructor
-  %(classname)s();
+  %(classname)s(%(argument)s);
 
   /// Destructor
   virtual ~%(classname)s();
@@ -206,7 +206,7 @@
 finite_element_implementation= """\
 
 /// Constructor
-%(classname)s::%(classname)s() : ufc::finite_element()
+%(classname)s::%(classname)s(%(argument)s) : ufc::finite_element()%(initializer)s
 {
 %(constructor)s
 }

=== modified file 'src/utils/python/ufc/form.py'
--- src/utils/python/ufc/form.py	2010-02-01 22:42:56 +0000
+++ src/utils/python/ufc/form.py	2010-06-16 15:35:04 +0000
@@ -24,7 +24,7 @@
 public:
 
   /// Constructor
-  %(classname)s() : ufc::form()
+  %(classname)s(%(argument)s) : ufc::form()%(initializer)s
   {
 %(constructor)s
   }
@@ -123,9 +123,9 @@
 class %(classname)s: public ufc::form
 {%(members)s
 public:
-
+  
   /// Constructor
-  %(classname)s();
+  %(classname)s(%(argument)s);
 
   /// Destructor
   virtual ~%(classname)s();
@@ -168,7 +168,7 @@
 
 form_implementation = """\
 /// Constructor
-%(classname)s::%(classname)s() : ufc::form()
+%(classname)s::%(classname)s(%(argument)s) : ufc::form()%(initializer)s
 {
 %(constructor)s
 }

=== modified file 'src/utils/python/ufc/function.py'
--- src/utils/python/ufc/function.py	2010-02-01 22:42:56 +0000
+++ src/utils/python/ufc/function.py	2010-06-16 15:35:04 +0000
@@ -11,7 +11,7 @@
 public:
 
   /// Constructor
-  %(classname)s() : ufc::function()
+  %(classname)s::%(classname)s(%(argument)s) : ufc::function()%(initializer)s
   {
 %(constructor)s
   }
@@ -41,7 +41,7 @@
 public:
 
   /// Constructor
-  %(classname)s();
+  %(classname)s(%(argument)s);
 
   /// Destructor
   virtual ~%(classname)s();
@@ -56,7 +56,7 @@
 
 function_implementation = """\
 /// Constructor
-%(classname)s::%(classname)s() : ufc::function()
+%(classname)s::%(classname)s(%(argument)s) : ufc::function()%(initializer)s
 {
 %(constructor)s
 }

=== modified file 'src/utils/python/ufc/integrals.py'
--- src/utils/python/ufc/integrals.py	2010-02-01 22:42:56 +0000
+++ src/utils/python/ufc/integrals.py	2010-06-16 15:59:07 +0000
@@ -13,11 +13,11 @@
 public:
 
   /// Constructor
-  %(classname)s() : ufc::cell_integral()
+  %(classname)s(%(argument)s) : ufc::cell_integral()%(initializer)s
   {
 %(constructor)s
   }
-
+  
   /// Destructor
   virtual ~%(classname)s()
   {
@@ -45,8 +45,8 @@
 public:
 
   /// Constructor
-  %(classname)s();
-
+  %(classname)s(%(argument)s);
+  
   /// Destructor
   virtual ~%(classname)s();
 
@@ -60,7 +60,7 @@
 
 cell_integral_implementation = """\
 /// Constructor
-%(classname)s::%(classname)s() : ufc::cell_integral()
+%(classname)s::%(classname)s(%(argument)s) : ufc::cell_integral()%(initializer)s
 {
 %(constructor)s
 }
@@ -88,13 +88,13 @@
 class %(classname)s: public ufc::exterior_facet_integral
 {%(members)s
 public:
-
+  
   /// Constructor
-  %(classname)s() : ufc::exterior_facet_integral()
+  %(classname)s(%(argument)s) : ufc::exterior_facet_integral()%(initializer)s
   {
 %(constructor)s
   }
-
+  
   /// Destructor
   virtual ~%(classname)s()
   {
@@ -123,7 +123,7 @@
 public:
 
   /// Constructor
-  %(classname)s();
+  %(classname)s(%(argument)s);
 
   /// Destructor
   virtual ~%(classname)s();
@@ -139,7 +139,7 @@
 
 exterior_facet_integral_implementation = """\
 /// Constructor
-%(classname)s::%(classname)s() : ufc::exterior_facet_integral()
+%(classname)s::%(classname)s(%(argument)s) : ufc::exterior_facet_integral()%(initializer)s
 {
 %(constructor)s
 }
@@ -168,9 +168,9 @@
 class %(classname)s: public ufc::interior_facet_integral
 {%(members)s
 public:
-
+  
   /// Constructor
-  %(classname)s() : ufc::interior_facet_integral()
+  %(classname)s(%(argument)s) : ufc::interior_facet_integral()%(initializer)s
   {
 %(constructor)s
   }
@@ -205,7 +205,7 @@
 public:
 
   /// Constructor
-  %(classname)s();
+  %(classname)s(%(argument)s);
 
   /// Destructor
   virtual ~%(classname)s();
@@ -223,7 +223,7 @@
 
 interior_facet_integral_implementation = """\
 /// Constructor
-%(classname)s::%(classname)s() : ufc::interior_facet_integral()
+%(classname)s::%(classname)s(%(argument)s) : ufc::interior_facet_integral()%(initializer)s
 {
 %(constructor)s
 }

# Begin bundle
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: mehdi@mehdi-laptop-20100616155318-ykw47khfru3aock7
# target_branch: bzr+ssh://bazaar.launchpad.net/~ffc-core/ffc/main/
# testament_sha1: bf55fc11db378a0a54a9cd9dfc9f023b54076f44
# timestamp: 2010-06-16 17:53:56 +0200
# base_revision_id: [email-masked]
# 
# Begin patch
=== modified file 'ffc/codegeneration.py'
--- ffc/codegeneration.py	2010-06-11 19:39:02 +0000
+++ ffc/codegeneration.py	2010-06-16 15:53:18 +0000
@@ -11,7 +11,8 @@
 __copyright__ = "Copyright (C) 2009 " + __author__
 __license__  = "GNU GPL version 3 or any later version"
 
-# Last changed: 2010-04-05
+# Modfied by Mehdi Nikbakht 2010
+# Last changed: 2010-06-15
 
 # FFC modules
 from ffc.log import info, begin, end, debug_code
@@ -87,6 +88,8 @@
     code["members"] = ""
     code["constructor"] = do_nothing
     code["destructor"] = do_nothing
+    code["argument"] = ""
+    code["initializer"] = ""            
     code["signature"] = ret('"%s"' % ir["signature"])
     code["cell_shape"] = ret(format["cell"](ir["cell_shape"]))
     code["space_dimension"] = ret(ir["space_dimension"])
@@ -129,6 +132,8 @@
     code["members"] = "\nprivate:\n\n  " + declare("unsigned int", "_global_dimension")
     code["constructor"] = assign("_global_dimension", f_int(0))
     code["destructor"] = do_nothing
+    code["argument"] = ""
+    code["initializer"] = ""
     code["signature"] = ret('"%s"' % ir["signature"])
     code["needs_mesh_entities"] = _needs_mesh_entities(ir["needs_mesh_entities"])
     code["init_mesh"] = _init_mesh(ir["init_mesh"])
@@ -191,6 +196,8 @@
     code["members"] = ""
     code["constructor"] = do_nothing
     code["destructor"] = do_nothing
+    code["argument"] = ""
+    code["initializer"] = ""                
     code["signature"] = ret('"%s"' % ir["signature"])
     code["rank"] = ret(ir["rank"])
     code["num_coefficients"] = ret(ir["num_coefficients"])
@@ -433,7 +440,7 @@
 def _indent_code(code):
     "Indent code that should be indented."
     for key in code:
-        if not key in ("classname", "members"):
+        if not key in ("classname", "members", "argument", "initiliazer"):
             code[key] = indent(code[key], 4)
 
 def _remove_code(code, parameters):

=== modified file 'ffc/quadrature/quadraturegenerator.py'
--- ffc/quadrature/quadraturegenerator.py	2010-05-18 20:26:10 +0000
+++ ffc/quadrature/quadraturegenerator.py	2010-06-16 15:53:18 +0000
@@ -5,7 +5,9 @@
 __copyright__ = "Copyright (C) 2009-2010 Kristian B. Oelgaard"
 __license__  = "GNU GPL version 3 or any later version"
 
-# Last changed: 2010-05-18
+# Modified by Mehdi Nikbakht, 2010
+# Last changed: 2010-06-16
+
 
 # Python modules.
 import numpy
@@ -29,6 +31,8 @@
     code["members"] = ""
     code["constructor"] = format["do nothing"]
     code["destructor"] = format["do nothing"]
+    code["argument"] = ""
+    code["initializer"] = ""     
     code["tabulate_tensor"] = _tabulate_tensor(ir, parameters)
 
     return code

=== modified file 'ffc/tensor/tensorgenerator.py'
--- ffc/tensor/tensorgenerator.py	2010-02-17 15:06:17 +0000
+++ ffc/tensor/tensorgenerator.py	2010-06-16 15:53:18 +0000
@@ -8,7 +8,8 @@
 # Modified by Kristian B. Oelgaard, 2009-2010
 # Modified by Marie Rognes ([email-masked]), 2007
 # Modified by Garth N. Wells, 2009
-# Last changed: 2010-02-17
+# Modified by Mehdi Nikbakht, 2010
+# Last changed: 2010-06-16
 
 # FFC modules
 from ffc.log import error
@@ -30,6 +31,8 @@
     code["members"] = ""
     code["constructor"] = do_nothing
     code["destructor"] = do_nothing
+    code["argument"] = ""
+    code["initializer"] = ""  
     code["tabulate_tensor"] = _tabulate_tensor(ir, parameters)
 
     return code

# Begin bundle

---

From: Anders Logg <[email-masked]>
Date: Tue, 29 Jun 2010 18:20:12 +0200

It will have to wait until after the release (unless someone else want
to apply and test the patches).

--
Anders

> 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
> V0iFJ/xdyRThQkN3T56U

> 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

---

From: "Garth N. Wells" <[email-masked]>
Date: Wed, 30 Jun 2010 10:58:44 +0100

> to apply and test the patches).

I've asked Mehdi to make some small changes to the patch, then I'll 
apply it.

Garth

---

From: Anders Logg <[email-masked]>
Date: Wed, 30 Jun 2010 12:03:51 +0200

> I've asked Mehdi to make some small changes to the patch, then I'll

ok.

Make sure you format it properly (in particular without trailing
spaces) or otherwise it will screw up the regression tests.

We should wait with the release until tomorrow so the buildbot will
have a chance to test it.

--
Anders