I am trying to assign a function defined on a mesh (e.g. a unit square mesh) to another function defined on another mesh (half of the unit squaremesh with the same mesh resolution and same type and order of the element as the previous function).
I try using the FunctionAssigner but this only work with functions defined on the same mesh. So, I would like to ask if there is any other functionalities that extend the FunctionAssigner ability to make the assignment possible with function defined on different meshes?
ps. I would like to preserve the connection between the assigning function and the receiving function as I get from the FunctionAssigner accordingt to the below code and picture.
from fenics import *
from fenics_adjoint import *
import time
mesh = UnitSquareMesh(256, 256)
V = FunctionSpace(mesh, "CG", 1)
VV = VectorFunctionSpace(mesh, "CG", 1)
# Define function
vv = Function(VV)
u0 = Function(V)
u1 = Function(V)
# Assign mixed function from two scalar functions using FunctionAssigner
assigner = FunctionAssigner(VV, [V, V])
t0 = time.time()
assigner.assign(vv, [u0, u1])
ta1 = time.time() - t0
tape = get_working_tape()
tape.visualise()
There is no functionality with dolfin-adjoint for cross mesh assignment. Hopefully, in the future this might supported, with the MeshView functionality recently added to dolfin. However this is not on anyone’s list of priorities.
What you could do is to use the full mesh for both problems, using A.ident_zeros() on the assembled matrix to make sure the matrix is invertible if only consisting of parts of the mesh.
This method is for instance used to project facet-normals (How to plot normal unit vector of faces in a 2D mesh?) and compute mesh curvature (How to compute curvature of a boundary)
No, it does not.
What i meant is that since this feature is in dolfin, it would be natural to extend dolfin-adjoint. However, this requires an effort, and Im not sure who has the time for this as of now.
This means that you can solve problems on a sub space og your mesh, with the full function space, for instance, solving an eq on half of the mesh. Note that this is only properly supported for the same co dimension, as an interface gradient in 2D and 3D differs.
Is it also possible to directly apply the ident_zeros() with nonlinear variational problem (with mixed-element)? I think in this case, the nonlinear problem needs to be solved using the lower level solver (e.g. Picard iteration or Newton method at algebraic equation, ref), but I am not sure if there is easier way to do this.