Skip to content

Commit 95bdafb

Browse files
DistributedPoissonDGTests.jl and MPIPETScDistributedPoissonDGTests.jl
working with high level API
1 parent cc56f4d commit 95bdafb

5 files changed

+128
-91
lines changed

src/DistributedAssemblers.jl

+31-1
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,36 @@ end
544544
function Gridap.Geometry.BoundaryTriangulation(strategy::DistributedAssemblyStrategy,
545545
model::DistributedDiscreteModel;kwargs_triangulation...)
546546
DistributedData(model,strategy) do part, (model,gids), strategy
547-
BoundaryTriangulation(strategy,part,gids,model;kwargs_triangulation...)
547+
BoundaryTriangulation(strategy,part,gids,model;kwargs_triangulation...)
548+
end
549+
end
550+
551+
function Gridap.Geometry.SkeletonTriangulation(model::DistributedDiscreteModel;kwargs_triangulation...)
552+
AS=default_assembly_strategy_type(get_comm(model))
553+
SkeletonTriangulation(AS, model; kwargs_triangulation...)
554+
end
555+
556+
function Gridap.Geometry.SkeletonTriangulation(strategy::Type{<:AssemblyStrategy},
557+
model::DistributedDiscreteModel;kwargs_triangulation...)
558+
DistributedData(model) do part, (model,gids)
559+
SkeletonTriangulation(strategy,part,gids,model;kwargs_triangulation...)
560+
end
561+
end
562+
563+
function Gridap.Geometry.SkeletonTriangulation(strategy::AssemblyStrategy,
564+
part,gids,model::DiscreteModel;kwargs_triangulation...)
565+
SkeletonTriangulation(typeof(strategy),part,gids,model;kwargs_triangulation...)
566+
end
567+
568+
function Gridap.Geometry.SkeletonTriangulation(strategy::Type{<:AssemblyStrategy},
569+
part,gids,model::DiscreteModel;kwargs_triangulation...)
570+
portion=proc_local_triangulation_portion_type(strategy)
571+
SkeletonTriangulation(portion,part,gids,model;kwargs_triangulation...)
572+
end
573+
574+
function Gridap.Geometry.SkeletonTriangulation(strategy::DistributedAssemblyStrategy,
575+
model::DistributedDiscreteModel;kwargs_triangulation...)
576+
DistributedData(model,strategy) do part, (model,gids), strategy
577+
SkeletonTriangulation(strategy,part,gids,model;kwargs_triangulation...)
548578
end
549579
end

src/DistributedTriangulations.jl

+24-4
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,28 @@ end
7979

8080
#TO-DO: what does it mean OwnedCells and OwnedAndGhostCells for a SkeletonTriangulation?
8181
# Perhaps we should use a different type, with a more intention revealing name!
82-
function Gridap.Geometry.SkeletonTriangulation(portion::Type{OwnedCells},
82+
function Gridap.Geometry.SkeletonTriangulation(portion::Type{<:ProcLocalTriangulationPortion},
83+
part,gids,model::DiscreteModel;kwargs_triangulation...)
84+
@abstractmethod
85+
end
86+
87+
function Gridap.Geometry.SkeletonTriangulation(portion::Type{<:ProcLocalTriangulationPortion},
8388
model::DistributedDiscreteModel;kwargs_triangulation...)
84-
@notimplemented
89+
DistributedData(model) do part, (model,gids)
90+
SkeletonTriangulation(portion,part,gids,model;kwargs_triangulation...)
91+
end
92+
end
93+
94+
function Gridap.Geometry.SkeletonTriangulation(portion::Type{OwnedCells},
95+
part,gids,model::DiscreteModel;kwargs_triangulation...)
96+
trian=SkeletonTriangulation(model;kwargs_triangulation...)
97+
filter_cells_when_needed(portion,trian,part,gids)
8598
end
8699

87100
function Gridap.Geometry.SkeletonTriangulation(portion::Type{OwnedAndGhostCells},
88-
model::DistributedDiscreteModel,args_triangulation...;kwargs_triangulation...)
89-
@notimplemented
101+
part,gids,model::DiscreteModel;kwargs_triangulation...)
102+
trian=SkeletonTriangulation(model;kwargs_triangulation...)
103+
filter_cells_when_needed(portion,trian)
90104
end
91105

92106
function remove_ghost_cells(trian::Triangulation, part::Integer, gids::IndexSet)
@@ -125,3 +139,9 @@ end
125139
function include_ghost_cells(trian::RestrictedTriangulation)
126140
trian.oldtrian
127141
end
142+
143+
function Gridap.CellData.get_normal_vector(trian::DistributedData{<:Triangulation})
144+
DistributedData(trian) do part, trian
145+
Gridap.CellData.get_normal_vector(trian)
146+
end
147+
end

src/GridapHighLevelAPI.jl

+33
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,36 @@ function _get_field(a::DistributedData{<:MultiFieldCellField},field_id)
187187
a.single_fields[field_id]
188188
end
189189
end
190+
191+
function Gridap.CellData.jump(a::DistributedData{<:CellField})
192+
DistributedData(a) do part, a
193+
jump(a)
194+
end
195+
end
196+
197+
function Gridap.CellData.jump(a::DistributedData{<:SkeletonPair{<:CellField}})
198+
DistributedData(a) do part, a
199+
jump(a)
200+
end
201+
end
202+
203+
function Gridap.CellData.mean(a::DistributedData{<:CellField})
204+
DistributedData(a) do part, a
205+
mean(a)
206+
end
207+
end
208+
209+
for op in (:outer,:*,:dot)
210+
@eval begin
211+
function ($op)(a::DistributedData{<:CellField},b::DistributedData{<:SkeletonPair{<:CellField}})
212+
DistributedData(a,b) do part, a, b
213+
Operation($op)(a,b)
214+
end
215+
end
216+
function ($op)(a::DistributedData{<:SkeletonPair{<:CellField}},b::DistributedData{<:CellField})
217+
DistributedData(a,b) do part, a, b
218+
Operation($op)(a,b)
219+
end
220+
end
221+
end
222+
end

test/DistributedPoissonDGTests.jl

+20-43
Original file line numberDiff line numberDiff line change
@@ -47,41 +47,26 @@ function setup_fe_spaces(model)
4747
end
4848

4949
function run(comm,model,U,V,strategy)
50+
trian=Triangulation(strategy,model)
51+
=Measure(trian,degree)
5052

51-
function setup_dΩ(part,(model,gids),strategy)
52-
trian = Triangulation(strategy,model)
53-
Measure(trian,degree)
54-
end
55-
ddΩ = DistributedData(setup_dΩ,model,strategy)
53+
btrian=BoundaryTriangulation(strategy,model)
54+
= Measure(btrian,degree)
5655

57-
function setup_dΓ(part,(model,gids),strategy)
58-
trian = BoundaryTriangulation(strategy,model)
59-
Measure(trian,degree)
60-
end
61-
ddΓ = DistributedData(setup_dΓ,model,strategy)
62-
63-
function setup_dΛ(part,(model,gids),strategy)
64-
trian = SkeletonTriangulation(strategy,model)
65-
Measure(trian,degree)
66-
end
67-
ddΛ = DistributedData(setup_dΛ,model,strategy)
56+
strian=SkeletonTriangulation(strategy,model)
57+
= Measure(strian,degree)
6858

59+
n_Γ = get_normal_vector(btrian)
60+
n_Λ = get_normal_vector(strian)
6961

7062
function a(u,v)
71-
DistributedData(u,v,ddΩ,ddΓ,ddΛ) do part, ul, vl, dΩ, dΓ, dΛ
72-
n_Γ = get_normal_vector(dΓ.quad.trian)
73-
n_Λ = get_normal_vector(dΛ.quad.trian)
74-
( (vl)(ul) )*+
75-
( (γ/h)*vl*ul - vl*(n_Γ(ul)) - (n_Γ(vl))*ul )*+
76-
( (γ/h)*jump(vl*n_Λ)jump(ul*n_Λ) - jump(vl*n_Λ)mean((ul)) - mean((vl))jump(ul*n_Λ) )*
77-
end
63+
( (v)(u) )*+
64+
( (γ/h)*v*u - v*(n_Γ(u)) - (n_Γ(v))*u )*+
65+
( (γ/h)*jump(v*n_Λ)jump(u*n_Λ) - jump(v*n_Λ)mean((u)) - mean((v))jump(u*n_Λ) )*
7866
end
7967
function l(v)
80-
DistributedData(v,ddΩ,ddΓ) do part, vl, dΩ, dΓ
81-
n_Γ = get_normal_vector(dΓ.quad.trian)
82-
( vl*f )*+
83-
( (γ/h)*vl*ud - (n_Γ(vl))*ud )*
84-
end
68+
( v*f )*+
69+
( (γ/h)*v*ud - (n_Γ(v))*ud )*
8570
end
8671

8772
# Assembly
@@ -91,21 +76,13 @@ function run(comm,model,U,V,strategy)
9176
# FE solution
9277
uh = solve(op)
9378

94-
# Error norms and print solution
95-
sums = DistributedData(model, uh) do part, (model, gids), uh
96-
trian = Triangulation(model)
97-
owned_trian = remove_ghost_cells(trian, part, gids)
98-
= Measure(owned_trian, degree)
99-
e = u - uh
100-
l2(u) = ( uu )*
101-
h1(u) = ( uu + (u)(u) )*
102-
e_l2 = sum(l2(e))
103-
e_h1 = sum(h1(e))
104-
e_l2, e_h1
105-
end
106-
e_l2_h1 = gather(sums)
107-
e_l2 = sum(map(i -> i[1], e_l2_h1))
108-
e_h1 = sum(map(i -> i[2], e_l2_h1))
79+
trian = Triangulation(OwnedCells,model)
80+
= Measure(trian,degree)
81+
e = u - uh
82+
l2(u) = ( uu )*
83+
h1(u) = ( uu + (u)(u) )*
84+
e_l2 = sum(l2(e))
85+
e_h1 = sum(h1(e))
10986
tol = 1.0e-9
11087
println("$(e_l2) < $(tol)")
11188
println("$(e_h1) < $(tol)")

test/MPIPETScTests/MPIPETScDistributedPoissonDGTests.jl

+20-43
Original file line numberDiff line numberDiff line change
@@ -48,41 +48,26 @@ function setup_fe_spaces(model)
4848
end
4949

5050
function run(comm,model,U,V,strategy)
51+
trian=Triangulation(strategy,model)
52+
=Measure(trian,degree)
5153

52-
function setup_dΩ(part,(model,gids),strategy)
53-
trian = Triangulation(strategy,model)
54-
Measure(trian,degree)
55-
end
56-
ddΩ = DistributedData(setup_dΩ,model,strategy)
54+
btrian=BoundaryTriangulation(strategy,model)
55+
= Measure(btrian,degree)
5756

58-
function setup_dΓ(part,(model,gids),strategy)
59-
trian = BoundaryTriangulation(strategy,model)
60-
Measure(trian,degree)
61-
end
62-
ddΓ = DistributedData(setup_dΓ,model,strategy)
63-
64-
function setup_dΛ(part,(model,gids),strategy)
65-
trian = SkeletonTriangulation(strategy,model)
66-
Measure(trian,degree)
67-
end
68-
ddΛ = DistributedData(setup_dΛ,model,strategy)
57+
strian=SkeletonTriangulation(strategy,model)
58+
= Measure(strian,degree)
6959

60+
n_Γ = get_normal_vector(btrian)
61+
n_Λ = get_normal_vector(strian)
7062

7163
function a(u,v)
72-
DistributedData(u,v,ddΩ,ddΓ,ddΛ) do part, ul, vl, dΩ, dΓ, dΛ
73-
n_Γ = get_normal_vector(dΓ.quad.trian)
74-
n_Λ = get_normal_vector(dΛ.quad.trian)
75-
( (vl)(ul) )*+
76-
( (γ/h)*vl*ul - vl*(n_Γ(ul)) - (n_Γ(vl))*ul )*+
77-
( (γ/h)*jump(vl*n_Λ)jump(ul*n_Λ) - jump(vl*n_Λ)mean((ul)) - mean((vl))jump(ul*n_Λ) )*
78-
end
64+
( (v)(u) )*+
65+
( (γ/h)*v*u - v*(n_Γ(u)) - (n_Γ(v))*u )*+
66+
( (γ/h)*jump(v*n_Λ)jump(u*n_Λ) - jump(v*n_Λ)mean((u)) - mean((v))jump(u*n_Λ) )*
7967
end
8068
function l(v)
81-
DistributedData(v,ddΩ,ddΓ) do part, vl, dΩ, dΓ
82-
n_Γ = get_normal_vector(dΓ.quad.trian)
83-
( vl*f )*+
84-
( (γ/h)*vl*ud - (n_Γ(vl))*ud )*
85-
end
69+
( v*f )*+
70+
( (γ/h)*v*ud - (n_Γ(v))*ud )*
8671
end
8772

8873
# Assembly
@@ -101,21 +86,13 @@ function run(comm,model,U,V,strategy)
10186
fels = LinearFESolver(ls)
10287
uh = solve(fels, op)
10388

104-
# Error norms and print solution
105-
sums = DistributedData(model, uh) do part, (model, gids), uh
106-
trian = Triangulation(model)
107-
owned_trian = remove_ghost_cells(trian, part, gids)
108-
= Measure(owned_trian, degree)
109-
e = u - uh
110-
l2(u) = ( uu )*
111-
h1(u) = ( uu + (u)(u) )*
112-
e_l2 = sum(l2(e))
113-
e_h1 = sum(h1(e))
114-
e_l2, e_h1
115-
end
116-
e_l2_h1 = gather(sums)
117-
e_l2 = sum(map(i -> i[1], e_l2_h1))
118-
e_h1 = sum(map(i -> i[2], e_l2_h1))
89+
trian = Triangulation(OwnedCells,model)
90+
= Measure(trian,degree)
91+
e = u - uh
92+
l2(u) = ( uu )*
93+
h1(u) = ( uu + (u)(u) )*
94+
e_l2 = sum(l2(e))
95+
e_h1 = sum(h1(e))
11996
tol = 1.0e-9
12097
@test e_l2 < tol
12198
@test e_h1 < tol

0 commit comments

Comments
 (0)