error: This integral is missing an integration domain


174
views
0
3 months ago by
# coding: utf-8

# In[ ]:



# coding: utf-8

# In[ ]:


"""
FEniCS tutorial demo program: Diffusion of a Gaussian hill.
  u'= Laplace(u) + f  in a square domain
  u = u_D             on the boundary
  u = u_0             at t = 0
  u_D = f = 0
The initial condition u_0 is chosen as a Gaussian hill.
"""

from __future__ import print_function
from fenics import *
import time
import numpy as np
T = 5            # final time
num_steps = 200   # number of time steps
dt = T / num_steps # time step size
lambda_1=-0.5
D0=1.0
# Create mesh and define function space
nx = ny = 30
mesh = RectangleMesh(Point(-2, -2), Point(2, 2), nx, ny)
V = FunctionSpace(mesh, 'P', 1)

# Define boundary condition
def boundary(x, on_boundary):
    return on_boundary

bc = DirichletBC(V, Constant(0), boundary)

# Define initial value
u_0 = Expression('exp(-a*pow(x[0], 2) - a*pow(x[1], 2))',
                 degree=2, a=5)
u_n = interpolate(u_0, V)

# Define variational problem
u = TrialFunction(V)
v = TestFunction(V)
f = Constant(0)
D = Constant(D0)

F = u*v*dx + dt*D*dot(grad(u), grad(v))*dx - (u_n + dt*f)*v*dx
a, L = lhs(F), rhs(F)

# Create VTK file for saving solution
vtkfile = File('heat_gaussian/solution.pvd')

# Time-stepping
u = Function(V)
t = 0
# Update current time
t += dt

# Compute solution
solve(a == L, u, bc)

# Save to file and plot solution
vtkfile << (u, t)
u_n.assign(u)
for n in range(num_steps):

    # Update current time
    t += dt
    
    # Compute solution
    solve(a == L, u, bc)

    # Save to file and plot solution
    vtkfile << (u, t)
    
 
    
    # Update previous solution
    

    
    # Update D_0
    D = D0*np.exp(-lambda_1*t)
    D = Constant(D)
    
    
    u1 = TrialFunction(V)
    v = TestFunction(V)
    f = Constant(0)
    # Update F
    F = u1*v*dx + dt*D*dot(grad(u1), grad(v))*dx - (u_n + dt*f)*v*dx
    a, L = lhs(F), rhs(F)
    u_n.assign(u)

the errors are

This integral is missing an integration domain.
---------------------------------------------------------------------------
UFLException                              Traceback (most recent call last)
<ipython-input-56-459d27db8357> in <module>()
     57 D = Constant(D0)
     58
---> 59 F = u*v*dx + dt*D*dot(grad(u), grad(v))*dx - (u_n + dt*f)*v*dx
     60 a, L = lhs(F), rhs(F)
     61

/usr/local/lib/python2.7/dist-packages/ufl/measure.pyc in __rmul__(self, integrand)
    444                 domain, = domains
    445             elif len(domains) == 0:
--> 446                 error("This integral is missing an integration domain.")
    447             else:
    448                 error("Multiple domains found, making the choice of integration domain ambiguous.")

/usr/local/lib/python2.7/dist-packages/ufl/log.pyc in error(self, *message)
    170         "Write error message and raise an exception."
    171         self._log.error(*message)
--> 172         raise self._exception_type(self._format_raw(*message))
    173
    174     def begin(self, *message):

UFLException: This integral is missing an integration domain.
Community: FEniCS Project

1 Answer


0
3 months ago by
I'm guessing that you're using Python 2.x, and the problem is that

dt = T / num_steps

is truncating the result to zero.  In Python 2.x, division of two integers throws away any remainder.  (In Python 3.x, there is a separate operator (//) for integer division, and the plain old / operator will return a float approximating the remainder.)  The zero dt is then interacting badly with the form compiler (which tries to optimize by simplifying terms that are multiplied by zero), leading to the error. 

If you use, instead,

dt = T / float(num_steps)


the program runs with Python 2.x and FEniCS 2017.2.  (Notice that, in the original tutorial, T is a float, which would also work.)

Please login to add an answer/comment or follow this question.

Similar posts:
Search »