sandbox/acastillo/output_fields/tests_outputs/test_output_vtu_box.c
Testing
output_vtu_box()
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_box.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, but only inside a region defined by box
[2] = {{-0.25, -0.25}, {0.25, 0.25}};
coord boxoutput_vtu_box({f,p}, {u}, "domain", box);
}