## Copyright (C) 2010 Kurnia Wano, Levente Torok
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; If not, see .
## -*- texinfo -*-
## @deftypefn {Function File} [ @var{status} ] = savevtk ( @var{X}, @var{Y}, @var{Z}, @var{filename} )
## savevtk Save a 3-D scalar array in VTK format.
##
## savevtk( array, filename ) saves a 3-D array of any size to
## filename in VTK format. This file format is used by Mayavi2 for example.
##
## If no write errors occurred, output argument status is set to 1, otherwise 0.
##
## Example:
##
## @example
## n = 30;
## X = zeros(n,n,n);
## for x = 1:n
## for y = 1:n
## for z = 1:n
## X(x, y, z) = 1/sqrt ( x*x + y*y + z*z );
## endfor
## endfor
## endfor
## X = X * 200 / max(max(max(X)));
## savevtk( X, "spherical.vtk");
## @end example
##
## @seealso savevtkvector
##
## @end deftypefn
##
## Author: Kurnia Wano, Levente Torok
## Created: 2010-08-02 matlab version
## Updates: 2010-11-03 octave adoptation
##
function [status ] = savevtk (array, filename="vtkout.vtk")
status = 0;
if (nargin < 1), usage ("[status] = savevtk (array, filename)"); endif
dims = size (array)
if ( size (dims) != 3)
# if (ndims (A) != 3)
error ("Save Vtk requires a 3 dimensional array");
endif
[nx, ny, nz] = size (array);
if (ischar (filename))
[fid, msg] = fopen (filename, 'wt');
if (fid < 0)
error ("Cannot open file for saving file. %s", msg);
endif
else
usage ("Filename expected for arg # 2");
endif
try
fprintf (fid, '# vtk DataFile Version 2.0\n');
fprintf (fid, 'Comment goes here\n');
fprintf (fid, 'ASCII\n');
fprintf (fid, '\n');
fprintf (fid, 'DATASET STRUCTURED_POINTS\n');
fprintf (fid, 'DIMENSIONS %d %d %d\n', nx, ny, nz);
fprintf (fid, '\n');
fprintf (fid, 'ORIGIN 0.000 0.000 0.000\n');
fprintf (fid, 'SPACING 1.000 1.000 1.000\n');
fprintf (fid, '\n');
fprintf (fid, 'POINT_DATA %d\n', nx*ny*nz);
fprintf (fid, 'SCALARS scalars double\n');
fprintf (fid, 'LOOKUP_TABLE default\n');
fprintf (fid, '\n');
for a=1:nz
for b=1:ny
for c=1:nx
fprintf (fid, '%d ', array(c, b, a));
endfor
fprintf (fid, '\n');
endfor
endfor
fclose (fid);
status = 1;
catch
error ("Error writing file %s - disk full?", filename);
end_try_catch
endfunction