Skip to content

Commit 0f043ee

Browse files
committed
Merge branch 'master' of https://github.com/gridap/GridapDistributed.jl into pvd_functions
2 parents 2a55ec2 + 54d1766 commit 0f043ee

File tree

5 files changed

+174
-4
lines changed

5 files changed

+174
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
/docs/site/
99
/tmp/
1010
*.vtu
11+
*.pvtu

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99
### Added
1010
- Support for periodic boundary conditions for `CartesianDiscreteModel`. Since PR [#79](https://github.com/gridap/GridapDistributed.jl/pull/79)
1111
- Skeleton documentation and some content. Since PR [#77](https://github.com/gridap/GridapDistributed.jl/pull/77)
12+
- Added `interpolate_everywhere` and `interpolate_dirichlet` functions. Since PR [#74](https://github.com/gridap/GridapDistributed.jl/pull/74)
1213

1314
### Fixed
1415
- Visualization of functions and numbers. Since PR [#78](https://github.com/gridap/GridapDistributed.jl/pull/78)

src/FESpaces.jl

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,18 +277,45 @@ function FESpaces.get_free_dof_ids(fs::DistributedSingleFieldFESpace)
277277
fs.gids
278278
end
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+
280289
function 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)
286312
end
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)
294321
end
@@ -322,6 +349,20 @@ function FESpaces.TrialFESpace(fun,f::DistributedSingleFieldFESpace)
322349
DistributedSingleFieldFESpace(spaces,f.gids,f.vector_type)
323350
end
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+
325366
function generate_gids(
326367
model::DistributedDiscreteModel,
327368
spaces::AbstractPData{<:SingleFieldFESpace})
@@ -343,6 +384,56 @@ function FESpaces.interpolate!(
343384
FEFunction(f,free_values)
344385
end
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

348439
function FESpaces.FESpace(model::DistributedDiscreteModel,reffe;kwargs...)

src/MultiField.jl

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ MultiField.num_fields(m::DistributedMultiFieldFEFunction) = length(m.field_fe_fu
2424
Base.iterate(m::DistributedMultiFieldFEFunction) = iterate(m.field_fe_fun)
2525
Base.iterate(m::DistributedMultiFieldFEFunction,state) = iterate(m.field_fe_fun,state)
2626
Base.getindex(m::DistributedMultiFieldFEFunction,field_id::Integer) = m.field_fe_fun[field_id]
27+
28+
local_views(a::Vector{<:DistributedCellField}) = [ai.fields for ai in a]
29+
2730
"""
2831
"""
2932
struct DistributedMultiFieldFESpace{A,B,C,D} <: DistributedFESpace
@@ -118,6 +121,63 @@ function FESpaces.interpolate!(objects,free_values::AbstractVector,fe::Distribut
118121
end
119122
DistributedMultiFieldFEFunction(field_fe_fun,part_fe_fun,free_values)
120123
end
124+
125+
function FESpaces.interpolate_everywhere(objects,fe::DistributedMultiFieldFESpace)
126+
free_values = zero_free_values(fe)
127+
local_vals = consistent_local_views(free_values,fe.gids,true)
128+
part_fe_fun = map_parts(local_vals,local_views(fe)) do x,f
129+
interpolate!(objects,x,f)
130+
end
131+
field_fe_fun = DistributedSingleFieldFEFunction[]
132+
for i in 1:num_fields(fe)
133+
free_values_i = restrict_to_field(fe,free_values,i)
134+
fe_space_i = fe.field_fe_space[i]
135+
dirichlet_values_i = zero_dirichlet_values(fe_space_i)
136+
fe_fun_i = interpolate_everywhere!(objects[i], free_values_i,dirichlet_values_i,fe_space_i)
137+
push!(field_fe_fun,fe_fun_i)
138+
end
139+
DistributedMultiFieldFEFunction(field_fe_fun,part_fe_fun,free_values)
140+
end
141+
142+
function FESpaces.interpolate_everywhere!(
143+
objects,free_values::AbstractVector,
144+
dirichlet_values::Vector{AbstractPData{<:AbstractVector}},
145+
fe::DistributedMultiFieldFESpace)
146+
local_vals = consistent_local_views(free_values,fe.gids,true)
147+
part_fe_fun = map_parts(local_vals,local_views(fe)) do x,f
148+
interpolate!(objects,x,f)
149+
end
150+
field_fe_fun = DistributedSingleFieldFEFunction[]
151+
for i in 1:num_fields(fe)
152+
free_values_i = restrict_to_field(fe,free_values,i)
153+
dirichlet_values_i = dirichlet_values[i]
154+
fe_space_i = fe.field_fe_space[i]
155+
fe_fun_i = interpolate_everywhere!(objects[i], free_values_i,dirichlet_values_i,fe_space_i)
156+
push!(field_fe_fun,fe_fun_i)
157+
end
158+
DistributedMultiFieldFEFunction(field_fe_fun,part_fe_fun,free_values)
159+
end
160+
161+
function FESpaces.interpolate_everywhere(
162+
objects::Vector{<:DistributedCellField},fe::DistributedMultiFieldFESpace)
163+
local_objects = local_views(objects)
164+
local_spaces = local_views(fe)
165+
part_fe_fun = map_parts(local_spaces,local_objects...) do f,o...
166+
interpolate_everywhere(o,f)
167+
end
168+
free_values = zero_free_values(fe)
169+
field_fe_fun = DistributedSingleFieldFEFunction[]
170+
for i in 1:num_fields(fe)
171+
free_values_i = restrict_to_field(fe,free_values,i)
172+
fe_space_i = fe.field_fe_space[i]
173+
dirichlet_values_i = get_dirichlet_dof_values(fe_space_i)
174+
fe_fun_i = interpolate_everywhere!(objects[i], free_values_i,dirichlet_values_i,fe_space_i)
175+
push!(field_fe_fun,fe_fun_i)
176+
end
177+
DistributedMultiFieldFEFunction(field_fe_fun,part_fe_fun,free_values)
178+
end
179+
180+
121181
"""
122182
"""
123183
struct DistributedMultiFieldFEBasis{A,B} <: GridapType

test/FESpacesTests.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,26 @@ function main(parts,das)
3434
uh = interpolate(u,U)
3535
eh = u - uh
3636

37+
uh_dir = interpolate_dirichlet(u,U)
38+
free_values = zero_free_values(U)
39+
dirichlet_values = get_dirichlet_dof_values(U)
40+
uh_dir2 = interpolate_dirichlet!(u,free_values,dirichlet_values,U)
41+
42+
uh_everywhere = interpolate_everywhere(u,U)
43+
uh_everywhere_ = interpolate_everywhere!(u,free_values,dirichlet_values,U)
44+
eh2 = u - uh_everywhere
45+
46+
uh_everywhere2 = interpolate_everywhere(uh_everywhere,U)
47+
uh_everywhere2_ = interpolate_everywhere!(uh_everywhere,free_values,dirichlet_values,U)
48+
eh3 = u - uh_everywhere2
49+
3750
= Measure(Ω,3)
3851
cont = ( abs2(eh) )dΩ
52+
cont2 = ( abs2(eh2) )dΩ
53+
cont3 = ( abs2(eh3) )dΩ
3954
@test sqrt(sum(cont)) < 1.0e-9
55+
@test sqrt(sum(cont2)) < 1.0e-9
56+
@test sqrt(sum(cont3)) < 1.0e-9
4057

4158
# Assembly
4259
Ωass = Triangulation(das,model)

0 commit comments

Comments
 (0)