/****************************************************************************** Module Name : vtkwriter.h Module Date : 08/20/2014 Module Auth : Yonggang Li, ygli@theory.issp.ac.cn Description : VTK file format writer. This file contains function prototypes for writing out point meshes, unstructured meshes, rectilinear meshes, regular meshes, and structured/curvilinear meshes into files that can later be red by VisIt/ParaView. Each routine assumes that the data being written is three-dimensional. If the data is two-dimensional, you must still write out the data as three-dimensional (ie pad arrays so that they are the correct size, etc). However: the VisIt/ParaView reader will determine that the data is truly two-dimensional and visualize it as a two-dimensional dataset. All writers have an ASCII vs Binary decision. The trade-offs are the standard ones: ASCII is human readable, but slow. The binary is much faster, but not human readable. Note: the binary format is portable, since it converts all data to be big-endian (this was a design decision for the format the visit_writer writes to -- the VTK format). If you have multiple grids, you can write out one file for each grid. There are potential pitfalls in doing this, where extra geometry and interpolation problems appear along grid boundaries. Others : Refers to visit_writer. Revision History: Date Rel Ver. Notes ******************************************************************************/ #ifndef VTKWRITER_H #define VTKWRITER_H /*------------------------------Includes-----------------------------*/ #include #include #include #include "im3d.h" #include "target.h" #include "fileio.h" #include "transport.h" #include "material.h" /*------------------------------Defines------------------------------*/ /*--------------------------Global variables-------------------------*/ //static FILE *fp = NULL; //static int useBinary = 0; //static int numInColumn = 0; /*-----------------------------Functions-----------------------------*/ /* Store the results of the simulation (arrays with distribution of implanted ions, defects etc.) in msh format */ int store_results_vtk (char *base_name); /* Writes the designated array of Count elements into a vtk file */ int write_int_array_to_vtk_file (char *file_name, int mat_i, int *source_array_total, int *source_array_part[], int count, int n_element); /* Writes the designated array of Count elements into a vtk file */ int write_double_array_to_vtk_file (char *file_name, double *source_array1, double *source_array2, int count); /* Calculate the average value of the nodes */ float average_node_value_int (int index, int *element_non_zero, int *source_array); /* Calculate the average value of the nodes */ float average_node_value_double (int index, int *element_non_zero, double *source_array); /*============================================================================= Function: write_point_mesh Purpose: Writes out a point mesh. Arguments: filename The name of the file to write. If the extension ".vtk" is not present, it will be added. useBinary '0' to write ASCII, !0 to write binary npts The number of points in the mesh. pts The spatial locations of the points. This array should be size 3*npts. The points should be encoded as: nvars The number of variables. vardim The dimension of each variable. The size of vardim should be nvars. If var i is a scalar, then vardim[i] = 1. If var i is a vector, then vardim[i] = 3. vars An array of variables. The size of vars should be nvars. The size of vars[i] should be npts*vardim[i]. Programmer: Hank Childs Creation: September 2, 2004 =============================================================================*/ void write_point_mesh (const char *filename, int useBinary, int npts, float *pts, int nvars, int *vardim, const char * const *varnames, float **vars); /*============================================================================= Function: write_unstructured_mesh Purpose: Writes out a unstructured mesh. Arguments: filename The name of the file to write. If the extension ".vtk" is not present, it will be added. useBinary '0' to write ASCII, !0 to write binary npts The number of points in the mesh. pts The spatial locations of the points. This array should be size 3*npts. The points should be encoded as: ncells The number of cells. celltypes The type of each cell. conn The connectivity array. nvars The number of variables. vardim The dimension of each variable. The size of vardim should be nvars. If var i is a scalar, then vardim[i] = 1. If var i is a vector, then vardim[i] = 3. centering The centering of each variable. The size of centering should be nvars. If centering[i] == 0, then the variable is cell-based. If centering[i] != 0, then the variable is point-based. vars An array of variables. The size of vars should be nvars. The size of vars[i] should be npts*vardim[i]. Example: You have two triangles. The first has points (0,0,0), (0,1,0), and (1,1,0). The second has points (0,0,0), (1,1,0), and (1,0,0). There are four unique points. float pts[12] = { 0,0,0, 0,1,0, 1,1,0, 1,0,0 }; It is important the points list contain only unique points, because VisIt/ParaView is not able to correctly determine the connectivity of a dataset when points are duplicated. There are two triangles. int ncells = 2; The cells are both triangles. int celltypes[2] = { VISIT_TRIANGLE, VISIT_TRIANGLE }; The connectivity contains indices into the points list. The indexing assumes that each point has size 3 (x,y,z). int conn[6] = { 0, 1, 2, 0, 2, 3 }; Hint: When writing an unstructured mesh, it is easy to get the orientation of a cell backwards. VisIt typically does okay with this, but it can cause problems. To test if this is happening, bring up VisIt on your newly outputted dataset and make a Pseudocolor plot of "mesh_quality/volume" for 3D datasets or "mesh_quality/area" for 2D datasets. If the cells are inside-out, the volumes or areas will be negative. Programmer: Hank Childs Creation: September 2, 2004 =============================================================================*/ #define VTK_VERTEX 1 #define VTK_LINE 3 #define VTK_TRIANGLE 5 #define VTK_QUAD 9 #define VTK_TETRA 10 #define VTK_HEXAHEDRON 12 #define VTK_WEDGE 13 #define VTK_PYRAMID 14 void write_unstructured_mesh (const char *filename, int useBinary, int npts, float *pts, int ncells, int *celltypes, int *conn, int nvars, int *vardim, int *centering, const char * const *varnames, float **vars); /*============================================================================= Function: write_regular_mesh Purpose: Writes out a regular mesh. A regular mesh is one where the data lies along regular intervals. "Brick of bytes/floats", "Block of bytes/floats", and MRI data all are examples of data that lie on regular meshes. Arguments: filename The name of the file to write. If the extension ".vtk" is not present, it will be added. useBinary '0' to write ASCII, !0 to write binary dims An array of size 3 = { nX, nY, nZ }, where nX is the number of points in the X-dimension, etc. nvars The number of variables. vardim The dimension of each variable. The size of vardim should be nvars. If var i is a scalar, then vardim[i] = 1. If var i is a vector, then vardim[i] = 3. centering The centering of each variable. The size of centering should be nvars. If centering[i] == 0, then the variable is cell-based. If centering[i] != 0, then the variable is point-based. vars An array of variables. The size of vars should be nvars. The size of vars[i] should be npts*vardim[i]. Programmer: Hank Childs Creation: September 2, 2004 =============================================================================*/ void write_regular_mesh (const char *filename, int useBinary, int *dims, int nvars, int *vardim, int *centering, const char * const *varnames, float **vars); /*============================================================================= Function: write_rectilinear_mesh Purpose: Writes out a rectilinear mesh. Arguments: filename The name of the file to write. If the extension ".vtk" is not present, it will be added. useBinary '0' to write ASCII, !0 to write binary dims An array of size 3 = { nX, nY, nZ }, where nX is the number of points in the X-dimension, etc. x An array of size dims[0] that contains the x-coordinates. y An array of size dims[1] that contains the y-coordinates. z An array of size dims[2] that contains the z-coordinates. nvars The number of variables. vardim The dimension of each variable. The size of vardim should be nvars. If var i is a scalar, then vardim[i] = 1. If var i is a vector, then vardim[i] = 3. centering The centering of each variable. The size of centering should be nvars. If centering[i] == 0, then the variable is cell-based. If centering[i] != 0, then the variable is point-based. vars An array of variables. The size of vars should be nvars. The size of vars[i] should be npts*vardim[i]. Example: You have a rectilinear mesh with x = { 0, 1, 2}, y = { 1, 1.5, 2, 3 }, and z = { 2.5, 3.5 }. Then dims = { 3, 4, 2 }. Programmer: Hank Childs Creation: September 2, 2004 =============================================================================*/ void write_rectilinear_mesh (const char *filename, int useBinary, int *dims, float *x, float *y, float *z, int nvars, int *vardim, int *centering, const char * const *varnames, float **vars); /*============================================================================= Function: write_curvilinear_mesh Purpose: Writes out a curvilinear mesh. Arguments: filename The name of the file to write. If the extension ".vtk" is not present, it will be added. useBinary '0' to write ASCII, !0 to write binary dims An array of size 3 = { nI, nJ, nK }, where nI is the number of points in the logical I dimension, etc. pts An array of size nI*nJ*nK*3. The array should be layed out as (pt(i=0,j=0,k=0), pt(i=1,j=0,k=0), ... pt(i=nI-1,j=0,k=0), pt(i=0,j=1,k=0), ...). nvars The number of variables. vardim The dimension of each variable. The size of vardim should be nvars. If var i is a scalar, then vardim[i] = 1. If var i is a vector, then vardim[i] = 3. centering The centering of each variable. The size of centering should be nvars. If centering[i] == 0, then the variable is cell-based. If centering[i] != 0, then the variable is point-based. vars An array of variables. The size of vars should be nvars. The size of vars[i] should be npts*vardim[i]. Programmer: Hank Childs Creation: September 2, 2004 =============================================================================*/ void write_curvilinear_mesh (const char *filename, int useBinary, int *dims, float *pts, int nvars, int *vardim, int *centering, const char * const *varnames, float **vars); #endif