Output File Structure

The results of the simulation are stored in the root group ‘/’ in the form of 3D or 4D datasets. If a linear sensor mask is used, all output quantities are stored as datasets in the root group. If a cuboid corners sensor mask is used, the sampled quantities form private groups containing datasets on per cuboid basis.

Output File Header

created_by

Short description of the tool that created this file

creation_date

Date when the file was created

file_description

Short description of the content of the file (e.g. simulation name)

file_type

Type of the file (input)

major_version

Major version of the file definition (1)

minor_version

Minor version of the file definition (2)

host_names

List of hosts (computer names, CPUs, GPUs) the simulation was executed on

number_of_cpu_cores

Number of CPU cores used for the simulation

data_loading_phase_execution_time

Time taken to load data from the file

pre-processing_phase_execution_time

Time taken to pre-process data

simulation_phase_execution_time

Time taken to run the simulation

post-processing_phase_execution_time

Time taken to complete the post-processing phase

total_execution_time

Total execution time

peak_core_memory_in_use

Peak memory required per core during the simulation

total_memory_in_use

Peak memory in use

The output file of version 1.0 could only store recorded quantities as 3D datasets under the root group. However, from version 1.1 on which supports a cuboid corner sensor mask, the sampled quantities may be laid out as 4D quantities stored under specific groups. The dimensions are always (Nx, Ny, Nz, Nt), with every sampled cuboid stored as a distinct dataset, and the datasets grouped under a group named by the quantity stored. This makes the file clearly readable and easy to parse.

In order to enable compression and more efficient data processing, big datasets are not stored as monolithic blocks but broken into chunks that may be compressed by the ZIP library and stored separately. The chunk size is defined as follows:

  • (1M elements, 1, 1) in the case of 1D variables - index sensor mask (8MB blocks).

  • (Nx, Ny, 1) in the case of 3D variables (one 2D slab).

  • (Nx, Ny, Nz, 1) in the case of 4D variables (one time step).

  • (N_sensor_points, 1, 1) in the case of the output time series (one time step of the simulation).

All datasets have two attributes that specify the content of the dataset. The ‘data_type’ attribute specifies the data type of the dataset. The admissible values are either ‘float’ or ‘long’. The ‘domain_type’ attribute specifies the domain of the dataset. The admissible values are either ‘real’ for the real domain or ‘complex’ for the complex domain. The C++ code reads these attributes and checks their values.

Simulation Flags

Name

Size

Data Type

Domain Type

Condition of Presence

ux_source_flag

(1, 1, 1)

long

real

uy_source_flag

(1, 1, 1)

long

real

uz_source_flag

(1, 1, 1)

long

real

Nz > 1

p_source_flag

(1, 1, 1)

long

real

p0_source_flag

(1, 1, 1)

long

real

transducer_source_flag

(1, 1, 1)

long

real

nonuniform_grid_flag

(1, 1, 1)

long

real

nonlinear_flag

(1, 1, 1)

long

real

absorbing_flag

(1, 1, 1)

long

real

axisymmetric_flag

(1, 1, 1)

long

real

file_ver == 1.2

u_source_mode

(1, 1, 1)

long

real

if u*_source_flag

u_source_many

(1, 1, 1)

long

real

if u*_source_flag

p_source_mode

(1, 1, 1)

long

real

if p_source_flag

p_source_many

(1, 1, 1)

long

real

if p_source_flag

Grid Properties

Name

Size

Data Type

Domain Type

Condition of Presence

Nx

(1, 1, 1)

long

real

Ny

(1, 1, 1)

long

real

Nz

(1, 1, 1)

long

real

Nt

(1, 1, 1)

long

real

t_index

(1, 1, 1)

long

real

dt

(1, 1, 1)

float

real

dx

(1, 1, 1)

float

real

dy

(1, 1, 1)

float

real

dz

(1, 1, 1)

float

real

Nz > 1

PML Variables

Name

Size

Data Type

Domain Type

Condition of Presence

pml_x_size

(1, 1, 1)

long

real

pml_y_size

(1, 1, 1)

long

real

pml_z_size

(1, 1, 1)

long

real

Nz > 1

pml_x_alpha

(1, 1, 1)

float

real

pml_y_alpha

(1, 1, 1)

float

real

pml_z_alpha

(1, 1, 1)

float

real

Nz > 1

Sensor Variables

defined if (``–copy_sensor_mask``) and (file version > 1.0)

Name

Size

Data Type

Domain Type

Condition of Presence

sensor_mask_type

(1, 1, 1)

long

real

sensor_mask_index

(Nsens, 1, 1)

long

real

sensor_mask_type == 0

sensor_mask_corners

(Ncubes, 6, 1)

long

real

sensor_mask_type == 1

Simulation Results

defined if (sensor_mask_type == 0) or (file version == 1.0)

Name

Size

Data Type

Domain Type

Condition of Presence

p

(Nsens, Nt - s, 1)

float

real

-p or --p_raw

p_rms

(Nsens, 1, 1)

float

real

--p_rms

p_max

(Nsens, 1, 1)

float

real

--p_max

p_min

(Nsens, 1, 1)

float

real

--p_min

p_max_all

(Nx, Ny, Nz)

float

real

--p_max_all

p_min_all

(Nx, Ny, Nz)

float

real

--p_min_all

p_final

(Nx, Ny, Nz)

float

real

--p_final

ux

(Nsens, Nt - s, 1)

float

real

-u or --u_raw

uy

(Nsens, Nt - s, 1)

float

real

-u or --u_raw

uz

(Nsens, Nt - s, 1)

float

real

(-u or --u_raw) and Nz > 1

ux_non_staggered

(Nsens, Nt - s, 1)

float

real

--u_non_staggered_raw

uy_non_staggered

(Nsens, Nt - s, 1)

float

real

--u_non_staggered_raw

uz_non_staggered

(Nsens, Nt - s, 1)

float

real

--u_non_staggered_raw and Nz > 1

ux_rms

(Nsens, 1, 1)

float

real

--u_rms

uy_rms

(Nsens, 1, 1)

float

real

--u_rms

uz_rms

(Nsens, 1, 1)

float

real

--u_rms and Nz > 1

ux_max

(Nsens, 1, 1)

float

real

--u_max

uy_max

(Nsens, 1, 1)

float

real

--u_max

uz_max

(Nsens, 1, 1)

float

real

--u_max and Nz > 1

ux_min

(Nsens, 1, 1)

float

real

--u_min

uy_min

(Nsens, 1, 1)

float

real

--u_min

uz_min

(Nsens, 1, 1)

float

real

--u_min and Nz > 1

ux_max_all

(Nx, Ny, Nz)

float

real

--u_max_all

uy_max_all

(Nx, Ny, Nz)

float

real

--u_max_all

uz_max_all

(Nx, Ny, Nz)

float

real

--u_max_all and Nz > 1

ux_min_all

(Nx, Ny, Nz)

float

real

--u_min_all

uy_min_all

(Nx, Ny, Nz)

float

real

--u_min_all

uz_min_all

(Nx, Ny, Nz)

float

real

--u_min_all and Nz > 1

ux_final

(Nx, Ny, Nz)

float

real

--u_final

uy_final

(Nx, Ny, Nz)

float

real

--u_final

uz_final

(Nx, Ny, Nz)

float

real

--u_final and Nz > 1

defined if (sensor_mask_type == 1) or (file version == 1.0)

/p

group of datasets, one per cuboid

-p or --p_raw

/p/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/p/2

(Cx, Cy, Cz, Nt-s)

float

real

2nd sampled cuboid, etc.

/p_rms

group of datasets, one per cuboid

--p_rms

/p_rms/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/p_max

group of datasets, one per cuboid

--p_max

/p_max/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/p_min

group of datasets, one per cuboid

--p_min

/p_min/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

p_max_all

(Nx, Ny, Nz)

float

real

--p_max_all

p_min_all

(Nx, Ny, Nz)

float

real

--p_min_all

p_final

(Nx, Ny, Nz)

float

real

--p_final

/ux

group of datasets, one per cuboid

-u or --u_raw

/ux/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uy

group of datasets, one per cuboid

-u or --u_raw

/uy/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uz

group of datasets, one per cuboid

-u or --u_raw and Nz > 1

/uz/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/ux_non_staggered

group of datasets, one per cuboid

--u_non_staggered_raw

/ux_non_staggered/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uy_non_staggered

group of datasets, one per cuboid

--u_non_staggered_raw

/uy_non_staggered/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uz_non_staggered

group of datasets, one per cuboid

--u_non_staggered_raw and Nz > 1

/uz_non_staggered/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/ux_rms

group of datasets, one per cuboid

--u_rms

/ux_rms/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uy_rms

group of datasets, one per cuboid

--u_rms

/uy_rms/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uz_rms

group of datasets, one per cuboid

--u_rms and Nz > 1

/uz_rms/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/ux_max

group of datasets, one per cuboid

--u_max

/ux_max/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uy_max

group of datasets, one per cuboid

--u_max

/uy_max/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uz_max

group of datasets, one per cuboid

--u_max and Nz > 1

/uz_max/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/ux_min

group of datasets, one per cuboid

--u_min

/ux_min/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uy_min

group of datasets, one per cuboid

--u_min

/uy_min/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

/uz_min

group of datasets, one per cuboid

--u_min and Nz > 1

/uz_min/1

(Cx, Cy, Cz, Nt-s)

float

real

1st sampled cuboid

ux_max_all

(Nx, Ny, Nz)

float

real

--u_max_all

uy_max_all

(Nx, Ny, Nz)

float

real

--u_max_all

uz_max_all

(Nx, Ny, Nz)

float

real

--u_max_all and Nz > 1

ux_min_all

(Nx, Ny, Nz)

float

real

--u_min_all

uy_min_all

(Nx, Ny, Nz)

float

real

--u_min_all

uz_min_all

(Nx, Ny, Nz)

float

real

--u_min_all and Nz > 1

ux_final

(Nx, Ny, Nz)

float

real

--u_final

uy_final

(Nx, Ny, Nz)

float

real

--u_final

uz_final

(Nx, Ny, Nz)

float

real

--u_final and Nz > 1