← Back to team overview

dolfin team mailing list archive

[Bug 793948] [NEW] Cannot subclass subclasses of dolfin.Epression

 

Public bug reported:

It seems one cannot subclass a subclass of dolfin.Expression. I'm trying
to set up a complex expression, and the haveing differnent subclasses
for the real and imaginary parts to avoid duplication/cut-n-paste type
errors. Code below produces following output:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/nmarais/akademie/dev/femcode/main/fenics_test/<ipython console> in
<module>()

/tmp/python-2033LhI.py in <module>()
     30     def value_shape(self):
     31         return (3,)
     32 
---> 33 class E_ff_Im(E_ff_Re):
     34     part = 'imag'

/home/nmarais/local/lib/python2.6/site-packages/dolfin/functions/expression.pyc in __new__(mcs, name, bases, dict_)
    245 
    246         # remove Expression, to be added later

--> 247         user_bases.remove(Expression)
    248 
    249         # Check the user has provided either an eval or eval_cell method


ValueError: list.remove(x): x not in list

from __future__ import division

import dolfin
import math
import numpy

Z0 = 376.73031346177066   # Intrinsic impedance of free-space

class E_ff_Re(dolfin.Expression):
    part = 'real'
    freq = 1e9
    l = 1.
    I = 1.
    def eval(self, value, x):
        k0 = 2*math.pi*self.freq/c0
        r = max(math.sqrt(pow(x[0],2) + pow(x[1],2) + pow(x[2],2)), 1e-20)
        theta = math.acos(x[2]/r)
        phi = math.atan2(x[1], x[0])
        theta_hat_x = math.cos(theta)*math.cos(phi)
        theta_hat_y = math.cos(theta)*math.sin(phi)
        theta_hat_z = -math.sin(theta)
        H_phi = 1j*k0*self.l*self.I/(math.pi*4)*math.sin(theta)
        H_phi = H_phi*numpy.exp(-1j*k0*r)/r
        E_theta_complex = Z0*H_phi
        E_theta = getattr(E_theta_complex, self.part)
        value[0] = theta_hat_x*E_theta
        value[1] = theta_hat_y*E_theta
        value[2] = theta_hat_z*E_theta

    def value_shape(self):
        return (3,)

class E_ff_Im(E_ff_Re):
    part = 'imag'

** Affects: dolfin
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of DOLFIN
Team, which is subscribed to DOLFIN.
https://bugs.launchpad.net/bugs/793948

Title:
  Cannot subclass subclasses of dolfin.Epression

Status in DOLFIN:
  New

Bug description:
  It seems one cannot subclass a subclass of dolfin.Expression. I'm
  trying to set up a complex expression, and the haveing differnent
  subclasses for the real and imaginary parts to avoid
  duplication/cut-n-paste type errors. Code below produces following
  output:

  ---------------------------------------------------------------------------
  ValueError                                Traceback (most recent call last)

  /home/nmarais/akademie/dev/femcode/main/fenics_test/<ipython console>
  in <module>()

  /tmp/python-2033LhI.py in <module>()
       30     def value_shape(self):
       31         return (3,)
       32 
  ---> 33 class E_ff_Im(E_ff_Re):
       34     part = 'imag'

  /home/nmarais/local/lib/python2.6/site-packages/dolfin/functions/expression.pyc in __new__(mcs, name, bases, dict_)
      245 
      246         # remove Expression, to be added later

  --> 247         user_bases.remove(Expression)
      248 
      249         # Check the user has provided either an eval or eval_cell method

  
  ValueError: list.remove(x): x not in list

  from __future__ import division

  import dolfin
  import math
  import numpy

  Z0 = 376.73031346177066   # Intrinsic impedance of free-space

  class E_ff_Re(dolfin.Expression):
      part = 'real'
      freq = 1e9
      l = 1.
      I = 1.
      def eval(self, value, x):
          k0 = 2*math.pi*self.freq/c0
          r = max(math.sqrt(pow(x[0],2) + pow(x[1],2) + pow(x[2],2)), 1e-20)
          theta = math.acos(x[2]/r)
          phi = math.atan2(x[1], x[0])
          theta_hat_x = math.cos(theta)*math.cos(phi)
          theta_hat_y = math.cos(theta)*math.sin(phi)
          theta_hat_z = -math.sin(theta)
          H_phi = 1j*k0*self.l*self.I/(math.pi*4)*math.sin(theta)
          H_phi = H_phi*numpy.exp(-1j*k0*r)/r
          E_theta_complex = Z0*H_phi
          E_theta = getattr(E_theta_complex, self.part)
          value[0] = theta_hat_x*E_theta
          value[1] = theta_hat_y*E_theta
          value[2] = theta_hat_z*E_theta

      def value_shape(self):
          return (3,)

  class E_ff_Im(E_ff_Re):
      part = 'imag'


Follow ups

References