Skip to content

Commit d7e7868

Browse files
committed
Merge branch 'master' of github.com:gridap/GridapDistributed.jl into polytopal
2 parents c40fe7a + 889ec8f commit d7e7868

6 files changed

Lines changed: 209 additions & 92 deletions

File tree

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
arch:
3333
- x64
3434
steps:
35-
- uses: actions/checkout@v5
35+
- uses: actions/checkout@v6
3636
- uses: julia-actions/setup-julia@v2
3737
with:
3838
version: ${{ matrix.version }}
@@ -60,7 +60,7 @@ jobs:
6060
arch:
6161
- x64
6262
steps:
63-
- uses: actions/checkout@v5
63+
- uses: actions/checkout@v6
6464
- uses: julia-actions/cache@v2
6565
- uses: julia-actions/setup-julia@v2
6666
with:
@@ -83,7 +83,7 @@ jobs:
8383
name: Documentation
8484
runs-on: ubuntu-latest
8585
steps:
86-
- uses: actions/checkout@v5
86+
- uses: actions/checkout@v6
8787
- uses: julia-actions/setup-julia@v2
8888
with:
8989
version: '1.10'

NEWS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
- Added further support for polytopal methods and meshes. Since PR[#192](https://github.com/gridap/GridapDistributed.jl/pull/192).
1313
- Added new methods to ensure consistent orientation of faces across processors. Since PR[#192](https://github.com/gridap/GridapDistributed.jl/pull/192).
1414
- Added a new function `restrict_gids` to create a subsets of gids. Since PR[#192](https://github.com/gridap/GridapDistributed.jl/pull/192).
15+
- New overloads for the `TrialFESpace` constructor where the data to be imposed is passed as a `DistributedCellField`. Since PR[#185](https://github.com/gridap/GridapDistributed.jl/pull/185).
16+
- Added missing `FESpace` constructors for distributed triangulations specialized for the RT FEs case. Since PR[#188](https://github.com/gridap/GridapDistributed.jl/pull/188)
17+
- Added optional argument `isconsistent` to interpolate functions. Since PR[#190](https://github.com/gridap/GridapDistributed.jl/pull/190).
1518

1619
## [0.4.10] - 2025-09-29
1720

src/DivConformingFESpaces.jl

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,78 @@
1-
21
function FESpaces.FESpace(model::DistributedDiscreteModel,
32
reffe::Tuple{RaviartThomas,Any,Any};
4-
conformity=nothing,kwargs...)
3+
conformity=nothing,
4+
split_own_and_ghost=false,
5+
constraint=nothing,
6+
kwargs...)
57

68
cell_reffes = map(local_views(model)) do m
79
basis,reffe_args,reffe_kwargs = reffe
810
cell_reffe = ReferenceFE(m,basis,reffe_args...;reffe_kwargs...)
911
end
10-
_common_fe_space_constructor(model,cell_reffes;conformity,kwargs...)
12+
_common_fe_space_constructor(model,cell_reffes;conformity,split_own_and_ghost,kwargs...)
1113
end
1214

1315
function FESpace(model::DistributedDiscreteModel,
1416
reffe::GenericRefFE{RaviartThomas};
15-
conformity=nothing, kwargs...)
17+
conformity=nothing,
18+
split_own_and_ghost=false,
19+
constraint=nothing,
20+
kwargs...)
1621
cell_reffes = map(local_views(model)) do m
1722
Fill(reffe,num_cells(m))
1823
end
19-
_common_fe_space_constructor(model,cell_reffes;conformity,kwargs...)
24+
_common_fe_space_constructor(model,cell_reffes;conformity,split_own_and_ghost,kwargs...)
25+
end
26+
27+
function _setup_dmodel_and_dtrian(_trian::DistributedTriangulation)
28+
trian = add_ghost_cells(_trian)
29+
models = map(local_views(trian)) do t
30+
get_active_model(t)
31+
end
32+
GenericDistributedDiscreteModel(models, generate_cell_gids(trian)), trian
33+
end
34+
35+
function FESpace(
36+
_trian::DistributedTriangulation,
37+
reffe::Tuple{RaviartThomas,Any,Any};
38+
conformity=nothing,
39+
split_own_and_ghost=false,
40+
constraint=nothing,kwargs...
41+
)
42+
dmodel, dtrian = _setup_dmodel_and_dtrian(_trian)
43+
cell_reffes = map(local_views(dmodel)) do m
44+
basis,reffe_args,reffe_kwargs = reffe
45+
cell_reffe = ReferenceFE(m,basis,reffe_args...;reffe_kwargs...)
46+
end
47+
_common_fe_space_constructor(dmodel,cell_reffes,dtrian;conformity,split_own_and_ghost,kwargs...)
48+
end
49+
50+
function FESpace(_trian::DistributedTriangulation,
51+
reffe::GenericRefFE{RaviartThomas};
52+
conformity=nothing,
53+
split_own_and_ghost=false,
54+
constraint=nothing,
55+
kwargs...)
56+
dmodel, dtrian = _setup_dmodel_and_dtrian(_trian)
57+
cell_reffes = map(local_views(dmodel)) do m
58+
Fill(reffe,num_cells(m))
59+
end
60+
_common_fe_space_constructor(dmodel,cell_reffes,dtrian;conformity,split_own_and_ghost,kwargs...)
61+
end
62+
63+
function _common_fe_space_constructor(model,cell_reffes,trian;conformity,split_own_and_ghost,kwargs...)
64+
sign_flips=_generate_sign_flips(model,cell_reffes)
65+
spaces = map(local_views(model),sign_flips,cell_reffes,local_views(trian)) do m,sign_flip,cell_reffe,trian
66+
conf = Conformity(testitem(cell_reffe),conformity)
67+
cell_fe = CellFE(m,cell_reffe,conf,sign_flip)
68+
FESpace(m, cell_fe; trian=trian, kwargs...)
69+
end
70+
gids = generate_gids(model,spaces)
71+
vector_type = _find_vector_type(spaces,gids;split_own_and_ghost=split_own_and_ghost)
72+
DistributedSingleFieldFESpace(spaces,gids,trian,vector_type)
2073
end
2174

22-
function _common_fe_space_constructor(model,cell_reffes;conformity,kwargs...)
75+
function _common_fe_space_constructor(model,cell_reffes;conformity,split_own_and_ghost,kwargs...)
2376
sign_flips=_generate_sign_flips(model,cell_reffes)
2477
spaces = map(local_views(model),sign_flips,cell_reffes) do m,sign_flip,cell_reffe
2578
conf = Conformity(testitem(cell_reffe),conformity)
@@ -28,7 +81,7 @@ function _common_fe_space_constructor(model,cell_reffes;conformity,kwargs...)
2881
end
2982
gids = generate_gids(model,spaces)
3083
trian = DistributedTriangulation(map(get_triangulation,spaces),model)
31-
vector_type = _find_vector_type(spaces,gids)
84+
vector_type = _find_vector_type(spaces,gids;split_own_and_ghost=split_own_and_ghost)
3285
DistributedSingleFieldFESpace(spaces,gids,trian,vector_type)
3386
end
3487

src/FESpaces.jl

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,21 @@ function FESpaces.TrialFESpace!(f::DistributedSingleFieldFESpace,fun)
414414
DistributedSingleFieldFESpace(spaces,f.gids,f.trian,f.vector_type,f.metadata)
415415
end
416416

417+
function FESpaces.TrialFESpace(f::DistributedSingleFieldFESpace,cf::DistributedCellField)
418+
spaces = map(local_views(f),local_views(cf)) do s, field
419+
TrialFESpace(s,field)
420+
end
421+
DistributedSingleFieldFESpace(spaces,f.gids,f.trian,f.vector_type,f.metadata)
422+
end
423+
424+
function FESpaces.TrialFESpace(cf::DistributedCellField,f::DistributedSingleFieldFESpace)
425+
spaces = map(local_views(f),local_views(cf)) do s, field
426+
TrialFESpace(s,field)
427+
end
428+
DistributedSingleFieldFESpace(spaces,f.gids,f.trian,f.vector_type,f.metadata)
429+
end
430+
431+
417432
function FESpaces.HomogeneousTrialFESpace(f::DistributedSingleFieldFESpace)
418433
spaces = map(f.spaces) do s
419434
HomogeneousTrialFESpace(s)
@@ -441,67 +456,83 @@ function generate_gids(
441456
generate_gids(cell_gids,cell_to_ldofs,nldofs)
442457
end
443458

444-
function FESpaces.interpolate(u,f::DistributedSingleFieldFESpace)
459+
function FESpaces.interpolate(u,f::DistributedSingleFieldFESpace, isconsistent=false)
445460
free_values = zero_free_values(f)
446-
interpolate!(u,free_values,f)
461+
interpolate!(u,free_values,f,isconsistent)
447462
end
448463

449464
function FESpaces.interpolate!(
450-
u,free_values::AbstractVector,f::DistributedSingleFieldFESpace)
465+
u,
466+
free_values::AbstractVector,
467+
f::DistributedSingleFieldFESpace,
468+
isconsistent=false)
451469
map(f.spaces,local_views(free_values)) do V,vec
452470
interpolate!(u,vec,V)
453471
end
454-
FEFunction(f,free_values)
472+
FEFunction(f,free_values,isconsistent)
455473
end
456474

457475
function FESpaces.interpolate!(
458-
u::DistributedCellField,free_values::AbstractVector,f::DistributedSingleFieldFESpace)
459-
map(local_views(u),f.spaces,local_views(free_values)) do ui,V,vec
460-
interpolate!(ui,vec,V)
476+
u::DistributedCellField,
477+
free_values::AbstractVector,
478+
f::DistributedSingleFieldFESpace,
479+
isconsistent=false)
480+
map(local_views(u),f.spaces,local_views(free_values)) do u, V,vec
481+
interpolate!(u,vec,V)
461482
end
462-
FEFunction(f,free_values)
483+
FEFunction(f,free_values,isconsistent)
463484
end
464485

465-
function FESpaces.interpolate_dirichlet(u, f::DistributedSingleFieldFESpace)
486+
function FESpaces.interpolate_dirichlet(u, f::DistributedSingleFieldFESpace, isconsistent=false)
466487
free_values = zero_free_values(f)
467488
dirichlet_values = get_dirichlet_dof_values(f)
468-
interpolate_dirichlet!(u,free_values,dirichlet_values,f)
489+
interpolate_dirichlet!(u,free_values,dirichlet_values,f,isconsistent)
469490
end
470491

471492
function FESpaces.interpolate_dirichlet!(
472493
u, free_values::AbstractVector,
473494
dirichlet_values::AbstractArray{<:AbstractVector},
474-
f::DistributedSingleFieldFESpace)
495+
f::DistributedSingleFieldFESpace, isconsistent=false)
475496
map(f.spaces,local_views(free_values),dirichlet_values) do V,fvec,dvec
476497
interpolate_dirichlet!(u,fvec,dvec,V)
477498
end
478-
FEFunction(f,free_values,dirichlet_values)
499+
FEFunction(f,free_values,dirichlet_values,isconsistent)
500+
end
501+
502+
function FESpaces.interpolate_dirichlet!(
503+
u::DistributedCellField, free_values::AbstractVector,
504+
dirichlet_values::AbstractArray{<:AbstractVector},
505+
f::DistributedSingleFieldFESpace, isconsistent=false)
506+
map(local_views(u), f.spaces,local_views(free_values),dirichlet_values) do u,V,fvec,dvec
507+
interpolate_dirichlet!(u,fvec,dvec,V)
508+
end
509+
FEFunction(f,free_values,dirichlet_values,isconsistent)
479510
end
480511

481-
function FESpaces.interpolate_everywhere(u, f::DistributedSingleFieldFESpace)
512+
function FESpaces.interpolate_everywhere(u, f::DistributedSingleFieldFESpace, isconsistent=false)
482513
free_values = zero_free_values(f)
483514
dirichlet_values = get_dirichlet_dof_values(f)
484-
interpolate_everywhere!(u,free_values,dirichlet_values,f)
515+
interpolate_everywhere!(u,free_values,dirichlet_values,f,isconsistent)
485516
end
486517

487518
function FESpaces.interpolate_everywhere!(
488519
u, free_values::AbstractVector,
489520
dirichlet_values::AbstractArray{<:AbstractVector},
490-
f::DistributedSingleFieldFESpace)
521+
f::DistributedSingleFieldFESpace, isconsistent=false)
491522
map(f.spaces,local_views(free_values),dirichlet_values) do V,fvec,dvec
492523
interpolate_everywhere!(u,fvec,dvec,V)
493524
end
494-
FEFunction(f,free_values,dirichlet_values)
525+
FEFunction(f,free_values,dirichlet_values,isconsistent)
495526
end
496527

497528
function FESpaces.interpolate_everywhere!(
498529
u::DistributedCellField, free_values::AbstractVector,
499530
dirichlet_values::AbstractArray{<:AbstractVector},
500-
f::DistributedSingleFieldFESpace)
531+
f::DistributedSingleFieldFESpace, isconsistent=false)
501532
map(local_views(u),f.spaces,local_views(free_values),dirichlet_values) do ui,V,fvec,dvec
502533
interpolate_everywhere!(ui,fvec,dvec,V)
503534
end
504-
FEFunction(f,free_values,dirichlet_values)
535+
FEFunction(f,free_values,dirichlet_values,isconsistent)
505536
end
506537

507538
# Factories
@@ -852,13 +883,15 @@ end
852883
# which does not properly interpolate the function provided.
853884
# With this change, we are interpolating in the unconstrained space and then
854885
# substracting the mean.
855-
function FESpaces.interpolate!(u,free_values::AbstractVector,f::DistributedZeroMeanFESpace)
886+
function FESpaces.interpolate!(u,free_values::AbstractVector,
887+
f::DistributedZeroMeanFESpace, isconsistent=false)
856888
dirichlet_values = get_dirichlet_dof_values(f)
857-
interpolate_everywhere!(u,free_values,dirichlet_values,f)
889+
interpolate_everywhere!(u,free_values,dirichlet_values,f,isconsistent)
858890
end
859-
function FESpaces.interpolate!(u::DistributedCellField,free_values::AbstractVector,f::DistributedZeroMeanFESpace)
891+
function FESpaces.interpolate!(u::DistributedCellField,free_values::AbstractVector,
892+
f::DistributedZeroMeanFESpace, isconsistent=false)
860893
dirichlet_values = get_dirichlet_dof_values(f)
861-
interpolate_everywhere!(u,free_values,dirichlet_values,f)
894+
interpolate_everywhere!(u,free_values,dirichlet_values,f,isconsistent)
862895
end
863896

864897
function _compute_new_distributed_fixedval(

test/DivConformingTests.jl

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,10 @@ function setup_p2_model()
5959
Gridap.Geometry.UnstructuredDiscreteModel(grid)
6060
end
6161

62-
function f(model,reffe)
62+
function f(model,reffe,trian,das)
6363
V = FESpace(model,reffe,conformity=:Hdiv)
6464
U = TrialFESpace(V)
6565

66-
das = FullyAssembledRows()
67-
trian = Triangulation(das,model)
6866
degree = 2
6967
= Measure(trian,degree)
7068
a(u,v) = ( uv )*
@@ -82,6 +80,7 @@ function f(model,reffe)
8280
dc2 = dc.contribs.items[2]
8381
c1 = Gridap.CellData.get_contribution(dc1,t1)
8482
c2 = Gridap.CellData.get_contribution(dc2,t2)
83+
8584
tol = 1.0e-12
8685
@test norm(c1[1]-c2[2]) < tol
8786
@test norm(c1[2]-c2[1]) < tol
@@ -122,10 +121,18 @@ function main(distribute,nranks)
122121

123122
model = GridapDistributed.DistributedDiscreteModel(models,gids)
124123

124+
das = FullyAssembledRows()
125+
trian = Triangulation(das,model)
126+
125127
reffe=ReferenceFE(raviart_thomas,Float64,0)
126-
f(model,reffe)
128+
f(model,reffe,trian,das)
129+
f(trian,reffe,trian,das)
130+
f(Triangulation(model),reffe,trian,das)
131+
127132
reffe=ReferenceFE(QUAD, raviart_thomas, 0)
128-
f(model,reffe)
133+
f(model,reffe,trian,das)
134+
f(trian,reffe,trian,das)
135+
f(Triangulation(model),reffe,trian,das)
129136
end
130137

131138
end # module

0 commit comments

Comments
 (0)