diff --git a/src/function.jl b/src/function.jl index c454677c660a901c677de784cd1f4d659fff4f43..31ffbacccbc54a480420aafa6f98ea18209b0ce7 100644 --- a/src/function.jl +++ b/src/function.jl @@ -211,8 +211,9 @@ function integrate(mesh::Mesh, expr; params...) end function bind!(f::FeFunction, cell) - # TODO: make this non-allocating - f.ldata .= vec(f.data[f.space.dofmap[:, :, cell]]) + gdofs_view = view(f.space.dofmap, :, :, cell) + gdofs = SArray{Tuple{prod(f.space.size) * ndofs(f.space.element)}}(gdofs_view) + f.ldata .= f.data[gdofs] return f end @@ -223,6 +224,7 @@ evaluate(f::FeFunction, x) = evaluate(f.space, f.ldata, x) bind!(c, cell) = c evaluate(c, xloc) = c + # TODO: inherit from some abstract function type struct Derivative{F, M} f::F @@ -242,6 +244,7 @@ function bind!(df::Derivative, cell) delmap = jacobian(elmap(df.f.space.mesh, cell), SA[0., 0.]) df.delmapinv .= inv(delmap) end + function evaluate(df::Derivative, x) # size: (:, d) jac = jacobian(x -> evaluate(df.f.space, df.f.ldata, x), x)