Hello everyone. I have a similar problem. I can project some terms of the solution, but the grad(u) projections don’t work.
W = FunctionSpace(mesh, ‘DG’, order)
WW = VectorFunctionSpace(mesh, ‘DG’, order )
WWW = TensorFunctionSpace(mesh, ‘DG’, order )
u1p = project(u[0], W)
sigh12p = project(sig[0,1],W) #to plot in paraview
gradu = nabla_grad(u)
#u1xp = project(gradu[0,1], W)
#uxp = project(gradu[0], WW)
grad_up = project(gradu, WWW)
I getting the follows error:
Traceback (most recent call last):
File “/home/ex1.py”, line 134, in
grad_up = project(gradu, WWW)
^^^^^^^^^^^^^^^^^^^
File “/usr/lib/petsc/lib/python3/dist-packages/dolfin/fem/projection.py”, line 132, in project
A, b = assemble_system(a, L, bcs=bcs,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/petsc/lib/python3/dist-packages/dolfin/fem/assembling.py”, line 436, in assemble_system
assembler = cpp.fem.SystemAssembler(A_dolfin_form, b_dolfin_form, bcs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError:
*** -------------------------------------------------------------------------
*** DOLFIN encountered an error. If you are not able to resolve this issue
*** using the information listed below, you can ask for help at
*** https://fenicsproject.discourse.group/
*** Remember to include the error message listed below and, if possible,
*** include a minimal running example to reproduce the error.
*** -------------------------------------------------------------------------
*** Error: Unable to assemble system.
*** Reason: expected a linear form for L.
*** Where: This error was encountered inside SystemAssembler.cpp.
*** Process: 0
*** DOLFIN version: 2019.2.0.13.dev0
Can someone help me please? My mininall code is:
'''
This code solves a mixed FEM for the Navier-Stokes equations
in symmetric-pseudostress-velocity-vorticity formulation
author: Saulo Rodrigo Medrado
'''
# <----- preamble ----->
from fenics import *
import numpy as np
from numpy import linalg as LA
import sympy as sp # required by symbolic expressions
from mshr import *
# create classes for defining boundary
def gamma(x,on_boundary):
return on_boundary
# <----- model parameters and auxiliary symbolic expressions ----->
Id = Identity(2)
x, y = sp.symbols('x[0] x[1]')
# <--------------------------------------------------------------------->
# <----- Data parameters ----->
nu = 1.0
# <----- boundary condition ----->
ue_c1 = pow(x,2)*pow((x-1.),2)*sp.sin(y)
ue_c2 = 2.*x*(x-1.)*(2*x-1.)*sp.cos(y)
ue = Expression((sp.printing.ccode(ue_c1), sp.printing.ccode(ue_c2) ), degree = 5)
# <----- RHS ----->
ff1 = 4*pow(x, 4)*pow(x - 1.0, 3)*pow(sp.sin(y), 2) + 4*pow(x, 3)*pow(x - 1.0, 4)*pow(sp.sin(y), 2) \
- 2.0*pow(x, 3)*pow(x - 1.0, 3)*(2*x - 1.0)*pow(sp.sin(y), 2) \
+ 2.0*pow(x, 3)*pow(x - 1.0, 3)*(2*x - 1.0)*pow(sp.cos(y), 2) \
+ 1.0*pow(x, 2)*pow(x - 1.0, 2)*sp.sin(y) - 2.0*pow(x, 2)*sp.sin(y) \
- 4.0*x*(2*x - 2.0)*sp.sin(y) - 2.0*pow(x - 1.0, 2)*sp.sin(y) \
- 3.1415926535897931*sp.exp(3.1415926535897931*y)*sp.sin(3.1415926535897931*x)
ff2 = 4.0*pow(x, 3)*pow(x - 1.0, 3)*sp.sin(y)*sp.cos(y) \
+ 6.0*pow(x, 3)*pow(x - 1.0, 2)*(2*x - 1.0)*sp.sin(y)*sp.cos(y) \
+ 6.0*pow(x, 2)*pow(x - 1.0, 3)*(2*x - 1.0)*sp.sin(y)*sp.cos(y) \
- 32.0*pow(x, 2)*pow(x - 1.0, 2)*pow(x - 0.5, 2)*sp.sin(y)*sp.cos(y) \
+ 2.0*x*(x - 1.0)*(2*x - 1.0)*sp.cos(y) - 8.0*x*sp.cos(y) - 8.0*(x - 1.0)*sp.cos(y) \
- 4.0*(2*x - 1.0)*sp.cos(y) + 3.1415926535897931*sp.exp(3.1415926535897931*y)*sp.cos(3.1415926535897931*x)
ff = Expression(( sp.printing.ccode(ff1), sp.printing.ccode(ff2) ), degree = 5)
# <--------------------------------------------------------------------->
# <----- solver ----->
# <------ lists to hold errors, meshsize, etc. ------->
err_rel0 = 10.0
tol = 1e-6
itermax = 20
NN = [4, 8, 16, 32]
for i in NN:
domain_vertices = [Point( 0.0, 0.0),
Point( 1.0, 0.0),
Point( 1.0, 1.0),
Point( 0.0, 1.0)]
domain = Polygon(domain_vertices)
mesh = generate_mesh(domain, i)
Om = assemble( Constant(1.0)*dx(mesh) )
n = FacetNormal(mesh)
s_e = as_vector((-n[1],n[0]))
h = mesh.hmax()
nelem = mesh.num_cells()
# <---------Polynomial order degree ----->
order = 0
# <-------- define function space -------->
Hsig = VectorElement("BDM",mesh.ufl_cell(), order+1) # tensor BDM_k+1
Hu = VectorElement("DG" ,mesh.ufl_cell(), order) # vector P_k discontinuous
L = FiniteElement("R" ,mesh.ufl_cell(), 0) # Lagrange multiplier space
Xh = FunctionSpace(mesh,MixedElement([Hsig,Hu,L]))
dim = Xh.dim()
# <----- Newton's method ----->
iter = 0.
err_rel = err_rel0
# <----- Initialization ----->
u0 = Constant((0,0))
# <----- Kernel ----->
while (err_rel > tol) and (iter< itermax) :
# <----- 1. solve step ----->
# <----- define trial and test functions ----->
(sig, u, l1) = TrialFunctions(Xh)
(tau, v, t1) = TestFunctions(Xh)
# <---- involved forms ----->
A = (1/nu)*inner(dev(sig),dev(tau))*dx
An = (1/nu)*inner(outer(u0,u) + outer(u,u0),dev(tau))*dx
B = dot(u,div(tau))*dx
Bt = dot(v,div(sig))*dx
M1 = l1*tr(tau)*dx
M2 = t1*tr(sig)*dx
AA = An + A + B + Bt + M1 + M2
F1 = 1/nu*inner(outer(u0,u0),dev(tau))*dx
F2 = dot(tau*n,ue)*ds
Ff2 = - dot(ff,v)*dx
FF = F1 + F2 + Ff2
# <---- function to solve for ---->
sol = Function(Xh)
solve(AA == FF, sol, solver_parameters = {'linear_solver':'mumps'} ) #solver_parameters = {'linear_solver':'mumps,umfpack''}
( sig, u, l1) = sol.split()
solaux = np.reshape(sol.vector()[:], (Xh.dim(),1))
coeffm = solaux
if iter==0:
err_rel = err_rel0
else:
err_rel = LA.norm(coeffm - coeff_old)/LA.norm(coeffm)
# <----- 2. update data ----->
coeff_old = coeffm
u0 = u
iter = iter + 1.0
print('it.Newton',iter)
print('number of elements: ', nelem, 'DOFs:',dim, 'err_rel', err_rel )
# <------ post-processing ------->
W = FunctionSpace(mesh, 'DG', order)
WW = VectorFunctionSpace(mesh, 'DG', order )
WWW = TensorFunctionSpace(mesh, 'DG', order )
u1p = project(u[0], W)
sigh12p = project(sig[0,1],W) #to plot in paraview
gradu = nabla_grad(u)
#u1xp = project(gradu[0,1], W)
#uxp = project(gradu[0], WW)
#grad_up = project(gradu, WWW)
# <----- export graphics ----->
#u_file = File("Data_Paraview_2D/approx_u.pvd") << u
#gradu_file = File("Data_Paraview_2D/approx_grad_u.pvd") << grad_u