save_2D.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This file is part of NS2DDV. %
% %
% Copyright(C) 2011-2018 C. Calgaro (caterina.calgaro@math.univ-lille1.fr) %
% E. Creusé (emmanuel.creuse@math.univ-lille1.fr) %
% T. Goudon (thierry.goudon@inria.fr) %
% A. Mouton (alexandre.mouton@math.univ-lille1.fr) %
% %
% NS2DDV 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 3 of the License, or (at your option) any later version. %
% %
% NS2DDV 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 %
% NS2DDV. If not, see <http://www.gnu.org/licenses/>. %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[] = save_2D(outputs, MESH, namemesh, time, namefile, PARAMETERS)
% INPUT
% outputs Structure gathering all the required data for visualization and saving
% MESH Mesh metadata
% namemesh Name of mesh file associated to the output file
% time Time value
% namefile Name of the result file to be saved
% PARAMETERS List of simulation parameters
v = version('-release');
vnum = str2num(v(1:4));
usemat = (vnum < 2011);
usehdf5 = ~usemat;
if usemat
METHOD_U = PARAMETERS.FE.TYPE;
METHOD_P = 'P1';
Reynolds = PARAMETERS.PHYSICAL.RE;
NAME_MESH = 'Mesh';
Geometry = PARAMETERS.DOMAIN.GEOMETRY;
save(namefile, 'time', 'NAME_MESH', 'namemesh', 'METHOD_U', 'METHOD_P', 'Reynolds', 'Geometry');
if strcmp(PARAMETERS.MODEL, 'NSDV')
METHOD_RHO = PARAMETERS.FE.TYPE_DENSITY;
save(namefile, 'METHOD_RHO', '-append');
end
end
if usehdf5
nameh5 = strcat(namefile(1:(size(namefile,2)-3)), 'h5');
unix(sprintf('rm %s 2>/dev/null', nameh5));
h5create(nameh5, '/Time', 1, 'Datatype', 'double');
h5write(nameh5, '/Time', time);
h5create(nameh5, '/Reynolds_number', 1, 'Datatype', 'double');
h5write(nameh5, '/Reynolds_number', PARAMETERS.PHYSICAL.RE);
h5writeatt(nameh5, '/', 'Mesh', strcat(namemesh(1:(size(namemesh,2)-3)), 'h5'));
h5writeatt(nameh5, '/', 'Method_velocity', PARAMETERS.FE.TYPE);
h5writeatt(nameh5, '/', 'Method_pressure', 'P1');
if strcmp(PARAMETERS.MODEL, 'NSDV')
h5writeatt(nameh5, '/', 'Method_density', 'P1');
end
h5writeatt(nameh5, '/', 'Geometry', PARAMETERS.DOMAIN.GEOMETRY);
namemeshh5 = strcat(namemesh(1:(size(namemesh,2)-4)), '.h5');
C = strsplit(namemeshh5, '/');
namemeshh5 = C{numel(C)};
C = strsplit(nameh5, '/');
namerefh5 = C{numel(C)};
switch PARAMETERS.FE.TYPE
case {'P1B'}
nMesh = 'Mesh_P1B';
nmesh = 'MESH_p1b';
nst = size(MESH.st1b,2);
nfst = 'MESH_st1b';
np = MESH.np1b;
case {'P2'}
nMesh = 'Mesh_P2';
nmesh = 'MESH_p2';
nst = size(MESH.st2,2);
nfst = 'MESH_st2';
np = MESH.np2;
otherwise
error('Unknown FE method');
end
namexdmf = strcat(namefile(1:(size(namefile,2)-3)), 'xdmf');
lh = 1;
hbuf{lh} = sprintf('<?xml version="1.0" ?>\n');
lh = lh+1;
hbuf{lh} = sprintf('<Xdmf Version="2.0">\n');
lh = lh+1;
hbuf{lh} = sprintf(' <Domain>\n');
lh = lh+1;
lf = 1;
fbuf{lf} = sprintf(' </Domain>\n');
lf = lf+1;
fbuf{lf} = sprintf('</Xdmf>\n');
lf = lf+1;
lp = 1;
pbuf{lp} = sprintf(' <Grid Name="Mesh_P1" GridType="Uniform">\n');
lp = lp+1;
pbuf{lp} = sprintf(' <Topology TopologyType="Triangle" NumberOfElements="%d">\n', MESH.nt1);
lp = lp+1;
pbuf{lp} = sprintf(' <DataItem Dimensions="%d" Format="HDF">\n', MESH.nt1*3);
lp = lp+1;
pbuf{lp} = sprintf(' %s:/MESH_t1\n', namemeshh5);
lp = lp+1;
pbuf{lp} = sprintf(' </DataItem>\n');
lp = lp+1;
pbuf{lp} = sprintf(' </Topology>\n');
lp = lp+1;
pbuf{lp} = sprintf(' <Geometry GeometryType="XY">\n');
lp = lp+1;
pbuf{lp} = sprintf(' <DataItem Dimensions="%d" Format="HDF">\n', MESH.np1*2);
lp = lp+1;
pbuf{lp} = sprintf(' %s:/MESH_p1\n', namemeshh5);
lp = lp+1;
pbuf{lp} = sprintf(' </DataItem>\n');
lp = lp+1;
pbuf{lp} = sprintf(' </Geometry>\n');
lp = lp+1;
lv = 1;
vbuf{lv} = sprintf(' <Grid Name="%s" GridType="Uniform">\n', nMesh);
lv = lv+1;
vbuf{lv} = sprintf(' <Topology TopologyType="Triangle" NumberOfElements="%d">\n', nst);
lv = lv+1;
vbuf{lv} = sprintf(' <DataItem Dimensions="%d" Format="HDF">\n', nst*3);
lv = lv+1;
vbuf{lv} = sprintf(' %s:/%s\n', namemeshh5, nfst);
lv = lv+1;
vbuf{lv} = sprintf(' </DataItem>\n');
lv = lv+1;
vbuf{lv} = sprintf(' </Topology>\n');
lv = lv+1;
vbuf{lv} = sprintf(' <Geometry GeometryType="XY">\n');
lv = lv+1;
vbuf{lv} = sprintf(' <DataItem Dimensions="%d" Format="HDF">\n', np*2);
lv = lv+1;
vbuf{lv} = sprintf(' %s:/%s\n', namemeshh5, nmesh);
lv = lv+1;
vbuf{lv} = sprintf(' </DataItem>\n');
lv = lv+1;
vbuf{lv} = sprintf(' </Geometry>\n');
lv = lv+1;
end
uvectsaved = false;
uvectexsaved = false;
gradpsaved = false;
gradpexsaved = false;
wvectsaved = false;
for i=1:size(outputs,1)
if max(strcmp(outputs{i,2}, {'SAVE', 'PLOTSAVE', 'SAVEPLOT'}))
switch outputs{i,1}
case {'MESH', 'SUBTRI_U'}
% Nothing to do here (see save_mesh.m)
case {'UX'}
if usemat
% Nothing to do --> see case {'U_VECTOR'}
end
if usehdf5
namescalar = 'Velocity_x';
ivect = outputs{i,3}(1);
scalar = outputs{ivect,3}(:,1)';
end
case {'UX_EX'}
if usemat
% Nothing to do --> see case {'U_VECTOR_EX'}
end
if usehdf5
namescalar = 'Velocity_x_exact';
ivect = outputs{i,3}(1);
scalar = outputs{ivect,3}(:,1)';
end
case {'UY'}
if usemat
% Nothing to do --> see case {'U_VECTOR'}
end
if usehdf5
namescalar = 'Velocity_y';
ivect = outputs{i,3}(1);
scalar = outputs{ivect,3}(:,2)';
end
case {'UY_EX'}
if usemat
% Nothing to do --> see case {'U_VECTOR_EX'}
end
if usehdf5
namescalar = 'Velocity_y_exact';
ivect = outputs{i,3}(1);
scalar = outputs{ivect,3}(:,2)';
end
case {'U_VECTOR'}
if usemat
u = outputs{i,3}(:,1:2);
NAME_U = 'Velocity';
save(namefile, 'u', 'NAME_U', '-append');
end
if usehdf5
namevector = 'Velocity';
namescalars = {'Velocity_x', 'Velocity_y'};
vector = outputs{i,3}(:,1:2);
end
case {'U_VECTOR_EX'}
if usemat
uex = outputs{i,3}(:,1:2);
NAME_UEX = 'Velocity';
save(namefile, 'uex', 'NAME_UEX', '-append');
end
if usehdf5
namevector = 'Velocity_exact';
namescalars = {'Velocity_x_exact', 'Velocity_y_exact'};
vector = outputs{i,3}(:,1:2);
end
case {'U_MODULE'}
if usemat
umod = outputs{i,3};
NAME_UMOD = 'Velocity magnitude';
save(namefile, 'umod', 'NAME_UMOD', '-append');
end
if usehdf5
namescalar = 'Velocity_magnitude';
scalar = outputs{i,3};
end
case {'U_MODULE_EX'}
if usemat
umodex = outputs{i,3};
NAME_UMODEX = 'Velocity magnitude (exact)';
save(namefile, 'umodex', 'NAME_UMODEX', '-append');
end
if usehdf5
namescalar = 'Velocity_magnitude_exact';
scalar = outputs{i,3};
end
case {'VORTIC'}
if usemat
omega = outputs{i,3};
NAME_OMEGA = 'Vorticity';
save(namefile, 'omega', 'NAME_OMEGA', '-append');
end
if usehdf5
namescalar = 'Vorticity';
scalar = outputs{i,3};
end
case {'VORTIC_EX'}
if usemat
omegaex = outputs{i,3};
NAME_OMEGAEX = 'Vorticity (exact)';
save(namefile, 'omegaex', 'NAME_OMEGAEX', '-append');
end
if usehdf5
namescalar = 'Vorticity_exact';
scalar = outputs{i,3};
end
case {'STREAM'}
if usemat
psi = outputs{i,3};
NAME_PSI = 'Streamlines';
save(namefile, 'psi', 'NAME_PSI', '-append');
end
if usehdf5
namescalar = 'Streamlines';
scalar = outputs{i,3};
end
case {'STREAM_EX'}
if usemat
psiex = outputs{i,3};
NAME_PSIEX = 'Streamlines (exact)';
save(namefile, 'psiex', 'NAME_PSIEX', '-append');
end
if usehdf5
namescalar = 'Streamlines_exact';
scalar = outputs{i,3};
end
case {'UX_DX'}
if usemat
dxux = outputs{i,3};
NAME_DXUX = 'x-derivative of velocity (x-component)';
save(namefile, 'dxux', 'NAME_DXUX', '-append');
end
if usehdf5
namescalar = 'Velocity_x_dx';
scalar = outputs{i,3};
end
case {'UX_DX_EX'}
if usemat
dxuxex = outputs{i,3};
NAME_DXUXEX = 'x-derivative of velocity (x-component) (exact)';
save(namefile, 'dxuxex', 'NAME_DXUXEX', '-append');
end
if usehdf5
namescalar = 'Velocity_x_dx_exact';
scalar = outputs{i,3};
end
case {'UX_DY'}
if usemat
dyux = outputs{i,3};
NAME_DYUX = 'y-derivative of velocity (x-component)';
save(namefile, 'dyux', 'NAME_DYUX', '-append');
end
if usehdf5
namescalar = 'Velocity_x_dy';
scalar = outputs{i,3};
end
case {'UX_DY_EX'}
if usemat
dyuxex = outputs{i,3};
NAME_DYUXEX = 'y-derivative of velocity (x-component) (exact)';
save(namefile, 'dyuxex', 'NAME_DYUXEX', '-append');
end
if usehdf5
namescalar = 'Velocity_x_dy_exact';
scalar = outputs{i,3};
end
case {'UY_DX'}
if usemat
dxuy = outputs{i,3};
NAME_DXUY = 'x-derivative of velocity (y-component)';
save(namefile, 'dxuy', 'NAME_DXUY', '-append');
end
if usehdf5
namescalar = 'Velocity_y_dx';
scalar = outputs{i,3};
end
case {'UY_DX_EX'}
if usemat
dxuyex = outputs{i,3};
NAME_DXUYEX = 'x-derivative of velocity (y-component) (exact)';
save(namefile, 'dxuyex', 'NAME_DXUYEX', '-append');
end
if usehdf5
namescalar = 'Velocity_y_dx_exact';
scalar = outputs{i,3};
end
case {'UY_DY'}
if usemat
dyuy = outputs{i,3};
NAME_DYUY = 'y-derivative of velocity (y-component)';
save(namefile, 'dyuy', 'NAME_DYUY', '-append');
end
if usehdf5
namescalar = 'Velocity_y_dy';
scalar = outputs{i,3};
end
case {'UY_DY_EX'}
if usemat
dyuyex = outputs{i,3};
NAME_DYUYEX = 'y-derivative of velocity (y-component) (exact)';
save(namefile, 'dyuyex', 'NAME_DYUYEX', '-append');
end
if usehdf5
namescalar = 'Velocity_y_dy_exact';
scalar = outputs{i,3};
end
case {'SHEAR'}
if usemat
shear = outputs{i,3};
NAME_SHEAR = 'Shear rate';
save(namefile, 'shear', 'NAME_SHEAR', '-append');
end
if usehdf5
namescalar = 'Shear_rate';
scalar = outputs{i,3};
end
case {'SHEAR_EX'}
if usemat
shearex = outputs{i,3};
NAME_DYUYEX = 'Shear rate (exact)';
save(namefile, 'shearex', 'NAME_SHEAREX', '-append');
end
if usehdf5
namescalar = 'Shear_rate_exact';
scalar = outputs{i,3};
end
case {'RHO'}
if usemat
rho = outputs{i,3};
NAME_RHO = 'Density';
save(namefile, 'rho', 'NAME_RHO', '-append');
end
if usehdf5
namescalar = 'Density';
scalar = outputs{i,3};
end
case {'RHO_EX'}
if usemat
rhoex = outputs{i,3};
NAME_RHOEX = 'Density (exact)';
save(namefile, 'rhoex', 'NAME_RHOEX', '-append');
end
if usehdf5
namescalar = 'Density_exact';
scalar = outputs{i,3};
end
case {'WX'}
if usemat
% Nothing to do --> see case {'W_VECTOR'}
end
if usehdf5
namescalar = 'w_x';
ivect = outputs{i,3}(1);
scalar = outputs{ivect,3}(:,1)';
end
case {'WY'}
if usemat
% Nothing to do --> see case {'W_VECTOR'}
end
if usehdf5
namescalar = 'w_y';
ivect = outputs{i,3}(1);
scalar = outputs{ivect,3}(:,2)';
end
case {'W_VECTOR'}
if usemat
w = outputs{i,3}(:,1:2);
NAME_W = 'w';
save(namefile, 'w', 'NAME_W', '-append');
end
if usehdf5
namevector = 'w';
namescalars = {'w_x', 'w_y'};
vector = outputs{i,3}(:,1:2);
end
case {'R'}
if usemat
r = outputs{i,3};
NAME_R = 'r';
save(namefile, 'r', 'NAME_R', '-append');
end
if usehdf5
namescalar = 'r';
scalar = outputs{i,3};
end
case {'P'}
if usemat
p = outputs{i,3};
NAME_P = 'Pressure';
save(namefile, 'p', 'NAME_P', '-append');
end
if usehdf5
namescalar = 'Pressure';
scalar = outputs{i,3};
end
case {'P_EX'}
if usemat
pex = outputs{i,3};
NAME_PEX = 'Pressure (exact)';
save(namefile, 'pex', 'NAME_PEX', '-append');
end
if usehdf5
namescalar = 'Pressure_exact';
scalar = outputs{i,3};
end
case {'P_DX'}
if usemat
% Nothing to do --> see case {'GRAD_P'}
end
if usehdf5
namescalar = 'Pressure_gradient_x';
scalar = outputs{i,3};
end
case {'P_DX_EX'}
if usemat
% Nothing to do --> see case {'GRAD_P_EX'}
end
if usehdf5
namescalar = 'Pressure_gradient_x_exact';
scalar = outputs{i,3};
end
case {'P_DY'}
if usemat
% Nothing to do --> see case {'GRAD_P'}
end
if usehdf5
namescalar = 'Pressure_gradient_y';
scalar = outputs{i,3};
end
case {'P_DY_EX'}
if usemat
% Nothing to do --> see case {'GRAD_P_EX'}
end
if usehdf5
namescalar = 'Pressure_gradient_y_exact';
scalar = outputs{i,3};
end
case {'GRAD_P'}
if usemat
gradp = outputs{i,3}(:,1:2);
NAME_GRADP = 'Pressure gradient';
save(namefile, 'gradp', 'NAME_GRADP', '-append');
end
if usehdf5
namevector = 'Pressure_gradient';
namescalars = {'Pressure_gradient_x', 'Pressure_gradient_y'};
vector = outputs{i,3}(:,1:2);
end
case {'GRAD_P_EX'}
if usemat
gradpex = outputs{i,3}(:,1:2);
NAME_GRADPEX = 'Pressure gradient (exact)';
save(namefile, 'gradpex', 'NAME_GRADPEX', '-append');
end
if usehdf5
namevector = 'Pressure_gradient_exact';
namescalars = {'Pressure_gradient_x_exact', 'Pressure_gradient_y_exact'};
vector = outputs{i,3}(:,1:2);
end
otherwise
error(sprintf('Unknown diagnostic : %s\n', outputs{i,1}));
end
% For HDF5 save mode, add the data to the .h5 file and update the buffers for the XDMF descriptor
if usehdf5
A = h5info(nameh5);
switch outputs{i,1}
case {'MESH', 'SUBTRI_U'}
% Nothing to do here (see save_mesh.m)
case {'UX', 'UX_EX', 'UY', 'UY_EX', 'U_MODULE', 'U_MODULE_EX', 'WX', 'WY'}
% Scalar data on the velocity nodes
if ~max(strcmp(namescalar, {A.Datasets(:).Name}))
h5create(nameh5, strcat('/', namescalar), size(scalar), 'Datatype', 'double');
h5write(nameh5, strcat('/', namescalar), scalar);
end
vbuf{lv} = sprintf(' <Attribute Name="%s" AttributeType="Scalar" Center="Node">\n', namescalar);
lv = lv+1;
vbuf{lv} = sprintf(' <DataItem Dimensions="%d" Format="HDF">\n', np);
lv = lv+1;
vbuf{lv} = sprintf(' %s:/%s\n', namerefh5, namescalar);
lv = lv+1;
vbuf{lv} = sprintf(' </DataItem>\n');
lv = lv+1;
vbuf{lv} = sprintf(' </Attribute>\n');
lv = lv+1;
case {'RHO', 'RHO_EX', 'P', 'P_EX', 'R', 'VORTIC', 'VORTIC_EX', ...
'STREAM', 'STREAM_EX', 'UX_DX', 'UX_DX_EX', 'UX_DY', 'UX_DY_EX', ...
'UY_DX', 'UY_DX_EX', 'UY_DY', 'UY_DY_EX', 'SHEAR', 'SHEAR_EX'}
% Scalar data on the pressure nodes
if ~max(strcmp(namescalar, {A.Datasets(:).Name}))
h5create(nameh5, strcat('/', namescalar), size(scalar), 'Datatype', 'double');
h5write(nameh5, strcat('/', namescalar), scalar);
end
pbuf{lp} = sprintf(' <Attribute Name="%s" AttributeType="Scalar" Center="Node">\n', namescalar);
lp = lp+1;
pbuf{lp} = sprintf(' <DataItem Dimensions="%d" Format="HDF">\n', MESH.np1);
lp = lp+1;
pbuf{lp} = sprintf(' %s:/%s\n', namerefh5, namescalar);
lp = lp+1;
pbuf{lp} = sprintf(' </DataItem>\n');
lp = lp+1;
pbuf{lp} = sprintf(' </Attribute>\n');
lp = lp+1;
case {'U_VECTOR', 'U_VECTOR_EX', 'W_VECTOR'}
% Vector data on the velocity nodes
if ~max(strcmp(namescalars{1}, {A.Datasets(:).Name}))
h5create(nameh5, strcat('/', namescalars{1}), size(vector(:,1)'), 'Datatype', 'double');
h5write(nameh5, strcat('/', namescalars{1}), vector(:,1)');
end
if ~max(strcmp(namescalars{2}, {A.Datasets(:).Name}))
h5create(nameh5, strcat('/', namescalars{2}), size(vector(:,2)'), 'Datatype', 'double');
h5write(nameh5, strcat('/', namescalars{2}), vector(:,2)');
end
vbuf{lv} = sprintf(' <Attribute Name="%s" AttributeType="Vector" Center="Node">\n', namevector);
lv = lv+1;
vbuf{lv} = sprintf(' <DataItem ItemType="Function" Function="join($0, $1)" Dimensions="%d 2">\n', np);
lv = lv+1;
vbuf{lv} = sprintf(' <DataItem Name="%s" Dimensions="%d 1" Format="HDF">\n', namescalars{1}, np);
lv = lv+1;
vbuf{lv} = sprintf(' %s:/%s\n', namerefh5, namescalars{1});
lv = lv+1;
vbuf{lv} = sprintf(' </DataItem>\n');
lv = lv+1;
vbuf{lv} = sprintf(' <DataItem Name="%s" Dimensions="%d 1" Format="HDF">\n', namescalars{2}, np);
lv = lv+1;
vbuf{lv} = sprintf(' %s:/%s\n', namerefh5, namescalars{2});
lv = lv+1;
vbuf{lv} = sprintf(' </DataItem>\n');
lv = lv+1;
vbuf{lv} = sprintf(' </DataItem>\n');
lv = lv+1;
vbuf{lv} = sprintf(' </Attribute>\n');
lv = lv+1;
case {'P_DX', 'P_DX_EX', 'P_DY', 'P_DY_EX'}
% Scalar data on the pressure cells
if ~max(strcmp(namescalar, {A.Datasets(:).Name}))
h5create(nameh5, strcat('/', namescalar), size(scalar), 'Datatype', 'double');
h5write(nameh5, strcat('/', namescalar), scalar);
end
pbuf{lp} = sprintf(' <Attribute Name="%s" AttributeType="Scalar" Center="Cell">\n', namescalar);
lp = lp+1;
pbuf{lp} = sprintf(' <DataItem Dimensions="%d" Format="HDF">\n', MESH.nt1);
lp = lp+1;
pbuf{lp} = sprintf(' %s:/%s\n', namerefh5, namescalar);
lp = lp+1;
pbuf{lp} = sprintf(' </DataItem>\n');
lp = lp+1;
pbuf{lp} = sprintf(' </Attribute>\n');
lp = lp+1;
case {'GRAD_P', 'GRAD_P_EX'}
% Vector data on the pressure cells
if ~max(strcmp(namescalars{1}, {A.Datasets(:).Name}))
h5create(nameh5, strcat('/', namescalars{1}), size(vector(:,1)'), 'Datatype', 'double');
h5write(nameh5, strcat('/', namescalars{1}), vector(:,1)');
end
if ~max(strcmp(namescalars{2}, {A.Datasets(:).Name}))
h5create(nameh5, strcat('/', namescalars{2}), size(vector(:,2)'), 'Datatype', 'double');
h5write(nameh5, strcat('/', namescalars{2}), vector(:,2)');
end
pbuf{lp} = sprintf(' <Attribute Name="%s" AttributeType="Vector" Center="Cell">\n', namevector);
lp = lp+1;
pbuf{lp} = sprintf(' <DataItem ItemType="Function" Function="join($0, $1)" Dimensions="%d 2">\n', MESH.nt1);
lp = lp+1;
pbuf{lp} = sprintf(' <DataItem Name="%s" Dimensions="%d 1" Format="HDF">\n', namescalars{1}, MESH.nt1);
lp = lp+1;
pbuf{lp} = sprintf(' %s:/%s\n', namerefh5, namescalars{1});
lp = lp+1;
pbuf{lp} = sprintf(' </DataItem>\n');
lp = lp+1;
pbuf{lp} = sprintf(' <DataItem Name="%s" Dimensions="%d 1" Format="HDF">\n', namescalars{2}, MESH.nt1);
lp = lp+1;
pbuf{lp} = sprintf(' %s:/%s\n', namerefh5, namescalars{2});
lp = lp+1;
pbuf{lp} = sprintf(' </DataItem>\n');
lp = lp+1;
pbuf{lp} = sprintf(' </DataItem>\n');
lp = lp+1;
pbuf{lp} = sprintf(' </Attribute>\n');
lp = lp+1;
otherwise
error(sprintf('Unknown diagnostic : %s\n', outputs{i,1}));
end
end
end % End of filter on diagnostics to save
end % End of loop on list of diagnostics to plot and/or save
% If HDF5 save is considered, close the Grid tags in the XDMF descriptor, then write the XDMF file
if usehdf5
pbuf{lp} = sprintf(' </Grid>\n');
lp = lp+1;
vbuf{lv} = sprintf(' </Grid>\n');
lv = lv+1;
fid = fopen(namexdmf, 'w');
for i=1:numel(hbuf)
fprintf(fid, hbuf{i});
end
for i=1:numel(pbuf)
fprintf(fid, pbuf{i});
end
for i=1:numel(vbuf)
fprintf(fid, vbuf{i});
end
for i=1:numel(fbuf)
fprintf(fid, fbuf{i});
end
fclose(fid);
end
end