Fenics 2019.1.0 and dolfinx v0.6.0

image

image

The first picture is solved with fenics 2019.1.0, and the second is solved with dolfinx 0.6.0. Why does the second picture have such a bright spot (red box) with solving the same equations and same configuration?

sorry for my mistake,the first picture is solved in dolfinx 0.6.0 ,and the seconds picture is in fenics 2019.1.0

Without supplying a code, Im not sure how one should be able to help you

the following are codes of fenics v2019.1.0 and dolfinx v0.6.0, the variable weights is a ndarray .

'''
dolfinx v0.6.0
'''

from mpi4py import MPI
from dolfinx import mesh
from dolfinx.fem import FunctionSpace
from dolfinx import fem
import ufl
import numpy as np

domain = mesh.create_unit_square(MPI.COMM_WORLD, 511, 511)
xy = ufl.SpatialCoordinate(domain)

node = geom_node_scale
tol = np.finfo(np.float64).eps
r_n = [(xy[0] - (xc + tol))**2 + (xy[1] - (yc + tol))**2 for xc, yc in node]
S_n = np.copy(weights)
I_n = [S_n[i] / r_n[i] for i in range(len(node))]
J_n = [1 / r_n[i] for i in range(len(node))]

weights = 1/((1/softmax(weights)).min()*softmax(weights))

q=-sum(J_n*weights)
f=-sum(I_n*weights)

V = FunctionSpace(domain, ("Lagrange", 1))
uD = fem.Function(V)

uD.vector.set(3) 
domain.topology.create_connectivity(domain.topology.dim-1, domain.topology.dim)
boundary_facets = mesh.exterior_facet_indices(domain.topology)
boundary_dofs = fem.locate_dofs_topological(V, domain.topology.dim-1, boundary_facets)

bc = fem.dirichletbc(uD, boundary_dofs)

u = ufl.TrialFunction(V)
v = ufl.TestFunction(V)

a= -ufl.dot(ufl.grad(u),ufl.grad(v))*ufl.dx+q*u*v*ufl.dx
L=f*v*ufl.dx
problem = fem.petsc.LinearProblem(a, L, bcs=[bc],
                                  )
uh = problem.solve()

'''
fenics 2019.1.0
'''
import numpy as np
import sympy as sym

x, y = sym.symbols('x[0], x[1]')

node = geom_node_scale

r_n = [(x - xc)**2 + (y - yc )**2 for xc, yc in node]
S_n = np.copy(weights)

I_n = [S_n[i] / r_n[i] for i in range(len(node))]
J_n = [1 / r_n[i] for i in range(len(node))]

weights = 1/((1/softmax(weights)).min()*softmax(weights))

S_xy = 3

J_xy = sum(J_n*weights)
I_xy = sum(I_n*weights)

u_code = sym.printing.ccode(S_xy)
q_code = sym.printing.ccode(J_xy)
f_code = sym.printing.ccode(I_xy)

import fenics as fe

u_D = fe.Expression(u_code, degree=1)
q = -fe.Expression(q_code, degree=1)
f = -fe.Expression(f_code, degree=1)

mesh = fe.UnitSquareMesh(511, 511)
V = fe.FunctionSpace(mesh, 'Lagrange', 1)

def boundary(x, on_boundary):
    return on_boundary

bc = fe.DirichletBC(V, u_D, boundary)
u = fe.TrialFunction(V)
v = fe.TestFunction(V)

F = -fe.dot(fe.grad(u), fe.grad(v)) * fe.dx + q*u*v*fe.dx - f * v * fe.dx
a = fe.lhs(F)
L = fe.rhs(F)

A = fe.assemble(a)
b = fe.assemble(L)
bc.apply(A, b)

uh = fe.Function(V)
U = uh.vector()
fe.solve(A, U, b)


Well, first of all, what is

This means that one cannot reproduce the behavior you are talking about.

Secondly, there is a fundamental difference between

and

as the first one interpolates the solution into a first order Lagrange space, while the second one evaluates the expression at quadrature points (more accurate).

the variable geom_node_scale is a ndarray which shape is same as the variable weights . And, how can I implement the same functionality of

q= -fe.Expression(q_code, degree=1)
f = -fe.Expression(f_code, degree=1)

in dolfinx v0.6.0?

Why would you do that? It is less accurate.

If you really want to decrease the accuracy, you could interpolate the ufl expression into a dolfinx function, as mentioned in

in fenics 2019.1.0 ,I want to define the q and f the use them in the variational problem . Now , in dolfinx v0.6.0 , the q and v is ufl form,I didn’t know how to define the q and u to implement the same functionality

I dont understand your problem. You have a slightly different solution between dolfin and dolfinx, as you are using a slightly more accurate representation of q and f in dolfinx than in dolfin.

Your code runs and produces a result.

As a beginner for fenics, I’m sorry for my naive question.

when I just modify the value of uD from 3 to 1 , the results of dolfinx and fenics are completely different, which is my major confusion.
I want to know why and what causes so much difference. the above(values range in [0,1]) is in fenics v2019.1.0, and the below (values range in [0,2.5+ ]) is in dolfinx vq0.6.0
image
image

Also , I found that when I change the FunctionSpace to the second-order finite element

the results will same as i that in fenics v2019.1.0( V is first-order finite element) 。

You have different ranges on your color map above, so I cant say if they are different or not.

You have also not produced your visualization/plotting script/procedure.

You have still not produced a reproducible example, as you haven’t supplied enough info to reproduce the problem.