~mapdes/ffc/pyop2

« back to all changes in this revision

Viewing changes to ffc/tensor/monomialextraction.py

  • Committer: Graham Markall
  • Date: 2013-01-16 08:55:00 UTC
  • Revision ID: grm08@doc.ic.ac.uk-20130116085500-o2e1xyhkxgkftjpa
Cherry-pick FFC trunk revision 1795

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
"Extraction of monomial representations of UFL forms."
2
2
 
3
 
# Copyright (C) 2008-2009 Anders Logg
 
3
# Copyright (C) 2008-2013 Anders Logg
4
4
#
5
5
# This file is part of FFC.
6
6
#
17
17
# You should have received a copy of the GNU Lesser General Public License
18
18
# along with FFC. If not, see <http://www.gnu.org/licenses/>.
19
19
#
20
 
# Modified by Martin Alnes, 2008
 
20
# Modified by Martin Alnaes, 2008, 2013
21
21
# Modified by Kristian B. Oelgaard
22
22
#
23
23
# First added:  2008-08-01
24
 
# Last changed: 2010-01-25
 
24
# Last changed: 2013-01-08
25
25
 
26
26
# UFL modules
27
27
from ufl.classes import Form, Argument, Coefficient, ScalarValue, IntValue
325
325
        s.apply_tensor(indices)
326
326
        return s
327
327
 
328
 
    def spatial_derivative(self, o, s, indices):
 
328
    def old_spatial_derivative(self, o, s, indices):
329
329
        s = MonomialSum(s)
330
330
        s.apply_derivative(indices)
331
331
        return s
332
332
 
 
333
    def grad(self, o, s):
 
334
        # The representation
 
335
        #   o = Grad(s)
 
336
        # is equivalent to
 
337
        #   o = as_tensor(s[ii].dx(i), ii+(i,))
 
338
 
 
339
        # In UFL representation types:
 
340
        #ind = indices(o.rank())
 
341
        #si = Indexed(s, ind[:-1])
 
342
        #sd = SpatialDerivative(si, ind[-1])
 
343
        #o = ComponentTensor(sd, ind)
 
344
 
 
345
        from ufl import indices
 
346
        ind = list(indices(o.rank()))
 
347
 
 
348
        # We could reuse other handlers like this:
 
349
        #si = self.indexed(None, s, list(ind[:-1]))
 
350
        #sd = self.old_spatial_derivative(si, [ind[-1]])
 
351
        #return self.component_tensor(None, sd, ind)
 
352
 
 
353
        # Or implement directly like this:
 
354
        si = MonomialSum(s)
 
355
        si.apply_indices(list(ind[:-1]))
 
356
 
 
357
        sd = MonomialSum(si)
 
358
        sd.apply_derivative([ind[-1]])
 
359
 
 
360
        s = MonomialSum(sd)
 
361
        s.apply_tensor(ind)
 
362
        return s
 
363
 
333
364
    def positive_restricted(self, o, s):
334
365
        s.apply_restriction("+")
335
366
        return s