From 87fa43e6bde37577ab444c5fc9c80f14f308aa7f Mon Sep 17 00:00:00 2001 From: Shreyas Date: Thu, 24 Apr 2025 14:45:30 +0200 Subject: [PATCH 1/2] Modified createpvd to handle nothing --- NEWS.md | 6 ++++++ src/Visualization.jl | 46 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/NEWS.md b/NEWS.md index c9c3f110..d588c371 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Fixed + +- Added support to create pvd files when the triangulation is not there on all processes. To achive this, a new method for the createpvd function is added. + ## [0.4.7] 2025-03-04 ### Added diff --git a/src/Visualization.jl b/src/Visualization.jl index 0535e224..40a16c2c 100644 --- a/src/Visualization.jl +++ b/src/Visualization.jl @@ -222,13 +222,35 @@ end struct DistributedPvd{T<:AbstractArray} pvds::T + parts::AbstractArray +end + +function Visualization.createpvd(trian::DistributedTriangulation,parts::AbstractArray,args...;kwargs...) + nparts, new_parts = filter_empty_parts(parts,local_views(trian)) + pvds = map(new_parts) do part + if part == 1 + paraview_collection(args...;kwargs...) + end + end + DistributedPvd(pvds,new_parts) +end + +function Visualization.createpvd(f,trian::DistributedTriangulation,parts::AbstractArray,args...;kwargs...) + pvd = createpvd(trian,parts,args...;kwargs...) + try + f(pvd) + finally + savepvd(pvd) + end end function Visualization.createpvd(parts::AbstractArray,args...;kwargs...) - pvds = map_main(parts) do part - paraview_collection(args...;kwargs...) + pvds = map(parts) do part + if part == 1 + paraview_collection(args...;kwargs...) + end end - DistributedPvd(pvds) + DistributedPvd(pvds,parts) end function Visualization.createpvd(f,parts::AbstractArray,args...;kwargs...) @@ -241,14 +263,22 @@ function Visualization.createpvd(f,parts::AbstractArray,args...;kwargs...) end function Visualization.savepvd(pvd::DistributedPvd) - map_main(pvd.pvds) do pvd - vtk_save(pvd) + map(pvd.pvds, pvd.parts) do pvd, part + if part == 1 + vtk_save(pvd) + end end end function Base.setindex!(pvd::DistributedPvd,pvtk::AbstractArray,time::Real) - map(vtk_save,pvtk) - map_main(pvtk,pvd.pvds) do pvtk,pvd - pvd[time] = pvtk + map(pvtk) do pvtk + if !isnothing(pvtk) + vtk_save(pvtk) + end + end + map(pvtk,pvd.pvds,pvd.parts) do pvtk,pvd,part + if part == 1 + pvd[time] = pvtk + end end end From 60bda000d43dcb58d20914c9f77ef4c4a95cef34 Mon Sep 17 00:00:00 2001 From: Shreyas Date: Fri, 27 Feb 2026 16:12:25 +0100 Subject: [PATCH 2/2] Adding some functionality of Gridap Geometry --- src/Geometry.jl | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/Geometry.jl b/src/Geometry.jl index 64398c9f..75033395 100644 --- a/src/Geometry.jl +++ b/src/Geometry.jl @@ -123,6 +123,18 @@ function Geometry.add_tag_from_tags!(labels::DistributedFaceLabeling, name, tags end end +function Geometry.add_tag_from_tags_complementary!(labels::DistributedFaceLabeling, name::String, tag) + map(local_views(labels)) do labels + Geometry.add_tag_from_tags_complementary!(labels,name,tag) + end +end + +function Geometry.add_tag_from_tags_setdiff!(labels::DistributedFaceLabeling, name::String, tag1, tag2) + map(local_views(labels)) do labels + Geometry.add_tag_from_tags_setdiff!(labels,name,tag1,tag2) + end +end + function Geometry.get_face_mask(labels::DistributedFaceLabeling, tags, d::Integer) map(local_views(labels)) do labels get_face_mask(labels, tags, d) @@ -579,6 +591,30 @@ end # Triangulation constructors +function Geometry.Triangulation(model::DistributedDiscreteModel, args...;kwargs...) + D = num_cell_dims(model) + Triangulation(no_ghost,ReferenceFE{D},model, args...;kwargs...) +end + +function Geometry.Triangulation(::Type{ReferenceFE{D}},model::DistributedDiscreteModel, args...;kwargs...) where D + Triangulation(no_ghost, ReferenceFE{D}, model, args...; kwargs...) +end + +function Geometry.Triangulation(portion, model::DistributedDiscreteModel, args...;kwargs...) + D = num_cell_dims(model) + Triangulation(portion,ReferenceFE{D},model, args...;kwargs...) +end + +function Geometry.Triangulation( + portion,::Type{ReferenceFE{D}},model::DistributedDiscreteModel, args...;kwargs...) where D + gids = get_face_gids(model,D) + trians = map(local_views(model)) do model + Triangulation(ReferenceFE{D},model, args...;kwargs...) + end + parent = DistributedTriangulation(trians,model) + return filter_cells_when_needed(portion,gids,parent) +end + function Geometry.Triangulation(model::DistributedDiscreteModel;kwargs...) D = num_cell_dims(model) Triangulation(no_ghost,ReferenceFE{D},model;kwargs...)