function mesh = load_SBCmesh_dat(datFile)
%LOAD_SBCMESH_DAT  Read SBCmesh.dat (1-based indices, same as MATLAB getMesh).
fid = fopen(datFile, 'r');
assert(fid > 0, 'Cannot open mesh file: %s', datFile);

tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'NbrVertex'), 'Expected NbrVertex');
mesh.NbrVertex = fscanf(fid, '%d', 1);
tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'Vertex'));
mesh.Vertex = reshape(fscanf(fid, '%f', mesh.NbrVertex * 3), 3, []).';

tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'NbrTet'));
mesh.NbrTet = fscanf(fid, '%d', 1);
tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'Tet'));
mesh.Tet = reshape(fscanf(fid, '%d', mesh.NbrTet * 4), 4, []).';

tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'DomainOfTet'));
mesh.DomainOfTet = fscanf(fid, '%d', mesh.NbrTet);

tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'NbrEdge'));
mesh.NbrEdge = fscanf(fid, '%d', 1);
tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'Edge'));
fscanf(fid, '%f', mesh.NbrEdge * 2);

tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'EdgeOfTet'));
mesh.EdgeOfTet = reshape(fscanf(fid, '%d', mesh.NbrTet * 6), 6, []).';

tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'NbrTri'));
mesh.NbrTri = fscanf(fid, '%d', 1);
tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'Tri'));
mesh.Tri = reshape(fscanf(fid, '%d', mesh.NbrTri * 3), 3, []).';

tag = fscanf(fid, '%s', 1);
assert(strcmp(tag, 'DomainOfTri'));
mesh.DomainOfTri = fscanf(fid, '%d', mesh.NbrTri);

if ~feof(fid)
    tag = fscanf(fid, '%s', 1);
    if strcmp(tag, 'ConnOfTri')
        mesh.ConnOfTri = reshape(fscanf(fid, '%d', mesh.NbrTri * 2), 2, []).';
    end
end

fclose(fid);
end
