From 87fa43e6bde37577ab444c5fc9c80f14f308aa7f Mon Sep 17 00:00:00 2001 From: Shreyas Date: Thu, 24 Apr 2025 14:45:30 +0200 Subject: [PATCH] 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 c9c3f11..d588c37 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 0535e22..40a16c2 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