.. _output:
Outputs
=======
Output formats
--------------
*Idefix* uses several types of outputs you may want for your setup. By default, *Idefix* allows
for 3 kinds of outputs:
* logs which essentially tells the user what *Idefix* is currently doing. When running in serial, logs are sent to stdout, but when
MPI is enabled, only the logs of the rank 0 process is sent to stdout, and each process (including rank 0) simultaneously writes a
log file `idefix.n.log` where *n* is the process MPI rank.
* dump files (.dmp) which are *Idefix* specific binary files containing all of the data at machine precision to restart your run.
These files are therefore the ones which are read when *Idefix* is restarted.
* VTK files (.vtk) are Visualation Toolkit files, which are easily readable by visualisation softwares such as `Paraview `_
or `Visit `_. A set of python methods is also provided to read vtk file from your
python scripts in the `pytools` directory.
* user-defined analysis files. These are totally left to the user. They usually consist of ascii tables defined by the user, but they can
be anything.
The output periodicity and the userdef variables should all be declared in the input file, as described in :ref:`outputSection`.
Defining your own outputs
-------------------------
*Idefix* provides two ways to define your own outputs: analysis, which are used to make your
own output file (e.g. an ascii-tabulated file); and user variables, which are written by *Idefix* output routines.
Both analysis and uservar requires the definition of a user function which needs to be enrolled following the procedure described
in :ref:`functionEnrollment` and using the function signatures declared in `output.hpp`.
We provide below an example of a setup using both analysis outputs and uservar outputs
.. code-block::
:caption: Input file `idefix.ini`
[Output]
analysis 0.01 # A user-defined analysis will be performed every 0.01
vtk 1.0 # VTK files will be written every 1.0
uservar rhovx rhovy # Two user variables will be defined and written in vtk files
.. code-block:: c
:caption: Setup file `setup.cpp`
// Analyse data to produce an ascii output
void Analysis(DataBlock & data) {
// Mirror data on Host
DataBlockHost d(data);
// Sync it
d.SyncFromDevice();
// Get the field at some specific location
real by = d.Vc(BX2,0,0,0);
// Write the data in ascii to our file
std::ofstream f;
f.open("timevol.dat",std::ios::app);
f.precision(10);
f << std::scientific << data.t << "\t" << by << std::endl;
f.close();
}
// Compute user variables which will be written in vtk files
void ComputeUserVars(DataBlock & data, UserDefVariablesContainer &variables) {
// Mirror data on Host
DataBlockHost d(data);
// Sync it
d.SyncFromDevice();
// Make references to the user-defined arrays (variables is a container of IdefixHostArray3D)
// Note that the labels should match the variable names in the input file
IdefixHostArray3D rhovx = variables["rhovx"];
IdefixHostArray3D rhovy = variables["rhovy"];
for(int k = 0; k < d.np_tot[KDIR] ; k++) {
for(int j = 0; j < d.np_tot[JDIR] ; j++) {
for(int i = 0; i < d.np_tot[IDIR] ; i++) {
rhovx(k,j,i) = d.Vc(VX1,k,j,i)*d.Vc(RHO,k,j,i);
rhovy(k,j,i) = d.Vc(VX2,k,j,i)*d.Vc(RHO,k,j,i);
}
}
}
}
// Setup constructor, initialises our setup
Setup::Setup(Input &input, Grid &grid, DataBlock &data, Output &output) {
// Enroll our analysis function
output.EnrollAnalysis(&Analysis);
// Enroll our user-defined variables
output.EnrollUserDefVariables(&ComputeUserVars);
}
void Setup::InitFlow(DataBlock &data) {
// Not shown here
}