Is there a way in Fenics to compute a partial integral? I need \rho(x)=\int f(x,y)dy, but I get a TypeError: “unsupported operand type(s) for *: ‘Expression’ and ‘Form’”. The problem is that the equation for c only involves the variable x but depends on \rho and not on f. In the following implementation I get the TypeError.
dolfin import * # Sub domain for Dirichlet boundary condition class NofluxBoundary(SubDomain): def inside(self, x, on_boundary): return bool((x[0] < DOLFIN_EPS or x[0] > (1.0 - DOLFIN_EPS)) \ and on_boundary) # Sub domain for Periodic boundary conditional class PeriodicBoundaryC(SubDomain): # Left boundary is "target domain" G def inside(self, x, on_boundary): return bool(x[1] < DOLFIN_EPS and x[1] > -DOLFIN_EPS and on_boundary) # Map right boundary (H) to left boundary (G) def map(self, x, y): y[1] = x[1] - 1.0 y[0] = x[0] class PeriodicBoundary(SubDomain): # Left boundary is "target domain" G def inside(self, x, on_boundary): return bool(x[1] < DOLFIN_EPS and x[1] > -DOLFIN_EPS and on_boundary) # Create mesh and finite element mesh = UnitSquareMesh(32, 32) pbc = PeriodicBoundaryC() nofluxb = NofluxBoundary() pb = PeriodicBoundary() V = FunctionSpace(mesh, 'CG', 1, constrained_domain=pbc) Q = FiniteElement("CG", triangle, 1) domains = MeshFunction("size_t", mesh, mesh.topology().dim()) domains.set_all(0) boundaries = MeshFunction("size_t", mesh, mesh.topology().dim()-1) boundaries.set_all(0) pb.mark(boundaries, 1) nofluxb.mark(boundaries, 2) ds = Measure('ds', domain=mesh, subdomain_data=boundaries) W = FunctionSpace(mesh,MixedElement([Q,Q]), constrained_domain=pbc) #system u = Function(W) u.interpolate(Expression(("cos(0.5*pi*x[0])*cos(0.5*pi*x[0])", "cos(0.5*pi*x[0])*cos(0.5*pi*x[0])"), degree=2)) f, c = split(u) v, w = TestFunction(W) r = Expression('x[0]',degree=2) cospsi = Expression('cos(2*pi*x[1])',degree=2) sinpsi = Expression('sin(2*pi*x[1])',degree=2) #system B = r*cospsi*grad(f)[0]*v*dx - sinpsi*grad(f)[1]*v*dx \ + r*sinpsi*grad(c)[0]*f*grad(v)[1]*dx \ - r*grad(f)[0]*v*ds(1) \ + r*grad(c)[0]*grad(w)[0]*dx -r*(f*dx(1))*w*dx - \ - grad(c)[0]*w*ds(1) solve(B == 0, f)