@@ -437,22 +437,26 @@ function FESpaces.HomogeneousTrialFESpace(f::DistributedSingleFieldFESpace)
437437end
438438
439439function generate_gids (
440- model:: DistributedDiscreteModel{Dc} ,
440+ model:: DistributedDiscreteModel ,
441441 spaces:: AbstractArray{<:SingleFieldFESpace}
442- ) where Dc
443- cell_to_ldofs = map (get_cell_dof_ids,spaces)
444- nldofs = map (num_free_dofs,spaces)
442+ )
445443 cell_gids = get_cell_gids (model)
446- generate_gids (cell_gids,cell_to_ldofs,nldofs )
444+ generate_gids (cell_gids,spaces )
447445end
448446
449447function generate_gids (
450- trian:: DistributedTriangulation{Dc} ,
448+ trian:: DistributedTriangulation ,
451449 spaces:: AbstractArray{<:SingleFieldFESpace}
452- ) where Dc
450+ )
451+ cell_gids = generate_cell_gids (trian)
452+ generate_gids (cell_gids,spaces)
453+ end
454+
455+ function generate_gids (
456+ cell_gids:: PRange , spaces:: AbstractArray{<:SingleFieldFESpace}
457+ )
453458 cell_to_ldofs = map (get_cell_dof_ids,spaces)
454459 nldofs = map (num_free_dofs,spaces)
455- cell_gids = generate_cell_gids (trian)
456460 generate_gids (cell_gids,cell_to_ldofs,nldofs)
457461end
458462
@@ -537,30 +541,76 @@ end
537541
538542# Factories
539543
544+ # function FESpaces.FESpace(
545+ # model::DistributedDiscreteModel,reffe;split_own_and_ghost=false,constraint=nothing,kwargs...
546+ # )
547+ # spaces = map(local_views(model)) do m
548+ # FESpace(m,reffe;kwargs...)
549+ # end
550+ # gids = generate_gids(model,spaces)
551+ # trian = DistributedTriangulation(map(get_triangulation,spaces),model)
552+ # vector_type = _find_vector_type(spaces,gids;split_own_and_ghost=split_own_and_ghost)
553+ # space = DistributedSingleFieldFESpace(spaces,gids,trian,vector_type)
554+ # return _add_distributed_constraint(space,reffe,constraint)
555+ # end
556+ #
557+ # function FESpaces.FESpace(
558+ # _trian::DistributedTriangulation,reffe;split_own_and_ghost=false,constraint=nothing,kwargs...
559+ # )
560+ # trian = add_ghost_cells(_trian)
561+ # spaces = map(local_views(trian)) do t
562+ # FESpace(t,reffe;kwargs...)
563+ # end
564+ # gids = generate_gids(trian,spaces)
565+ # vector_type = _find_vector_type(spaces,gids;split_own_and_ghost=split_own_and_ghost)
566+ # space = DistributedSingleFieldFESpace(spaces,gids,trian,vector_type)
567+ # return _add_distributed_constraint(space,reffe,constraint)
568+ # end
569+
540570function FESpaces. FESpace (
541- model:: DistributedDiscreteModel ,reffe;split_own_and_ghost = false ,constraint = nothing , kwargs...
571+ model:: DistributedDiscreteModel ,args ... ; kwargs...
542572)
543- spaces = map (local_views (model)) do m
544- FESpace (m,reffe;kwargs... )
545- end
546- gids = generate_gids (model,spaces)
547- trian = DistributedTriangulation (map (get_triangulation,spaces),model)
548- vector_type = _find_vector_type (spaces,gids;split_own_and_ghost= split_own_and_ghost)
549- space = DistributedSingleFieldFESpace (spaces,gids,trian,vector_type)
550- return _add_distributed_constraint (space,reffe,constraint)
573+ trian = Triangulation (with_ghost,model)
574+ cell_gids = get_cell_gids (model)
575+ DistributedSingleFieldFESpace (model,trian,cell_gids,args... ;kwargs... )
551576end
552577
553578function FESpaces. FESpace (
554- _trian:: DistributedTriangulation ,reffe;split_own_and_ghost = false ,constraint = nothing , kwargs...
579+ _trian:: DistributedTriangulation ,args ... ; kwargs...
555580)
556581 trian = add_ghost_cells (_trian)
557- spaces = map (local_views (trian)) do t
558- FESpace (t,reffe;kwargs... )
582+ cell_gids = generate_cell_gids (trian)
583+ model = DistributedDiscreteModel (map (get_active_model,local_views (trian)), cell_gids)
584+ DistributedSingleFieldFESpace (model,trian,cell_gids,args... ;kwargs... )
585+ end
586+
587+ function DistributedSingleFieldFESpace (
588+ model:: DistributedDiscreteModel ,
589+ trian:: DistributedTriangulation ,
590+ cell_gids:: PRange , reffe; kwargs...
591+ )
592+ cell_reffe = map (local_views (model)) do model
593+ ReferenceFE (model,reffe)
559594 end
560- gids = generate_gids (trian,spaces)
561- vector_type = _find_vector_type (spaces,gids;split_own_and_ghost= split_own_and_ghost)
595+ DistributedSingleFieldFESpace (model,trian,cell_gids,cell_reffe;kwargs... )
596+ end
597+
598+ function DistributedSingleFieldFESpace (
599+ model:: DistributedDiscreteModel , # Active model, not bg model
600+ trian:: DistributedTriangulation ,
601+ cell_gids:: PRange ,
602+ cell_reffe:: AbstractArray ;
603+ split_own_and_ghost= false ,
604+ constraint= nothing ,
605+ kwargs...
606+ )
607+ spaces = map (local_views (model),local_views (trian),cell_reffe) do model, trian, cell_reffe
608+ FESpace (model,cell_reffe;trian,kwargs... )
609+ end
610+ gids = generate_gids (cell_gids,spaces)
611+ vector_type = _find_vector_type (spaces,gids;split_own_and_ghost)
562612 space = DistributedSingleFieldFESpace (spaces,gids,trian,vector_type)
563- return _add_distributed_constraint (space,reffe ,constraint)
613+ return _add_distributed_constraint (space,cell_reffe ,constraint)
564614end
565615
566616function _find_vector_type (spaces,gids;split_own_and_ghost= false )
@@ -595,6 +645,16 @@ function _add_distributed_constraint(
595645 _add_distributed_constraint (F,order,constraint)
596646end
597647
648+ function _add_distributed_constraint (
649+ F:: DistributedFESpace ,cell_reffe:: AbstractArray ,constraint
650+ )
651+ reffe = map (cell_reffe) do cell_reffe
652+ reffes, ctypes = compress_cell_data (cell_reffe)
653+ return only (reffes)
654+ end |> getany
655+ _add_distributed_constraint (F,reffe,constraint)
656+ end
657+
598658function _add_distributed_constraint (F:: DistributedFESpace ,order:: Integer ,constraint)
599659 if isnothing (constraint)
600660 V = F
0 commit comments