Skip to content

Support list of DG-0 + other space in VTXWriter #3375

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

ordinary-slim
Copy link
Contributor

Continuation of #3107 so that we're able to output both DG0 + another space in the same bp file. The previous PR by @jorgensd says:

I've decided to keep it such that only single function-space functions should be saved in a single bp file.
This could of course be changed now, to store a mixture of DG-0 and a single other element function.

This is up for discussion.

Since VTX is the recommended writer, I think it's necessary to support this feature. This code doesn't modify previous behavior regarding the written post files.

MWE

from dolfinx import fem, mesh, io
from mpi4py import MPI

cells_per_side = 4

domain  = mesh.create_unit_square(MPI.COMM_WORLD,
                                  cells_per_side,
                                  cells_per_side,
                                  )

cg1 = fem.functionspace(domain, ("Lagrange", 1),)
dg0 = fem.functionspace(domain, ("Discontinuous Lagrange", 0),)

u_cg1 = fem.Function(cg1, name="u_cg1")
u_dg0 = fem.Function(dg0, name="u_dg0")

expression =  lambda x : x[0]*x[1] 
u_cg1.interpolate(expression)
u_dg0.interpolate(expression)

writer = io.VTXWriter(domain.comm,
                      "result_folder/post.bp",
                      output=[u_cg1,u_dg0])
writer.write(0.0)
writer.close()

@jorgensd
Copy link
Member

jorgensd commented Sep 2, 2024

Currently DG-0 support in VTX is limited by: ornladios/ADIOS2#4179

@ordinary-slim
Copy link
Contributor Author

Currently DG-0 support in VTX is limited by: ornladios/ADIOS2#4179

Thank you for the information, a bit of a bummer. This PR could still be useful for steady data.

@mscroggs mscroggs added this to the 0.10.0 milestone Sep 3, 2024
@garth-wells
Copy link
Member

We're directing efforts towards VTKHDF5 - it is actively developed/maintained.

@ordinary-slim
Copy link
Contributor Author

What is the recommended way to output both CG1 and DG0 time dependent data?

@jorgensd
Copy link
Member

What is the recommended way to output both CG1 and DG0 time dependent data?

I would interpolate the CG1 and DG0 data into a compatible function space (DG1).

As Paraview 6.0 was just released (https://www.paraview.org/download/) it might be worthwhile getting this PR merged (as VTKHDF currently has very limited visualization capabilities of time dependent data in Paraview).
@ordinary-slim do you mind testing if time-dependent data is rendering correctly in paraview 6.0?

@jorgensd jorgensd reopened this May 29, 2025
@ordinary-slim
Copy link
Contributor Author

ordinary-slim commented May 29, 2025

@ordinary-slim do you mind testing if time-dependent data is rendering correctly in paraview 6.0?

I've been using this branch without issues with Paraview 5.13. I can confirm it also works with 6.0 @jorgensd . I am using this example:

from dolfinx import fem, mesh, io
from mpi4py import MPI
import numpy as np

cells_per_side = 4

domain  = mesh.create_unit_square(MPI.COMM_WORLD,
                                  cells_per_side,
                                  cells_per_side,
                                  )

cg1 = fem.functionspace(domain, ("Lagrange", 1),)
dg0 = fem.functionspace(domain, ("Discontinuous Lagrange", 0),)

u_cg1 = fem.Function(cg1, name="u_cg1")
u_dg0 = fem.Function(dg0, name="u_dg0")

expression =  lambda x : x[0]*x[1] 
u_cg1.interpolate(expression)
u_dg0.interpolate(expression)

writer = io.VTXWriter(domain.comm,
                      "result_folder/post.bp",
                      output=[u_cg1,u_dg0])

for i in range(10):
    time = np.float64(i)
    u_cg1.x.array[:] *= (time + 1.0)
    u_dg0.x.array[:] *= (time + 1.0)
    writer.write(time)

writer.close()
``

Comment on lines +481 to +498
bool has_V0_changed = false;
for (auto& v : u)
{
std::visit(
[&V0, &has_V0_changed](auto& u)
{
auto V = u->function_space().get();
assert(V);
if (!impl::is_cellwise(*V->element()))
{
V0 = V;
has_V0_changed = true;
}
},
v);
if (has_V0_changed)
break;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ordinary-slim could you elaborate on this logic?
Here you look through all input functions, and replace the first function space with any (the last) function space if it is not a "constant" space. Is this so that you can mix the non-constant and constant spaces?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This V0 is used to check that all functions have the same dofmap. In the vtk scheme, we can provide both point data and cell data. Since the DG0 functions have this separate path, we only have to verify that the remaining non-DG0 functions use the same dofmap.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants