@@ -277,18 +277,45 @@ function FESpaces.get_free_dof_ids(fs::DistributedSingleFieldFESpace)
277277 fs. gids
278278end
279279
280+ function FESpaces. get_dirichlet_dof_values (U:: DistributedSingleFieldFESpace )
281+ map_parts (get_dirichlet_dof_values,U. spaces)
282+ end
283+
284+ function FESpaces. FEFunction (
285+ f:: DistributedSingleFieldFESpace ,free_values:: AbstractVector ,isconsistent= false )
286+ _EvaluationFunction (FEFunction,f,free_values,isconsistent)
287+ end
288+
280289function FESpaces. FEFunction (
290+ f:: DistributedSingleFieldFESpace ,free_values:: AbstractVector ,
291+ dirichlet_values:: AbstractPData{<:AbstractVector} ,isconsistent= false )
292+ _EvaluationFunction (FEFunction,f,free_values,dirichlet_values,isconsistent)
293+ end
294+
295+ function FESpaces. EvaluationFunction (
296+ f:: DistributedSingleFieldFESpace ,free_values:: AbstractVector ,isconsistent= false )
297+ _EvaluationFunction (EvaluationFunction,f,free_values,isconsistent)
298+ end
299+
300+ function FESpaces. EvaluationFunction (
301+ f:: DistributedSingleFieldFESpace ,free_values:: AbstractVector ,
302+ dirichlet_values:: AbstractPData{<:AbstractVector} ,isconsistent= false )
303+ _EvaluationFunction (EvaluationFunction,f,free_values,dirichlet_values,isconsistent)
304+ end
305+
306+ function _EvaluationFunction (func,
281307 f:: DistributedSingleFieldFESpace ,free_values:: AbstractVector ,isconsistent= false )
282308 local_vals = consistent_local_views (free_values,f. gids,isconsistent)
283- fields = map_parts (FEFunction ,f. spaces,local_vals)
309+ fields = map_parts (func ,f. spaces,local_vals)
284310 metadata = DistributedFEFunctionData (free_values)
285311 DistributedCellField (fields,metadata)
286312end
287313
288- function FESpaces. EvaluationFunction (
289- f:: DistributedSingleFieldFESpace ,free_values:: AbstractVector ,isconsistent= false )
314+ function _EvaluationFunction (func,
315+ f:: DistributedSingleFieldFESpace ,free_values:: AbstractVector ,
316+ dirichlet_values:: AbstractPData{<:AbstractVector} ,isconsistent= false )
290317 local_vals = consistent_local_views (free_values,f. gids,isconsistent)
291- fields = map_parts (EvaluationFunction ,f. spaces,local_vals)
318+ fields = map_parts (func ,f. spaces,local_vals,dirichlet_values )
292319 metadata = DistributedFEFunctionData (free_values)
293320 DistributedCellField (fields,metadata)
294321end
@@ -322,6 +349,20 @@ function FESpaces.TrialFESpace(fun,f::DistributedSingleFieldFESpace)
322349 DistributedSingleFieldFESpace (spaces,f. gids,f. vector_type)
323350end
324351
352+ function FESpaces. TrialFESpace! (f:: DistributedSingleFieldFESpace ,fun)
353+ spaces = map_parts (f. spaces) do s
354+ TrialFESpace! (s,fun)
355+ end
356+ DistributedSingleFieldFESpace (spaces,f. gids,f. vector_type)
357+ end
358+
359+ function FESpaces. HomogeneousTrialFESpace (f:: DistributedSingleFieldFESpace )
360+ spaces = map_parts (f. spaces) do s
361+ HomogeneousTrialFESpace (s)
362+ end
363+ DistributedSingleFieldFESpace (spaces,f. gids,f. vector_type)
364+ end
365+
325366function generate_gids (
326367 model:: DistributedDiscreteModel ,
327368 spaces:: AbstractPData{<:SingleFieldFESpace} )
@@ -343,6 +384,56 @@ function FESpaces.interpolate!(
343384 FEFunction (f,free_values)
344385end
345386
387+ function FESpaces. interpolate! (
388+ u:: DistributedCellField ,free_values:: AbstractVector ,f:: DistributedSingleFieldFESpace )
389+ map_parts (local_views (u),f. spaces,local_views (free_values)) do ui,V,vec
390+ interpolate! (ui,vec,V)
391+ end
392+ FEFunction (f,free_values)
393+ end
394+
395+ function FESpaces. interpolate_dirichlet (u, f:: DistributedSingleFieldFESpace )
396+ free_values = zero_free_values (f)
397+ dirichlet_values = get_dirichlet_dof_values (f)
398+ interpolate_dirichlet! (u,free_values,dirichlet_values,f)
399+ end
400+
401+ function FESpaces. interpolate_dirichlet! (
402+ u, free_values:: AbstractVector ,
403+ dirichlet_values:: AbstractPData{<:AbstractVector} ,
404+ f:: DistributedSingleFieldFESpace )
405+ map_parts (f. spaces,local_views (free_values),dirichlet_values) do V,fvec,dvec
406+ interpolate_dirichlet! (u,fvec,dvec,V)
407+ end
408+ FEFunction (f,free_values,dirichlet_values)
409+ end
410+
411+ function FESpaces. interpolate_everywhere (u, f:: DistributedSingleFieldFESpace )
412+ free_values = zero_free_values (f)
413+ dirichlet_values = get_dirichlet_dof_values (f)
414+ interpolate_everywhere! (u,free_values,dirichlet_values,f)
415+ end
416+
417+ function FESpaces. interpolate_everywhere! (
418+ u, free_values:: AbstractVector ,
419+ dirichlet_values:: AbstractPData{<:AbstractVector} ,
420+ f:: DistributedSingleFieldFESpace )
421+ map_parts (f. spaces,local_views (free_values),dirichlet_values) do V,fvec,dvec
422+ interpolate_everywhere! (u,fvec,dvec,V)
423+ end
424+ FEFunction (f,free_values,dirichlet_values)
425+ end
426+
427+ function FESpaces. interpolate_everywhere! (
428+ u:: DistributedCellField , free_values:: AbstractVector ,
429+ dirichlet_values:: AbstractPData{<:AbstractVector} ,
430+ f:: DistributedSingleFieldFESpace )
431+ map_parts (local_views (u),f. spaces,local_views (free_values),dirichlet_values) do ui,V,fvec,dvec
432+ interpolate_everywhere! (ui,fvec,dvec,V)
433+ end
434+ FEFunction (f,free_values,dirichlet_values)
435+ end
436+
346437# Factories
347438
348439function FESpaces. FESpace (model:: DistributedDiscreteModel ,reffe;kwargs... )
0 commit comments