Skip to content

Commit cc56f4d

Browse files
DistributedStokesTests.jl and MPIPETScDistributedStokesTests.jl working
1 parent 1907d86 commit cc56f4d

8 files changed

+183
-135
lines changed

src/DistributedAssemblers.jl

+32-8
Original file line numberDiff line numberDiff line change
@@ -496,17 +496,17 @@ end
496496
function Gridap.Geometry.Triangulation(strategy::Type{<:AssemblyStrategy},
497497
model::DistributedDiscreteModel,args_triangulation...)#;kwargs_triangulation...)
498498
DistributedData(model) do part, (model,gids)
499-
Triangulation(strategy,model,part,gids,args_triangulation...)#;kwargs_triangulation)
499+
Triangulation(strategy,part,gids,model,args_triangulation...)#;kwargs_triangulation)
500500
end
501501
end
502502

503503
function Gridap.Geometry.Triangulation(strategy::AssemblyStrategy,
504504
part,gids,model::DiscreteModel,args_triangulation...)#;kwargs_triangulation...)
505-
Triangulation(typeof(strategy),model,part,gids,args_triangulation...)#;kwargs_triangulation)
505+
Triangulation(typeof(strategy),part,gids,model,args_triangulation...)#;kwargs_triangulation)
506506
end
507507

508508
function Gridap.Geometry.Triangulation(strategy::Type{<:AssemblyStrategy},
509-
model::DiscreteModel,part,gids,args_triangulation...)#;kwargs_triangulation...)
509+
part,gids,model::DiscreteModel,args_triangulation...)#;kwargs_triangulation...)
510510
portion=proc_local_triangulation_portion_type(strategy)
511511
Triangulation(portion,part,gids,model,args_triangulation...)#;kwargs_triangulation)
512512
end
@@ -518,8 +518,32 @@ function Gridap.Geometry.Triangulation(strategy::DistributedAssemblyStrategy,
518518
end
519519
end
520520

521-
# function Gridap.Geometry.Triangulation(strategy::AssemblyStrategy,
522-
# model::DiscreteModel,args_triangulation...)#;kwargs_triangulation...)
523-
# portion_type=get_proc_local_triangulation_portion_type(typeof(strategy))
524-
# Triangulation(portion_type, model, args_triangulation...)#;kwargs_triangulation...)
525-
# end
521+
function Gridap.Geometry.BoundaryTriangulation(model::DistributedDiscreteModel;kwargs_triangulation...)
522+
AS=default_assembly_strategy_type(get_comm(model))
523+
BoundaryTriangulation(AS, model; kwargs_triangulation...)
524+
end
525+
526+
function Gridap.Geometry.BoundaryTriangulation(strategy::Type{<:AssemblyStrategy},
527+
model::DistributedDiscreteModel;kwargs_triangulation...)
528+
DistributedData(model) do part, (model,gids)
529+
BoundaryTriangulation(strategy,part,gids,model;kwargs_triangulation...)
530+
end
531+
end
532+
533+
function Gridap.Geometry.BoundaryTriangulation(strategy::AssemblyStrategy,
534+
part,gids,model::DiscreteModel;kwargs_triangulation...)
535+
BoundaryTriangulation(typeof(strategy),part,gids,model;kwargs_triangulation...)
536+
end
537+
538+
function Gridap.Geometry.BoundaryTriangulation(strategy::Type{<:AssemblyStrategy},
539+
part,gids,model::DiscreteModel;kwargs_triangulation...)
540+
portion=proc_local_triangulation_portion_type(strategy)
541+
BoundaryTriangulation(portion,part,gids,model;kwargs_triangulation...)
542+
end
543+
544+
function Gridap.Geometry.BoundaryTriangulation(strategy::DistributedAssemblyStrategy,
545+
model::DistributedDiscreteModel;kwargs_triangulation...)
546+
DistributedData(model,strategy) do part, (model,gids), strategy
547+
BoundaryTriangulation(strategy,part,gids,model;kwargs_triangulation...)
548+
end
549+
end

src/DistributedDiscreteModels.jl

+29
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,33 @@ function Gridap.writevtk(model::DistributedDiscreteModel,filebase::String)
2424

2525
end
2626

27+
function Gridap.Geometry.get_face_labeling(model::DistributedDiscreteModel)
28+
DistributedData(model) do part, (model,gids)
29+
get_face_labeling(model)
30+
end
31+
end
32+
33+
"""
34+
add_tag_from_tags!(lab::FaceLabeling, name::String, tags::Vector{Int})
35+
add_tag_from_tags!(lab::FaceLabeling, name::String, tags::Vector{String})
36+
add_tag_from_tags!(lab::FaceLabeling, name::String, tag::Int)
37+
add_tag_from_tags!(lab::FaceLabeling, name::String, tag::String)
38+
"""
39+
function Gridap.Geometry.add_tag_from_tags!(lab::DistributedData{<:FaceLabeling}, name::String, tags::Vector{Int})
40+
do_on_parts(lab) do part, lab
41+
add_tag_from_tags!(lab, name, tags)
42+
end
43+
end
2744

45+
function Gridap.Geometry.add_tag_from_tags!(
46+
labels::DistributedData{<:FaceLabeling}, name::String, names::Vector{String})
47+
@notimplemented
48+
end
49+
50+
function Gridap.Geometry.add_tag_from_tags!(labels::DistributedData{<:FaceLabeling}, name::String, tag::Int)
51+
@notimplemented
52+
end
53+
54+
function Gridap.Geometry.add_tag_from_tags!(labels::DistributedData{<:FaceLabeling}, name::String, tag::String)
55+
@notimplemented
56+
end

src/DistributedFESpaces.jl

-4
Original file line numberDiff line numberDiff line change
@@ -388,12 +388,8 @@ struct DistributedFEFunction <: FEFunction
388388
space::DistributedFESpace
389389
end
390390

391-
# TO-DO Gridap.FESpaces.FEFunctionStyle(::Type{DistributedFEFunction}) = Val{true}()
392-
393391
get_distributed_data(u::DistributedFEFunction) = u.funs
394392

395393
Gridap.FESpaces.get_free_dof_values(a::DistributedFEFunction) = a.vals
396394

397395
Gridap.FESpaces.get_fe_space(a::DistributedFEFunction) = a.space
398-
399-
# TO-DO Gridap.FESpaces.is_a_fe_function(a::DistributedFEFunction) = true

src/DistributedTriangulations.jl

+19-5
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,34 @@ end
5353

5454
#TO-DO: what does it mean OwnedCells and OwnedAndGhostCells for a BoundaryTriangulation?
5555
# Perhaps we should use a different type, with a more intention revealing name!
56+
function Gridap.Geometry.BoundaryTriangulation(portion::Type{<:ProcLocalTriangulationPortion},
57+
part,gids,model::DiscreteModel;kwargs_triangulation...)
58+
@abstractmethod
59+
end
60+
61+
function Gridap.Geometry.BoundaryTriangulation(portion::Type{<:ProcLocalTriangulationPortion},
62+
model::DistributedDiscreteModel;kwargs_triangulation...)
63+
DistributedData(model) do part, (model,gids)
64+
BoundaryTriangulation(portion,part,gids,model;kwargs_triangulation...)
65+
end
66+
end
67+
5668
function Gridap.Geometry.BoundaryTriangulation(portion::Type{OwnedCells},
57-
model::DiscreteModel,args_triangulation...)#;kwargs_triangulation...)
58-
@notimplemented
69+
part,gids,model::DiscreteModel;kwargs_triangulation...)
70+
trian=BoundaryTriangulation(model;kwargs_triangulation...)
71+
filter_cells_when_needed(portion,trian,part,gids)
5972
end
6073

6174
function Gridap.Geometry.BoundaryTriangulation(portion::Type{OwnedAndGhostCells},
62-
model::DistributedDiscreteModel,args_triangulation...)#;kwargs_triangulation...)
63-
@notimplemented
75+
part,gids,model::DiscreteModel;kwargs_triangulation...)
76+
trian=BoundaryTriangulation(model;kwargs_triangulation...)
77+
filter_cells_when_needed(portion,trian)
6478
end
6579

6680
#TO-DO: what does it mean OwnedCells and OwnedAndGhostCells for a SkeletonTriangulation?
6781
# Perhaps we should use a different type, with a more intention revealing name!
6882
function Gridap.Geometry.SkeletonTriangulation(portion::Type{OwnedCells},
69-
model::DistributedDiscreteModel,args_triangulation...;kwargs_triangulation...)
83+
model::DistributedDiscreteModel;kwargs_triangulation...)
7084
@notimplemented
7185
end
7286

src/GridapHighLevelAPI.jl

+59
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,28 @@ for T in (DistributedData{<:CellField},DistributedFEFunction)
117117
end
118118
end
119119

120+
function (+)(a::DistributedData{<:Gridap.CellData.DomainContribution},
121+
b::DistributedData{<:Gridap.CellData.DomainContribution})
122+
DistributedData(a,b) do part, a, b
123+
a+b
124+
end
125+
end
126+
127+
function (-)(a::DistributedData{<:Gridap.CellData.DomainContribution},
128+
b::DistributedData{<:Gridap.CellData.DomainContribution})
129+
DistributedData(a,b) do part, a, b
130+
a-b
131+
end
132+
end
133+
134+
function (*)(a::Number,b::DistributedData{<:Gridap.CellData.DomainContribution})
135+
DistributedData(b) do part, b
136+
a*b
137+
end
138+
end
139+
140+
(*)(a::DistributedData{<:Gridap.CellData.DomainContribution},b::Number) = b*a
141+
120142
function (a::typeof(gradient))(x::DistributedData{<:CellField})
121143
DistributedData(x) do part, x
122144
a(x)
@@ -128,3 +150,40 @@ for T in (DistributedData{<:CellField},DistributedFEFunction)
128150
a(x)
129151
end
130152
end
153+
154+
function dot(::typeof(∇),f::DistributedData{<:CellField})
155+
DistributedData(f) do part, f
156+
divergence(f)
157+
end
158+
end
159+
160+
161+
function Base.iterate(a::DistributedData{<:MultiFieldCellField})
162+
if _num_fields(a)==0
163+
return nothing
164+
end
165+
sf=_get_field(a,1)
166+
(sf,2)
167+
end
168+
169+
function Base.iterate(a::DistributedData{<:MultiFieldCellField},state)
170+
if state > _num_fields(a)
171+
return nothing
172+
end
173+
sf=_get_field(a,state)
174+
(sf,state+1)
175+
end
176+
177+
function _num_fields(a::DistributedData{<:MultiFieldCellField})
178+
num_fields=0
179+
do_on_parts(a) do part, a
180+
num_fields=length(a.single_fields)
181+
end
182+
num_fields
183+
end
184+
185+
function _get_field(a::DistributedData{<:MultiFieldCellField},field_id)
186+
DistributedData(a) do part, a
187+
a.single_fields[field_id]
188+
end
189+
end

src/MultiFieldDistributedFESpaces.jl

+3-3
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,6 @@ struct MultiFieldDistributedFEFunction <: FEFunction
207207
space::MultiFieldDistributedFESpace
208208
end
209209

210-
# TO-DO Gridap.FESpaces.FEFunctionStyle(::Type{MultiFieldDistributedFEFunction}) = Val{true}()
211-
212210
get_distributed_data(u::MultiFieldDistributedFEFunction) =
213211
get_distributed_data(u.multifield_fe_function)
214212

@@ -217,4 +215,6 @@ Gridap.FESpaces.get_free_dof_values(a::MultiFieldDistributedFEFunction) =
217215

218216
Gridap.FESpaces.get_fe_space(a::MultiFieldDistributedFEFunction) = a.space
219217

220-
# TO-DO Gridap.FESpaces.is_a_fe_function(a::MultiFieldDistributedFEFunction) = true
218+
Base.iterate(m::MultiFieldDistributedFEFunction)=iterate(m.single_fe_functions)
219+
Base.iterate(m::MultiFieldDistributedFEFunction,state) = iterate(m.single_fe_functions,state)
220+
Base.getindex(m::MultiFieldDistributedFEFunction,field_id::Integer) = m.single_fe_functions[field_id]

test/DistributedStokesTests.jl

+21-57
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,6 @@ function Gridap.FESpaces.num_dirichlet_dofs(f::Gridap.MultiField.MultiFieldFESpa
1515
end
1616

1717
function run(comm,subdomains)
18-
# Select matrix and vector types for discrete problem
19-
# Note that here we use serial vectors and matrices
20-
# but the assembly is distributed
21-
T = Float64
22-
vector_type = Vector{T}
23-
matrix_type = SparseMatrixCSC{T,Int}
24-
2518
# Manufactured solution
2619
ux(x)=2*x[1]*x[2]
2720
uy(x)=-x[2]^2
@@ -37,29 +30,23 @@ function run(comm,subdomains)
3730
cells = (4, 4)
3831
model = CartesianDiscreteModel(comm, subdomains, domain, cells)
3932

40-
# Define Dirichlet and Neumann boundaries for local models
41-
do_on_parts(model) do part, (model,gids)
42-
labels = get_face_labeling(model)
43-
add_tag_from_tags!(labels,"diri0",[1,2,3,4,6,7,8])
44-
add_tag_from_tags!(labels,"diri1",[1,2,3,4,6,7,8])
45-
add_tag_from_tags!(labels,"neumann",[5])
46-
end
47-
33+
labels = get_face_labeling(model)
34+
add_tag_from_tags!(labels,"diri0",[1,2,3,4,6,7,8])
35+
add_tag_from_tags!(labels,"diri1",[1,2,3,4,6,7,8])
36+
add_tag_from_tags!(labels,"neumann",[5])
4837

4938
# FE Spaces
5039
order = 2
5140
reffeᵤ = ReferenceFE(lagrangian,VectorValue{2,Float64},order)
5241
reffeₚ = Gridap.ReferenceFEs.LagrangianRefFE(Float64,QUAD,order-1;space=:P)
5342
V = FESpace(
54-
vector_type,
5543
model=model,
5644
reffe=reffeᵤ,
5745
conformity=:H1,
5846
dirichlet_tags=["diri0","diri1"],
5947
)
6048

6149
Q = FESpace(
62-
vector_type,
6350
model=model,
6451
reffe=reffeₚ,
6552
conformity=:L2)
@@ -71,53 +58,30 @@ function run(comm,subdomains)
7158
P=TrialFESpace(Q)
7259
X=MultiFieldFESpace(Y,[U,P])
7360

74-
strategy = OwnedAndGhostCellsAssemblyStrategy(V,MapDoFsTypeGlobal())
61+
trian=Triangulation(model)
62+
degree = 2*(order+1)
63+
= Measure(trian,degree)
7564

76-
function a(x,y)
77-
DistributedData(x,y,ddΩ,ddΓ) do part, xl, yl, dΩ, dΓ
78-
ul,pl=xl
79-
vl,ql=yl
80-
( (vl)(ul) - (∇vl)*pl + ql*(∇ul) )dΩ
81-
end
82-
end
65+
btrian=BoundaryTriangulation(model;tags="neumann")
66+
= Measure(btrian,degree)
8367

84-
function l(y)
85-
DistributedData(y,ddΩ,ddΓ) do part, yl, dΩ, dΓ
86-
vl,_=yl
87-
( vlf )dΩ + ( vls )dΓ
88-
end
68+
function a((u,p),(v,q))
69+
( (v)(u) - (∇v)*p + q*(∇u) )dΩ
8970
end
9071

91-
# Assembler
92-
assem = SparseMatrixAssembler(matrix_type, vector_type, X, Y, strategy)
93-
94-
function setup_dΩ(part,(model,gids),strategy)
95-
trian = Triangulation(strategy,model)
96-
degree = 2*(order+1)
97-
Measure(trian,degree)
98-
end
99-
ddΩ = DistributedData(setup_dΩ,model,strategy)
100-
101-
function setup_dΓ(part,(model,gids),strategy)
102-
btrian=BoundaryTriangulation(strategy,model;tags="neumann")
103-
degree = 2*(order+1)
104-
Measure(btrian,degree)
105-
end
106-
ddΓ = DistributedData(setup_dΓ,model,strategy)
72+
function l((v,q))
73+
( vf )dΩ + ( vs )dΓ
74+
end
10775

10876
# # # FE solution
109-
op = AffineFEOperator(a,l,X,Y,assem)
77+
op = AffineFEOperator(a,l,X,Y)
11078
xh = solve(op)
79+
uh,_ = xh
11180

112-
sums = DistributedData(model, xh) do part, (model, gids), xh
113-
trian = Triangulation(model)
114-
owned_trian = remove_ghost_cells(trian, part, gids)
115-
= Measure(owned_trian, 2*order)
116-
uh,_ = xh
117-
e = u-uh
118-
sum((ee)dΩ)
119-
end
120-
e_l2 = sum(gather(sums))
81+
trian=Triangulation(OwnedCells,model)
82+
=Measure(trian,2*order)
83+
e = u-uh
84+
e_l2 = sum((ee)dΩ)
12185
tol = 1.0e-9
12286
println("$(e_l2) < $(tol)")
12387
@test e_l2 < tol
@@ -128,6 +92,6 @@ function f(comm)
12892
run(comm,subdomains)
12993
end
13094

131-
#SequentialCommunicator(f,subdomains)
95+
SequentialCommunicator(f,subdomains)
13296

13397
end # module

0 commit comments

Comments
 (0)