Hi everybody,
I’m a FEniCS and python newbie, and I am trying to implement a small program
that solves Gauss’s law.
I already have something works reasonable well in a uniform mesh, and I am
trying to implement adaptive meshes.
I have several problems on this respect.
The first one is with the AdaptiveLinearSolve.
I am using the Energy as the functional to be optimised (i.e. E=0.5*rho*phi,
rho being the charge distribution, phi being the potential calculated with
Linear solver)
Please find the minimal portion of the script attached.
The problem is, the energy calculated by the assemble, and reported in the
solver.summary() are very different.
Also, rho being a normalised gaussian charge distribution, it should integrate
to 1 (which it does in an uniform mesh with converged lattice space), however,
after AdaptiveLinearSolve, the integral goes to 0.1 or some other strange
value.
I suspect the Function(V) does not use the optimised mesh but the original
coarse mesh. Can it be the case? What else can it be? How can it be corrected?
Best,
Baris
Minimal portion of the script (celldm,alat,MeshSize are predetermined
constants; epsilon,rho are predetermined functions; DirichletXYZ is a python
class constructed using “near” and on_boundary)
mesh =
BoxMesh(0.0,0.0,0.0,celldm1*alat,celldm2*alat,celldm3*alat,MeshSize,MeshSize,MeshSize)
V = FunctionSpace(mesh, "CG", 1)
u0 = Constant(0.0)
db =
DrichletXYZ(xmin=0.0,xmax=celldm1*alat,ymin=0.0,ymax=celldm2*alat,zmin=0.0,zmax=celldm3*alat)
bc = DirichletBC(V, u0, db)
bcs = [bc]
phi = TrialFunction(V)
psi = TestFunction(V)
a = (epsilon*inner(grad(phi), grad(psi)))*dx
L = 4*pi*rho*psi*dx
u = Function(V)
E = 0.5*u*rho*dx
problem = LinearVariationalProblem(a, L, u,bc)
solver = AdaptiveLinearVariationalSolver(problem, E)
solver.parameters["error_control"]["dual_variational_solver"]["linear_solver"]
= "gmres"
solver.parameters["linear_variational_solver"]["linear_solver"] = "gmres"
solver.solve(MeshTol)
solver.summary()
# Report results
chg_ongrid=Function(V)
chg_ongrid.interpolate(rho)
chg = chg_ongrid*dx
chg_int = assemble(chg)
#E integral
E = u*rho*dx
E_int = assemble(E)
E_int = E_int*0.5
_______________________________________________
fenics-support mailing list
[email protected]
http://fenicsproject.org/mailman/listinfo/fenics-support