sandbox/acastillo/output_fields/tests_outputs/test_output_vtu.c
Testing
output_vtu()
and output_vtu_slice()
Tests VTU output functions using standard analytical test functions:
- Level set function (signed distance to circle)
- Gaussian scalar field with polynomial modulation
- Taylor-Green vortex (divergence-free velocity field)
import vtk
from vtk.util.numpy_support import vtk_to_numpy
import matplotlib.pyplot as plt
import numpy as np
# Use the correct reader for the .pvtu (parallel) format
= vtk.vtkXMLPUnstructuredGridReader()
reader './domain.pvtu')
reader.SetFileName(
reader.Update()
= reader.GetOutput()
data
# Extract the field data (Cell Data)
= vtk_to_numpy(data.GetCellData().GetArray('u.x'))
u_array
# Compute Cell Centers using a VTK filter
= vtk.vtkCellCenters()
cell_centers_filter
cell_centers_filter.SetInputData(data)
cell_centers_filter.Update()
# Extract the coordinates of the cell centers
= cell_centers_filter.GetOutput().GetPoints()
centers_vtk = vtk_to_numpy(centers_vtk.GetData())
centers
= centers[:, 0]
x = centers[:, 1]
y = u_array[:, 0]
u
# Plot with matplotlib
=(8, 6))
plt.figure(figsize=14, cmap='magma')
plt.tricontourf(x, y, u, levels'x')
plt.xlabel('y')
plt.ylabel(='u.x')
plt.colorbar(label'Cell Data Function u.x')
plt.title('image')
plt.axis('field_u.x_cell_data.png', dpi=150, bbox_inches='tight')
plt.savefig( plt.close()

#include "acastillo/output_fields/vtu/output_vtu.h"
#define MAXLEVEL 8
#define r2 (sq(x) + sq(y))
int main(){
= 1.0;
L0 = Y0 = Z0 = -L0 / 2;
X0 = 1 << (MAXLEVEL-1);
N (N);
init_grid
#if TREE
double outer_radius = 0.25;
double inner_radius = 0.1 ;
refine(((r2 < sq(outer_radius)) && (r2 > sq(inner_radius))) && level < MAXLEVEL);
#endif
// Create test fields with common analytical functions
scalar f[], p[];
vector u[];
foreach(){
// Level set function: signed distance to a circle
[] = sqrt(r2) - 0.2;
f
// Scalar field: Gaussian with polynomial modulation
[] = exp(-5*r2) * (1 + x*y);
p
// Vector field: Taylor-Green vortex (divergence-free)
.x[] = sin(2*pi*x) * cos(2*pi*y);
u.y[] = -cos(2*pi*x) * sin(2*pi*y);
u}
// And write a vtu file
({f,p}, {u}, "domain");
output_vtu
#if dimension > 2
({f,p}, {u}, "slice_x", (coord){1,0,0}, 0);
output_slice_vtu({f,p}, {u}, "slice_y", (coord){0,1,0}, 0);
output_slice_vtu({f,p}, {u}, "slice_z", (coord){0,0,1}, 0);
output_slice_vtu#endif
}