1
0
mirror of https://github.com/TREX-CoE/trexio.git synced 2024-12-24 13:23:44 +01:00
trexio/templator_hdf5.html

1804 lines
112 KiB
HTML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2022-06-03 Fri 08:39 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>HDF5 back end</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="TREX-CoE" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" title="Standard" href="trexio.css" type="text/css" />
<script type="text/javascript" src="org-info.js">
/**
*
* @source: org-info.js
*
* @licstart The following is the entire license notice for the
* JavaScript code in org-info.js.
*
* Copyright (C) 2012-2019 Free Software Foundation, Inc.
*
*
* The JavaScript code in this tag is free software: you can
* redistribute it and/or modify it under the terms of the GNU
* General Public License (GNU GPL) as published by the Free Software
* Foundation, either version 3 of the License, or (at your option)
* any later version. The code is distributed WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
*
* As additional permission under GNU GPL version 3 section 7, you
* may distribute non-source (e.g., minimized or compacted) forms of
* that code without the copy of the GNU GPL normally required by
* section 4, provided you include this license notice and a URL
* through which recipients can access the Corresponding Source.
*
* @licend The above is the entire license notice
* for the JavaScript code in org-info.js.
*
*/
</script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
org_html_manager.set("TOC_DEPTH", "4");
org_html_manager.set("LINK_HOME", "index.html");
org_html_manager.set("LINK_UP", "");
org_html_manager.set("LOCAL_TOC", "1");
org_html_manager.set("VIEW_BUTTONS", "0");
org_html_manager.set("MOUSE_HINT", "underline");
org_html_manager.set("FIXED_TOC", "0");
org_html_manager.set("TOC", "1");
org_html_manager.set("VIEW", "info");
org_html_manager.setup(); // activate after the parameters are set
/*]]>*///-->
</script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
</head>
<body>
<div id="org-div-home-and-up">
<a accesskey="h" href=""> UP </a>
|
<a accesskey="H" href="index.html"> HOME </a>
</div><div id="content">
<h1 class="title">HDF5 back end</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org49c4075">1. Template for HDF5 definitions</a></li>
<li><a href="#org87fb328">2. Template for HDF5 structures</a></li>
<li><a href="#org2f99c28">3. Template for HDF5 init/deinit</a></li>
<li><a href="#orgfb9b95b">4. Template for HDF5 has/read/write a numerical attribute</a></li>
<li><a href="#org9b7ef5b">5. Template for HDF5 has/read/write a dataset of numerical data</a></li>
<li><a href="#org0a9c2ae">6. Template for HDF5 has/read/write a dataset of sparse data</a></li>
<li><a href="#orgb31c882">7. Template for HDF5 has/read/write a dataset of strings</a></li>
<li><a href="#org7fea7f6">8. Template for HDF5 has/read/write a string attribute</a></li>
<li><a href="#org20dc905">9. Template for HDF5 delete a group (UNSAFE mode)</a></li>
<li><a href="#orged8ae62">10. Source code for the determinant part</a></li>
<li><a href="#orgc376ec9">11. Helper functions</a></li>
</ul>
</div>
</div>
<div id="outline-container-org49c4075" class="outline-2">
<h2 id="org49c4075"><span class="section-number-2">1</span> Template for HDF5 definitions</h2>
<div class="outline-text-2" id="text-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #483d8b;">#define</span> $GROUP$_GROUP_NAME <span style="color: #8b2252;">"$group$"</span>
<span style="color: #483d8b;">#define</span> $GROUP_NUM$_NAME <span style="color: #8b2252;">"$group_num$"</span>
<span style="color: #483d8b;">#define</span> $GROUP_DSET$_NAME <span style="color: #8b2252;">"$group_dset$"</span>
<span style="color: #483d8b;">#define</span> $GROUP_STR$_NAME <span style="color: #8b2252;">"$group_str$"</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org87fb328" class="outline-2">
<h2 id="org87fb328"><span class="section-number-2">2</span> Template for HDF5 structures</h2>
<div class="outline-text-2" id="text-2">
<p>
Polymorphism of the <code>trexio_t</code> type is handled by ensuring that the
corresponding types for all back ends can be safely casted to
<code>trexio_t</code>. This is done by making the back-end structs start with
<code>trexio_t parent</code> attribute:
</p>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #a020f0;">typedef</span> <span style="color: #a020f0;">struct</span> <span style="color: #228b22;">trexio_hdf5_s</span> {
<span style="color: #228b22;">trexio_t</span> <span style="color: #a0522d;">parent</span> ;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">file_id</span>;
hid_t $group$_group;
} <span style="color: #228b22;">trexio_hdf5_t</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org2f99c28" class="outline-2">
<h2 id="org2f99c28"><span class="section-number-2">3</span> Template for HDF5 init/deinit</h2>
<div class="outline-text-2" id="text-3">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_inquire</span>(<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span>* <span style="color: #a0522d;">file_name</span>)
{
/* <span style="color: #b22222;">H5Fis_hdf5 determines whether file is in HDF5 format </span>*/
<span style="color: #228b22;">htri_t</span> <span style="color: #a0522d;">rc</span> = H5Fis_hdf5(file_name);
<span style="color: #a020f0;">if</span> (rc &gt; 0 ) {
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS; //<span style="color: #b22222;">exists and HDF5</span>
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (rc == 0) {
<span style="color: #a020f0;">return</span> TREXIO_FILE_ERROR; //<span style="color: #b22222;">exists but not HDF5</span>
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">return</span> TREXIO_FAILURE; //<span style="color: #b22222;">does not exist or function fails</span>
}
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_init</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
/* <span style="color: #b22222;">If file doesn't exist, create it </span>*/
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">f_exists</span> = 0;
<span style="color: #a020f0;">struct</span> <span style="color: #228b22;">stat</span> <span style="color: #a0522d;">st</span>;
<span style="color: #a020f0;">if</span> (stat(file-&gt;file_name, &amp;st) == 0) f_exists = 1;
<span style="color: #a020f0;">if</span> (f_exists == 1) {
<span style="color: #a020f0;">switch</span> (file-&gt;mode) {
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'r'</span>:
// <span style="color: #b22222;">reading the existing file -&gt; open as RDONLY</span>
f-&gt;file_id = H5Fopen(file-&gt;file_name, H5F_ACC_RDONLY, H5P_DEFAULT);
<span style="color: #a020f0;">break</span>;
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'u'</span>:
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'w'</span>:
// <span style="color: #b22222;">writing the existing file -&gt; open as RDWRITE</span>
f-&gt;file_id = H5Fopen(file-&gt;file_name, H5F_ACC_RDWR, H5P_DEFAULT);
<span style="color: #a020f0;">break</span>;
}
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">switch</span> (file-&gt;mode) {
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'r'</span>:
// <span style="color: #b22222;">reading non-existing file -&gt; error</span>
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'u'</span>:
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'w'</span>:
// <span style="color: #b22222;">writing non-existing file -&gt; create it</span>
f-&gt;file_id = H5Fcreate(file-&gt;file_name, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
<span style="color: #a020f0;">break</span>;
}
}
/* <span style="color: #b22222;">Create or open groups in the hdf5 file assuming that they exist if file exists </span>*/
<span style="color: #a020f0;">switch</span> (file-&gt;mode) {
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'r'</span>:
<span style="color: #a020f0;">if</span> (H5Lexists(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT) &gt; 0) f-&gt;$group$_group = H5Gopen(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (H5Lexists(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT) == 0) f-&gt;$group$_group = (<span style="color: #228b22;">hid_t</span>) 0;
<span style="color: #a020f0;">break</span>;
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'u'</span>:
<span style="color: #a020f0;">case</span> <span style="color: #8b2252;">'w'</span>:
<span style="color: #a020f0;">if</span> (f_exists == 1) {
<span style="color: #a020f0;">if</span> (H5Lexists(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT) &gt; 0) f-&gt;$group$_group = H5Gopen(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (H5Lexists(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT) == 0) f-&gt;$group$_group = H5Gcreate(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
} <span style="color: #a020f0;">else</span> {
f-&gt;$group$_group = H5Gcreate(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
}
<span style="color: #a020f0;">break</span>;
}
<span style="color: #a020f0;">if</span> (f-&gt;$group$_group &lt; (<span style="color: #228b22;">hid_t</span>) 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_deinit</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #a020f0;">if</span> (f-&gt;$group$_group != (<span style="color: #228b22;">hid_t</span>) 0) H5Gclose(f-&gt;$group$_group);
f-&gt;$group$_group = 0;
H5Fclose(f-&gt;file_id);
f-&gt;file_id = 0;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-orgfb9b95b" class="outline-2">
<h2 id="orgfb9b95b"><span class="section-number-2">4</span> Template for HDF5 has/read/write a numerical attribute</h2>
<div class="outline-text-2" id="text-4">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_read_$group_num$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, $group_num_dtype_double$* <span style="color: #a020f0;">const</span> num)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (num == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
/* <span style="color: #b22222;">Quit if the dimensioning attribute is missing in the file </span>*/
<span style="color: #a020f0;">if</span> (H5Aexists(f-&gt;$group$_group, $GROUP_NUM$_NAME) == 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
/* <span style="color: #b22222;">Read the $group_num$ attribute of $group$ group </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">num_id</span> = H5Aopen(f-&gt;$group$_group, $GROUP_NUM$_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (num_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5Aread(num_id, H5T_$GROUP_NUM_H5_DTYPE$, num);
H5Aclose(num_id);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_write_$group_num$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, <span style="color: #a020f0;">const</span> $group_num_dtype_double$ num)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
/* <span style="color: #b22222;">Delete the attribute if it exists and if the file is open in UNSAFE mode </span>*/
<span style="color: #a020f0;">if</span> (trexio_hdf5_has_$group_num$(file) == TREXIO_SUCCESS &amp;&amp; file-&gt;mode == <span style="color: #8b2252;">'u'</span>) {
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status_del</span> = H5Adelete(f-&gt;$group$_group, $GROUP_NUM$_NAME);
<span style="color: #a020f0;">if</span> (status_del &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
/* <span style="color: #b22222;">Setup the dataspace </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dtype_id</span> = H5Tcopy(H5T_$GROUP_NUM_H5_DTYPE$);
<span style="color: #a020f0;">if</span> (dtype_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dspace_id</span> = H5Screate(H5S_SCALAR);
<span style="color: #a020f0;">if</span> (dspace_id &lt;= 0) {
H5Tclose(dtype_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">num_id</span> = H5Acreate(f-&gt;$group$_group,
$GROUP_NUM$_NAME,
dtype_id, dspace_id,
H5P_DEFAULT, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (num_id &lt;= 0) {
H5Sclose(dspace_id);
H5Tclose(dtype_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5Awrite(num_id, dtype_id, &amp;num);
H5Sclose(dspace_id);
H5Aclose(num_id);
H5Tclose(dtype_id);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_has_$group_num$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #a020f0;">if</span> (f-&gt;$group$_group == (<span style="color: #228b22;">hsize_t</span>) 0) <span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
<span style="color: #228b22;">htri_t</span> <span style="color: #a0522d;">status</span> = H5Aexists(f-&gt;$group$_group, $GROUP_NUM$_NAME);
/* <span style="color: #b22222;">H5Aexists returns positive value if attribute exists, 0 if does not, negative if error </span>*/
<span style="color: #a020f0;">if</span> (status &gt; 0){
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (status == 0) {
<span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org9b7ef5b" class="outline-2">
<h2 id="org9b7ef5b"><span class="section-number-2">5</span> Template for HDF5 has/read/write a dataset of numerical data</h2>
<div class="outline-text-2" id="text-5">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_read_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, $group_dset_dtype$* <span style="color: #a020f0;">const</span> $group_dset$, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">rank</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint64_t</span>* <span style="color: #a0522d;">dims</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> ($group_dset$ == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
// <span style="color: #b22222;">open the dataset to get its dimensions</span>
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span> = H5Dopen(f-&gt;$group$_group, $GROUP_DSET$_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
// <span style="color: #b22222;">allocate space for the dimensions to be read</span>
<span style="color: #228b22;">hsize_t</span>* <span style="color: #a0522d;">ddims</span> = CALLOC( (<span style="color: #228b22;">int</span>) rank, hsize_t);
<span style="color: #a020f0;">if</span> (ddims == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
// <span style="color: #b22222;">get the dataspace of the dataset</span>
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dspace_id</span> = H5Dget_space(dset_id);
// <span style="color: #b22222;">get the rank and dimensions of the dataset</span>
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">rrank</span> = H5Sget_simple_extent_dims(dspace_id, ddims, <span style="color: #008b8b;">NULL</span>);
// <span style="color: #b22222;">check that dimensions are consistent</span>
<span style="color: #a020f0;">if</span> (rrank != (<span style="color: #228b22;">int</span>) rank) {
FREE(ddims);
H5Sclose(dspace_id);
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_3;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">i</span>=0; i&lt;rank; ++i){
<span style="color: #a020f0;">if</span> (ddims[i] != dims[i]) {
FREE(ddims);
H5Sclose(dspace_id);
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_4;
}
}
FREE(ddims);
H5Sclose(dspace_id);
H5Dclose(dset_id);
/* <span style="color: #b22222;">High-level H5LT API. No need to deal with dataspaces and datatypes </span>*/
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5LTread_dataset(f-&gt;$group$_group,
$GROUP_DSET$_NAME,
H5T_$GROUP_DSET_H5_DTYPE$,
$group_dset$);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_write_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, <span style="color: #a020f0;">const</span> $group_dset_dtype$* $group_dset$, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">rank</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint64_t</span>* <span style="color: #a0522d;">dims</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> ($group_dset$ == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
/*
<span style="color: #b22222;"> Try to delete an existing dataset by unlinking it from the group (UNSAFE mode).</span>
<span style="color: #b22222;"> NOTE: In principle, HDF5 should see the deallocated (unused) file space and free it,</span>
<span style="color: #b22222;"> thus reducing the size of the HDF5 file. In practic, this is not always the case.</span>
<span style="color: #b22222;"> Consider using HDF5-native h5repack utility after deleting/overwriting big datasets.</span>
<span style="color: #b22222;"> </span>*/
<span style="color: #a020f0;">if</span> (H5LTfind_dataset(f-&gt;$group$_group, $GROUP_DSET$_NAME) == 1 &amp;&amp; file-&gt;mode == <span style="color: #8b2252;">'u'</span>) {
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status_del</span> = H5Ldelete(f-&gt;$group$_group, $GROUP_DSET$_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (status_del &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dspace_id</span> = H5Screate_simple( (<span style="color: #228b22;">int</span>) rank, (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span>*) dims, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (dspace_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span> = H5Dcreate (f-&gt;$group$_group,
$GROUP_DSET$_NAME,
H5T_$GROUP_DSET_H5_DTYPE$,
dspace_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) {
H5Sclose(dspace_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5Dwrite(dset_id,
H5T_$GROUP_DSET_H5_DTYPE$,
H5S_ALL,
dspace_id,
H5P_DEFAULT,
$group_dset$);
H5Dclose(dset_id);
H5Sclose(dspace_id);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_has_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #a020f0;">if</span> (f-&gt;$group$_group == (<span style="color: #228b22;">hsize_t</span>) 0) <span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5LTfind_dataset(f-&gt;$group$_group, $GROUP_DSET$_NAME);
/* <span style="color: #b22222;">H5LTfind_dataset returns 1 if dataset exists, 0 otherwise </span>*/
<span style="color: #a020f0;">if</span> (status == 1){
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (status == 0) {
<span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org0a9c2ae" class="outline-2">
<h2 id="org0a9c2ae"><span class="section-number-2">6</span> Template for HDF5 has/read/write a dataset of sparse data</h2>
<div class="outline-text-2" id="text-6">
<p>
Sparse data is stored using extensible datasets of HDF5. Extensibility is required
due to the fact that the sparse data will be written in chunks of user-defined size.
</p>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_write_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">offset_file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">index_sparse</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">value_sparse</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">index_dtype</span>;
<span style="color: #228b22;">void</span>* <span style="color: #a0522d;">index_p</span> = <span style="color: #008b8b;">NULL</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">size_ranked</span> = (<span style="color: #228b22;">uint64_t</span>) size * $group_dset_rank$;
/* <span style="color: #b22222;">Determine the optimal type for storing indices depending on the size_max (usually mo_num or ao_num) </span>*/
<span style="color: #a020f0;">if</span> (size_max &lt; UINT8_MAX) {
<span style="color: #228b22;">uint8_t</span>* <span style="color: #a0522d;">index</span> = CALLOC(size_ranked, uint8_t);
<span style="color: #a020f0;">if</span> (index == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_ALLOCATION_FAILED;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">i</span>=0; i&lt;size_ranked; ++i){
index[i] = (<span style="color: #228b22;">uint8_t</span>) index_sparse[i];
}
index_p = index;
index_dtype = H5T_NATIVE_UINT8;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (size_max &lt; UINT16_MAX) {
<span style="color: #228b22;">uint16_t</span>* <span style="color: #a0522d;">index</span> = CALLOC(size_ranked, uint16_t);
<span style="color: #a020f0;">if</span> (index == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_ALLOCATION_FAILED;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">i</span>=0; i&lt;size_ranked; ++i){
index[i] = (<span style="color: #228b22;">uint16_t</span>) index_sparse[i];
}
index_p = index;
index_dtype = H5T_NATIVE_UINT16;
} <span style="color: #a020f0;">else</span> {
index_p = (<span style="color: #228b22;">int32_t</span>*) index_sparse;
index_dtype = H5T_NATIVE_INT32;
}
/* <span style="color: #b22222;">Store float values in double precision </span>*/
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">value_dtype</span> = H5T_NATIVE_DOUBLE;
/* <span style="color: #b22222;">Arrays of chunk dims that will be used for chunking the dataset </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">chunk_i_dims</span>[1] = {size_ranked};
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">chunk_v_dims</span>[1] = {size};
/* <span style="color: #b22222;">Indices and values are stored as 2 independent datasets in the HDF5 file </span>*/
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_index_name</span>[256];
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_value_name</span>[256];
/* <span style="color: #b22222;">Build the names of the datasets </span>*/
strncpy(dset_index_name, $GROUP_DSET$_NAME <span style="color: #8b2252;">"_indices"</span>, 256);
strncpy(dset_value_name, $GROUP_DSET$_NAME <span style="color: #8b2252;">"_values"</span>, 256);
<span style="color: #228b22;">trexio_exit_code</span> <span style="color: #a0522d;">rc_write</span> = TREXIO_FAILURE;
/* <span style="color: #b22222;">NOTE: chunk size is set upon creation of the HDF5 dataset and cannot be changed ! </span>*/
<span style="color: #a020f0;">if</span> ( H5LTfind_dataset(f-&gt;$group$_group, dset_index_name) != 1 ) {
/* <span style="color: #b22222;">If the file does not exist -&gt; create it and write </span>*/
/* <span style="color: #b22222;">Create chunked dataset with index_dtype datatype and write indices into it </span>*/
rc_write = trexio_hdf5_create_write_dset_sparse(f-&gt;$group$_group, dset_index_name, index_dtype, chunk_i_dims, index_p);
<span style="color: #a020f0;">if</span> (index_p != index_sparse) FREE(index_p);
<span style="color: #a020f0;">if</span> (rc_write != TREXIO_SUCCESS) <span style="color: #a020f0;">return</span> rc_write;
/* <span style="color: #b22222;">Create chunked dataset with value_dtype datatype and write values into it </span>*/
rc_write = trexio_hdf5_create_write_dset_sparse(f-&gt;$group$_group, dset_value_name, value_dtype, chunk_v_dims, value_sparse);
<span style="color: #a020f0;">if</span> (rc_write != TREXIO_SUCCESS) <span style="color: #a020f0;">return</span> rc_write;
} <span style="color: #a020f0;">else</span> {
/* <span style="color: #b22222;">If the file exists -&gt; open it and write </span>*/
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">offset_i</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) offset_file * $group_dset_rank$};
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">offset_v</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) offset_file};
/* <span style="color: #b22222;">Create chunked dataset with index_dtype datatype and write indices into it </span>*/
rc_write = trexio_hdf5_open_write_dset_sparse(f-&gt;$group$_group, dset_index_name, index_dtype, chunk_i_dims, offset_i, index_p);
<span style="color: #a020f0;">if</span> (index_p != index_sparse) FREE(index_p);
<span style="color: #a020f0;">if</span> (rc_write != TREXIO_SUCCESS) <span style="color: #a020f0;">return</span> rc_write;
/* <span style="color: #b22222;">Create chunked dataset with value_dtype datatype and write values into it </span>*/
rc_write = trexio_hdf5_open_write_dset_sparse(f-&gt;$group$_group, dset_value_name, value_dtype, chunk_v_dims, offset_v, value_sparse);
<span style="color: #a020f0;">if</span> (rc_write != TREXIO_SUCCESS) <span style="color: #a020f0;">return</span> rc_write;
}
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_read_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">offset_file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>,
<span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">eof_read_size</span>,
<span style="color: #228b22;">int32_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">index_read</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">value_read</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (eof_read_size == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_5;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
/* <span style="color: #b22222;">Indices and values are stored as 2 independent datasets in the HDF5 file </span>*/
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_index_name</span>[256];
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_value_name</span>[256];
/* <span style="color: #b22222;">Build the names of the datasets </span>*/
strncpy(dset_index_name, $GROUP_DSET$_NAME <span style="color: #8b2252;">"_indices"</span>, 256);
strncpy(dset_value_name, $GROUP_DSET$_NAME <span style="color: #8b2252;">"_values"</span>, 256);
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">offset_i</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) offset_file * $group_dset_rank$};
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">count_i</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) size * $group_dset_rank$};
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">offset_v</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) offset_file};
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">count_v</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) size};
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">is_index</span> = 1, <span style="color: #a0522d;">is_value</span> = 0;
<span style="color: #228b22;">trexio_exit_code</span> <span style="color: #a0522d;">rc_read</span>;
// <span style="color: #b22222;">attempt to read indices</span>
rc_read = trexio_hdf5_open_read_dset_sparse(f-&gt;$group$_group, dset_index_name, $group_dset_rank$, offset_i, count_i, <span style="color: #008b8b;">NULL</span>, is_index, index_read);
<span style="color: #a020f0;">if</span> (rc_read != TREXIO_SUCCESS &amp;&amp; rc_read != TREXIO_END) <span style="color: #a020f0;">return</span> rc_read;
// <span style="color: #b22222;">attempt to read values</span>
// <span style="color: #b22222;">when EOF is encountered - the count_v[0] is modified and contains the number of elements being read</span>
rc_read = trexio_hdf5_open_read_dset_sparse(f-&gt;$group$_group, dset_value_name, 1, offset_v, count_v, eof_read_size, is_value, value_read);
<span style="color: #a020f0;">if</span> (rc_read != TREXIO_SUCCESS &amp;&amp; rc_read != TREXIO_END) <span style="color: #a020f0;">return</span> rc_read;
<span style="color: #a020f0;">return</span> rc_read;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_read_$group_dset$_size</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, <span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">size_max</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (size_max == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span> = H5Dopen(f-&gt;$group$_group, $GROUP_DSET$_NAME <span style="color: #8b2252;">"_values"</span>, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">fspace_id</span> = H5Dget_space(dset_id);
<span style="color: #a020f0;">if</span> (fspace_id &lt; 0) {
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
// <span style="color: #b22222;">allocate space for the dimensions to be read</span>
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">ddims</span>[1] = {0};
// <span style="color: #b22222;">get the rank and dimensions of the dataset</span>
H5Sget_simple_extent_dims(fspace_id, ddims, <span style="color: #008b8b;">NULL</span>);
H5Dclose(dset_id);
H5Sclose(fspace_id);
*size_max = (<span style="color: #228b22;">int64_t</span>) ddims[0];
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_has_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #a020f0;">if</span> (f-&gt;$group$_group == (<span style="color: #228b22;">hsize_t</span>) 0) <span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5LTfind_dataset(f-&gt;$group$_group, $GROUP_DSET$_NAME <span style="color: #8b2252;">"_values"</span>);
/* <span style="color: #b22222;">H5LTfind_dataset returns 1 if dataset exists, 0 otherwise </span>*/
<span style="color: #a020f0;">if</span> (status == 1){
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (status == 0) {
<span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
}
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb31c882" class="outline-2">
<h2 id="orgb31c882"><span class="section-number-2">7</span> Template for HDF5 has/read/write a dataset of strings</h2>
<div class="outline-text-2" id="text-7">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_read_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, <span style="color: #228b22;">char</span>* <span style="color: #a020f0;">const</span> $group_dset$, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">rank</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint64_t</span>* <span style="color: #a0522d;">dims</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">max_str_len</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> ($group_dset$ == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span>;
// <span style="color: #b22222;">open the dataset to get its dimensions</span>
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span> = H5Dopen(f-&gt;$group$_group, $GROUP_DSET$_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
// <span style="color: #b22222;">allocate space for the dimensions to be read</span>
<span style="color: #228b22;">hsize_t</span>* <span style="color: #a0522d;">ddims</span> = CALLOC( (<span style="color: #228b22;">int</span>) rank, hsize_t);
<span style="color: #a020f0;">if</span> (ddims == <span style="color: #008b8b;">NULL</span>) {
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_ALLOCATION_FAILED;
}
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dspace</span> = H5Dget_space(dset_id);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) {
FREE(ddims);
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
// <span style="color: #b22222;">get the rank of the dataset in a file</span>
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">rrank</span> = H5Sget_simple_extent_dims(dspace, ddims, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (rrank != (<span style="color: #228b22;">int</span>) rank) {
FREE(ddims);
H5Dclose(dset_id);
H5Sclose(dspace);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_3;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span>=0; i&lt;rrank; i++) {
<span style="color: #a020f0;">if</span> (ddims[i] != dims[i]) {
H5Dclose(dset_id);
H5Sclose(dspace);
FREE(ddims);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_4;
}
}
FREE(ddims);
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">memtype</span> = H5Tcopy (H5T_C_S1);
status = H5Tset_size(memtype, H5T_VARIABLE);
<span style="color: #a020f0;">if</span> (status &lt; 0 || memtype &lt;= 0) {
H5Dclose(dset_id);
H5Sclose(dspace);
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
<span style="color: #228b22;">char</span>** <span style="color: #a0522d;">rdata</span> = CALLOC(dims[0], <span style="color: #228b22;">char</span>*);
<span style="color: #a020f0;">if</span> (rdata == <span style="color: #008b8b;">NULL</span>) {
H5Dclose(dset_id);
H5Sclose(dspace);
H5Tclose(memtype);
<span style="color: #a020f0;">return</span> TREXIO_ALLOCATION_FAILED;
}
status = H5Dread(dset_id, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata);
<span style="color: #a020f0;">if</span> (status &lt; 0) {
FREE(rdata);
H5Dclose(dset_id);
H5Sclose(dspace);
H5Tclose(memtype);
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
// <span style="color: #b22222;">copy contents of temporary rdata buffer into the group_dset otherwise they are lost</span>
// <span style="color: #b22222;">after calling H5Treclaim or H5Dvlen_reclaim functions</span>
strcpy($group_dset$, <span style="color: #8b2252;">""</span>);
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">i</span>=0; i&lt;dims[0]; i++) {
strncat($group_dset$, rdata[i], max_str_len);
strcat($group_dset$, TREXIO_DELIM);
}
// <span style="color: #b22222;">H5Dvlen_reclaim is deprecated and replaced by H5Treclaim in HDF5 v.1.12.0</span>
<span style="color: #483d8b;"> #if</span> (H5_VERS_MAJOR &lt;= 1 &amp;&amp; H5_VERS_MINOR &lt; 12)
status = H5Dvlen_reclaim(memtype, dspace, H5P_DEFAULT, rdata);
<span style="color: #483d8b;"> #else</span>
status = H5Treclaim(memtype, dspace, H5P_DEFAULT, rdata);
<span style="color: #483d8b;"> #endif</span>
<span style="color: #a020f0;">if</span> (status &lt; 0) {
FREE(rdata);
H5Dclose(dset_id);
H5Sclose(dspace);
H5Tclose(memtype);
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
FREE(rdata);
H5Dclose(dset_id);
H5Sclose(dspace);
H5Tclose(memtype);
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_write_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span>** $group_dset$, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">rank</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint64_t</span>* <span style="color: #a0522d;">dims</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> ($group_dset$ == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
/*
<span style="color: #b22222;"> Try to delete an existing dataset by unlinking it from the group (UNSAFE mode).</span>
<span style="color: #b22222;"> NOTE: In principle, HDF5 should see the deallocated (unused) file space and free it,</span>
<span style="color: #b22222;"> thus reducing the size of the HDF5 file. In practic, this is not always the case.</span>
<span style="color: #b22222;"> Consider using HDF5-provided h5repack utility after deleting/overwriting big datasets.</span>
<span style="color: #b22222;"> </span>*/
<span style="color: #a020f0;">if</span> (H5LTfind_dataset(f-&gt;$group$_group, $GROUP_DSET$_NAME) == 1 &amp;&amp; file-&gt;mode == <span style="color: #8b2252;">'u'</span>) {
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status_del</span> = H5Ldelete(f-&gt;$group$_group, $GROUP_DSET$_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (status_del &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span>;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span>;
/* <span style="color: #b22222;">we are going to write variable-length strings </span>*/
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">memtype</span> = H5Tcopy (H5T_C_S1);
<span style="color: #a020f0;">if</span> (memtype &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
status = H5Tset_size (memtype, H5T_VARIABLE);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dspace</span> = H5Screate_simple( (<span style="color: #228b22;">int</span>) rank, (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span>*) dims, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (dspace &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
/* <span style="color: #b22222;">code to create dataset </span>*/
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">filetype</span> = H5Tcopy (H5T_FORTRAN_S1);
<span style="color: #a020f0;">if</span> (filetype &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
status = H5Tset_size (filetype, H5T_VARIABLE);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
dset_id = H5Dcreate (f-&gt;$group$_group, $GROUP_DSET$_NAME, filetype, dspace,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
status = H5Dwrite (dset_id, memtype,
H5S_ALL, H5S_ALL, H5P_DEFAULT,
$group_dset$);
H5Dclose (dset_id);
H5Sclose (dspace);
H5Tclose (filetype);
H5Tclose (memtype);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_has_$group_dset$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #a020f0;">if</span> (f-&gt;$group$_group == (<span style="color: #228b22;">hsize_t</span>) 0) <span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5LTfind_dataset(f-&gt;$group$_group, $GROUP_DSET$_NAME);
/* <span style="color: #b22222;">H5LTfind_dataset returns 1 if dataset exists, 0 otherwise </span>*/
<span style="color: #a020f0;">if</span> (status == 1){
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (status == 0) {
<span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org7fea7f6" class="outline-2">
<h2 id="org7fea7f6"><span class="section-number-2">8</span> Template for HDF5 has/read/write a string attribute</h2>
<div class="outline-text-2" id="text-8">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_read_$group_str$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, <span style="color: #228b22;">char</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">str</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">max_str_len</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (str == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
/* <span style="color: #b22222;">Quit if the string attribute is missing in the file </span>*/
<span style="color: #a020f0;">if</span> (H5Aexists(f-&gt;$group$_group, $GROUP_STR$_NAME) == 0) <span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
/* <span style="color: #b22222;">Read the $group_str$ attribute of $group$ group </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">str_id</span> = H5Aopen(f-&gt;$group$_group, $GROUP_STR$_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (str_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">ftype_id</span> = H5Aget_type(str_id);
<span style="color: #a020f0;">if</span> (ftype_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">sdim</span> = H5Tget_size(ftype_id);
sdim++; /* <span style="color: #b22222;">Make room for null terminator </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">mem_id</span> = H5Tcopy(H5T_C_S1);
<span style="color: #a020f0;">if</span> (mem_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span>;
status = (max_str_len+1) &gt; sdim ? H5Tset_size(mem_id, sdim) : H5Tset_size(mem_id, max_str_len+1) ;
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
status = H5Aread(str_id, mem_id, str);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
H5Aclose(str_id);
H5Tclose(mem_id);
H5Tclose(ftype_id);
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_write_$group_str$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span>* <span style="color: #a0522d;">str</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (str == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
/* <span style="color: #b22222;">Delete the attribute if it exists and if the file is open in UNSAFE mode </span>*/
<span style="color: #a020f0;">if</span> (trexio_hdf5_has_$group_str$(file) == TREXIO_SUCCESS &amp;&amp; file-&gt;mode == <span style="color: #8b2252;">'u'</span>) {
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status_del</span> = H5Adelete(f-&gt;$group$_group, $GROUP_STR$_NAME);
<span style="color: #a020f0;">if</span> (status_del &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
/* <span style="color: #b22222;">Setup the datatype for variable length string </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dtype_id</span> = H5Tcopy(H5T_C_S1);
<span style="color: #a020f0;">if</span> (dtype_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #228b22;">size_t</span> <span style="color: #a0522d;">str_attr_len</span> = strlen(str) + 1;
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span>;
status = H5Tset_size(dtype_id, str_attr_len);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
status = H5Tset_strpad(dtype_id, H5T_STR_NULLTERM);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
/* <span style="color: #b22222;">Setup the dataspace </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dspace_id</span> = H5Screate(H5S_SCALAR);
<span style="color: #a020f0;">if</span> (dspace_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
/* <span style="color: #b22222;">Create the $group_str$ attribute of $group$ group </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">str_id</span> = H5Acreate(f-&gt;$group$_group,
$GROUP_STR$_NAME,
dtype_id, dspace_id,
H5P_DEFAULT, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (str_id &lt;= 0) {
H5Sclose(dspace_id);
H5Tclose(dtype_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
status = H5Awrite(str_id, dtype_id, str);
H5Aclose(str_id);
H5Sclose(dspace_id);
H5Tclose(dtype_id);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_has_$group_str$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #a020f0;">if</span> (f-&gt;$group$_group == (<span style="color: #228b22;">hsize_t</span>) 0) <span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
<span style="color: #228b22;">htri_t</span> <span style="color: #a0522d;">status</span> = H5Aexists(f-&gt;$group$_group, $GROUP_STR$_NAME);
/* <span style="color: #b22222;">H5Aexists returns positive value if attribute exists, 0 if does not, negative if error </span>*/
<span style="color: #a020f0;">if</span> (status &gt; 0){
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (status == 0) {
<span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org20dc905" class="outline-2">
<h2 id="org20dc905"><span class="section-number-2">9</span> Template for HDF5 delete a group (UNSAFE mode)</h2>
<div class="outline-text-2" id="text-9">
<p>
<b><b>Note:</b></b> in early versions of the HDF5 library (v &lt; 1.10) unlinking an object was not working as expected
and the associated memory was not necessarily freed (see <a href="https://stackoverflow.com/questions/1124994/removing-data-from-a-hdf5-file">this StackOverflow discussion</a> for example).
Nevertheless, some space might remain occupied even after deleting the associated object in recent version.
To take the best use of the deleted file space, we recommend to write the deleted group within the same session
(i.e. before closing the TREXIO file).
</p>
<p>
In principle, one can use HDF5-provided <code>h5repack</code> binary, which copies all existing objects from one file into another.
Thus, any corrupted/lost file space will remain in the first file. The use of <code>h5repack</code> is highly encouraged.
</p>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_delete_$group$</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
// <span style="color: #b22222;">delete the link to the existing group: this should free the associated space</span>
H5Gclose(f-&gt;$group$_group);
f-&gt;$group$_group = 0;
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5Ldelete(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
// <span style="color: #b22222;">re-create the group (with the new link ?)</span>
f-&gt;$group$_group = H5Gcreate(f-&gt;file_id, $GROUP$_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (f-&gt;$group$_group &lt;= 0L) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-orged8ae62" class="outline-2">
<h2 id="orged8ae62"><span class="section-number-2">10</span> Source code for the determinant part</h2>
<div class="outline-text-2" id="text-10">
<p>
Each array is stored in a separate HDF5 dataset due to the fact that determinant I/O has to be decoupled.
Chunks are used to read/write the data to prevent memory overflow. Chunks have a given <code>int64_t dims[0]*dims[1]</code>.
Size specifies the number of data items (e.g. determinants) to process.
</p>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span> <span style="color: #0000ff;">trexio_hdf5_read_determinant_list</span>(<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">offset_file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">rank</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint64_t</span>* <span style="color: #a0522d;">dims</span>,
<span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">eof_read_size</span>,
<span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">list</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (eof_read_size == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_5;
<span style="color: #a020f0;">if</span> (list == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_6;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_det_name</span>[256] = <span style="color: #8b2252;">"determinant_list"</span>;
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">offset</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) offset_file * dims[1]};
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">count</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) dims[0] * dims[1]};
/* <span style="color: #b22222;">Attempt to read determinants (if EOF -&gt; eof_read_size is modified with the number of elements read and return code is TREXIO_END)</span>
<span style="color: #b22222;"> 0 argument below is requires to skip internal treatment specific to sparse indices (i.e. their de-compression).</span>*/
<span style="color: #a020f0;">return</span> trexio_hdf5_open_read_dset_sparse(f-&gt;determinant_group, dset_det_name, (<span style="color: #228b22;">uint32_t</span>) dims[1], offset, count, eof_read_size, 0, list);
}
<span style="color: #228b22;">trexio_exit_code</span> <span style="color: #0000ff;">trexio_hdf5_read_determinant_coefficient</span>(<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">offset_file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">rank</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint64_t</span>* <span style="color: #a0522d;">dims</span>,
<span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">eof_read_size</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">coeff</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (eof_read_size == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_5;
<span style="color: #a020f0;">if</span> (coeff == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_6;
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_coeff_name</span>[128];
memset(dset_coeff_name, 0, <span style="color: #a020f0;">sizeof</span>(dset_coeff_name));
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span> <span style="color: #a0522d;">trexio_state</span> = file-&gt;state;
<span style="color: #a020f0;">if</span> (trexio_state != 0) {
sprintf(dset_coeff_name, <span style="color: #8b2252;">"determinant_coefficient_state_%"</span> PRId32, trexio_state);
} <span style="color: #a020f0;">else</span> {
strncpy(dset_coeff_name, <span style="color: #8b2252;">"determinant_coefficient"</span>, 24);
}
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">offset</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) offset_file};
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">count</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) dims[0]};
/* <span style="color: #b22222;">Attempt to read determinants (if EOF -&gt; eof_read_size is modified with the number of elements read and return code is TREXIO_END)</span>
<span style="color: #b22222;"> 0 argument below is requires to skip internal treatment specific to sparse indices (i.e. their de-compression).</span>*/
<span style="color: #a020f0;">return</span> trexio_hdf5_open_read_dset_sparse(f-&gt;determinant_group, dset_coeff_name, 1, offset, count, eof_read_size, 0, coeff);
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span> <span style="color: #0000ff;">trexio_hdf5_write_determinant_list</span>(<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">offset_file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">rank</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint64_t</span>* <span style="color: #a0522d;">dims</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">list</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (list == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_5;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">det_dtype</span> = H5T_NATIVE_INT64;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">size_ranked</span> = dims[1]*dims[0];
/* <span style="color: #b22222;">Arrays of chunk dims that will be used for chunking the dataset </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">chunk_dims</span>[1] = {size_ranked};
/* <span style="color: #b22222;">Indices and values are stored as 2 independent datasets in the HDF5 file </span>*/
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_det_name</span>[256] = <span style="color: #8b2252;">"determinant_list"</span>;
<span style="color: #228b22;">trexio_exit_code</span> <span style="color: #a0522d;">rc_write</span> = TREXIO_FAILURE;
/* <span style="color: #b22222;">NOTE: chunk size is set upon creation of the HDF5 dataset and cannot be changed ! </span>*/
<span style="color: #a020f0;">if</span> ( H5LTfind_dataset(f-&gt;determinant_group, dset_det_name) != 1 ) {
/* <span style="color: #b22222;">If the file does not exist -&gt; create it and write </span>*/
/* <span style="color: #b22222;">Create chunked dataset with det_dtype datatype and write indices into it </span>*/
rc_write = trexio_hdf5_create_write_dset_sparse(f-&gt;determinant_group, dset_det_name, det_dtype, chunk_dims, list);
<span style="color: #a020f0;">if</span> (rc_write != TREXIO_SUCCESS) <span style="color: #a020f0;">return</span> rc_write;
} <span style="color: #a020f0;">else</span> {
/* <span style="color: #b22222;">If the file exists -&gt; open it and write </span>*/
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">offset_data</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) offset_file * dims[1]};
/* <span style="color: #b22222;">Create chunked dataset with det_dtype datatype and write indices into it </span>*/
rc_write = trexio_hdf5_open_write_dset_sparse(f-&gt;determinant_group, dset_det_name, det_dtype, chunk_dims, offset_data, list);
<span style="color: #a020f0;">if</span> (rc_write != TREXIO_SUCCESS) <span style="color: #a020f0;">return</span> rc_write;
}
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
<span style="color: #228b22;">trexio_exit_code</span> <span style="color: #0000ff;">trexio_hdf5_write_determinant_coefficient</span>(<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">offset_file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">rank</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint64_t</span>* <span style="color: #a0522d;">dims</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coeff</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (coeff == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_5;
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_coeff_name</span>[128];
memset(dset_coeff_name, 0, <span style="color: #a020f0;">sizeof</span>(dset_coeff_name));
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span> <span style="color: #a0522d;">trexio_state</span> = file-&gt;state;
<span style="color: #a020f0;">if</span> (trexio_state != 0) {
sprintf(dset_coeff_name, <span style="color: #8b2252;">"determinant_coefficient_state_%"</span> PRId32, trexio_state);
} <span style="color: #a020f0;">else</span> {
strncpy(dset_coeff_name, <span style="color: #8b2252;">"determinant_coefficient"</span>, 24);
}
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">det_dtype</span> = H5T_NATIVE_DOUBLE;
/* <span style="color: #b22222;">Arrays of chunk dims that will be used for chunking the dataset </span>*/
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">chunk_dims</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) dims[0]};
<span style="color: #228b22;">trexio_exit_code</span> <span style="color: #a0522d;">rc_write</span> = TREXIO_FAILURE;
/* <span style="color: #b22222;">NOTE: chunk size is set upon creation of the HDF5 dataset and cannot be changed ! </span>*/
<span style="color: #a020f0;">if</span> ( H5LTfind_dataset(f-&gt;determinant_group, dset_coeff_name) != 1 ) {
/* <span style="color: #b22222;">If the file does not exist -&gt; create it and write </span>*/
/* <span style="color: #b22222;">Create chunked dataset with det_dtype datatype and write indices into it </span>*/
rc_write = trexio_hdf5_create_write_dset_sparse(f-&gt;determinant_group, dset_coeff_name, det_dtype, chunk_dims, coeff);
<span style="color: #a020f0;">if</span> (rc_write != TREXIO_SUCCESS) <span style="color: #a020f0;">return</span> rc_write;
} <span style="color: #a020f0;">else</span> {
/* <span style="color: #b22222;">If the file exists -&gt; open it and write </span>*/
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">offset_data</span>[1] = {(<span style="color: #228b22;">hsize_t</span>) offset_file};
/* <span style="color: #b22222;">Create chunked dataset with det_dtype datatype and write indices into it </span>*/
rc_write = trexio_hdf5_open_write_dset_sparse(f-&gt;determinant_group, dset_coeff_name, det_dtype, chunk_dims, offset_data, coeff);
<span style="color: #a020f0;">if</span> (rc_write != TREXIO_SUCCESS) <span style="color: #a020f0;">return</span> rc_write;
}
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
<span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_read_determinant_coefficient_size</span> (<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>, <span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">size_max</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #a020f0;">if</span> (size_max == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_2;
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_coeff_name</span>[128];
memset(dset_coeff_name, 0, <span style="color: #a020f0;">sizeof</span>(dset_coeff_name));
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span> <span style="color: #a0522d;">trexio_state</span> = file-&gt;state;
<span style="color: #a020f0;">if</span> (trexio_state != 0) {
sprintf(dset_coeff_name, <span style="color: #8b2252;">"determinant_coefficient_state_%"</span> PRId32, trexio_state);
} <span style="color: #a020f0;">else</span> {
strncpy(dset_coeff_name, <span style="color: #8b2252;">"determinant_coefficient"</span>, 24);
}
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span> = H5Dopen(f-&gt;determinant_group, dset_coeff_name, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">fspace_id</span> = H5Dget_space(dset_id);
<span style="color: #a020f0;">if</span> (fspace_id &lt; 0) {
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
// <span style="color: #b22222;">allocate space for the dimensions to be read</span>
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">ddims</span>[1] = {0};
// <span style="color: #b22222;">get the rank and dimensions of the dataset</span>
H5Sget_simple_extent_dims(fspace_id, ddims, <span style="color: #008b8b;">NULL</span>);
H5Dclose(dset_id);
H5Sclose(fspace_id);
*size_max = (<span style="color: #228b22;">int64_t</span>) ddims[0];
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span> <span style="color: #0000ff;">trexio_hdf5_has_determinant_list</span>(<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #a020f0;">if</span> (f-&gt;determinant_group == (<span style="color: #228b22;">hsize_t</span>) 0) <span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5LTfind_dataset(f-&gt;determinant_group, <span style="color: #8b2252;">"determinant_list"</span>);
/* <span style="color: #b22222;">H5LTfind_dataset returns 1 if dataset exists, 0 otherwise </span>*/
<span style="color: #a020f0;">if</span> (status == 1){
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (status == 0) {
<span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
}
<span style="color: #228b22;">trexio_exit_code</span> <span style="color: #0000ff;">trexio_hdf5_has_determinant_coefficient</span>(<span style="color: #228b22;">trexio_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">file</span>)
{
<span style="color: #a020f0;">if</span> (file == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_1;
<span style="color: #228b22;">trexio_hdf5_t</span>* <span style="color: #a0522d;">f</span> = (<span style="color: #228b22;">trexio_hdf5_t</span>*) file;
<span style="color: #a020f0;">if</span> (f-&gt;determinant_group == (<span style="color: #228b22;">hsize_t</span>) 0) <span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
<span style="color: #228b22;">char</span> <span style="color: #a0522d;">dset_coeff_name</span>[128];
memset(dset_coeff_name, 0, <span style="color: #a020f0;">sizeof</span>(dset_coeff_name));
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span> <span style="color: #a0522d;">trexio_state</span> = file-&gt;state;
<span style="color: #a020f0;">if</span> (trexio_state != 0) {
sprintf(dset_coeff_name, <span style="color: #8b2252;">"determinant_coefficient_state_%"</span> PRId32, trexio_state);
} <span style="color: #a020f0;">else</span> {
strncpy(dset_coeff_name, <span style="color: #8b2252;">"determinant_coefficient"</span>, 24);
}
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5LTfind_dataset(f-&gt;determinant_group, dset_coeff_name);
/* <span style="color: #b22222;">H5LTfind_dataset returns 1 if dataset exists, 0 otherwise </span>*/
<span style="color: #a020f0;">if</span> (status == 1){
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (status == 0) {
<span style="color: #a020f0;">return</span> TREXIO_HAS_NOT;
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
}
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc376ec9" class="outline-2">
<h2 id="orgc376ec9"><span class="section-number-2">11</span> Helper functions</h2>
<div class="outline-text-2" id="text-11">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_create_write_dset_sparse</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">group_id</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span>* <span style="color: #a0522d;">dset_name</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dtype_id</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span>* <span style="color: #a0522d;">chunk_dims</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">void</span>* <span style="color: #a0522d;">data_sparse</span>)
{
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int</span> <span style="color: #a0522d;">h5_rank</span> = 1;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">maxdims</span>[1] = {H5S_UNLIMITED};
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dspace</span> = H5Screate_simple(h5_rank, chunk_dims, maxdims);
<span style="color: #a020f0;">if</span> (dspace &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">prop</span> = H5Pcreate(H5P_DATASET_CREATE);
<span style="color: #a020f0;">if</span> (prop &lt; 0) {
H5Sclose(dspace);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5Pset_chunk(prop, h5_rank, chunk_dims);
<span style="color: #a020f0;">if</span> (status &lt; 0) {
H5Sclose(dspace);
H5Pclose(prop);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span> = H5Dcreate(group_id,
dset_name,
dtype_id,
dspace,
H5P_DEFAULT,
prop,
H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt; 0) {
H5Sclose(dspace);
H5Pclose(prop);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
status = H5Dwrite(dset_id,
dtype_id,
H5S_ALL, H5S_ALL, H5P_DEFAULT,
data_sparse);
H5Sclose(dspace);
H5Pclose(prop);
H5Dclose(dset_id);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
<span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_open_write_dset_sparse</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">group_id</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span>* <span style="color: #a0522d;">dset_name</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dtype_id</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span>* <span style="color: #a0522d;">chunk_dims</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span>* <span style="color: #a0522d;">offset_file</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">void</span>* <span style="color: #a0522d;">data_sparse</span>)
{
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int</span> <span style="color: #a0522d;">h5_rank</span> = 1;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span> = H5Dopen(group_id, dset_name, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">fspace</span> = H5Dget_space(dset_id);
<span style="color: #a020f0;">if</span> (fspace &lt; 0) {
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
// <span style="color: #b22222;">allocate space for the dimensions to be read</span>
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">ddims</span>[1] = {0};
// <span style="color: #b22222;">get the rank and dimensions of the dataset</span>
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">rrank</span> = H5Sget_simple_extent_dims(fspace, ddims, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (rrank != h5_rank) {
H5Sclose(fspace);
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
ddims[0] += chunk_dims[0];
// <span style="color: #b22222;">extend the dset size</span>
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5Dset_extent(dset_id, ddims);
<span style="color: #a020f0;">if</span> (status &lt; 0) {
H5Sclose(fspace);
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
// <span style="color: #b22222;">close and reopen the file dataspace to take into account the extension</span>
H5Sclose(fspace);
fspace = H5Dget_space(dset_id);
<span style="color: #a020f0;">if</span> (fspace &lt; 0) {
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
// <span style="color: #b22222;">select hyperslab to be written using chunk_dims and offset values</span>
status = H5Sselect_hyperslab(fspace, H5S_SELECT_SET, offset_file, <span style="color: #008b8b;">NULL</span>, chunk_dims, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (status &lt; 0) {
H5Sclose(fspace);
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
// <span style="color: #b22222;">create memory dataspace to write from</span>
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dspace</span> = H5Screate_simple(h5_rank, chunk_dims, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (dspace &lt; 0) {
H5Sclose(fspace);
H5Sclose(dspace);
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
status = H5Dwrite(dset_id,
dtype_id,
dspace, fspace, H5P_DEFAULT,
data_sparse);
H5Dclose(dset_id);
H5Sclose(dspace);
H5Sclose(fspace);
<span style="color: #a020f0;">if</span> (status &lt; 0) <span style="color: #a020f0;">return</span> TREXIO_FAILURE;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
<span style="color: #228b22;">trexio_exit_code</span>
<span style="color: #0000ff;">trexio_hdf5_open_read_dset_sparse</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">group_id</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span>* <span style="color: #a0522d;">dset_name</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">uint32_t</span> <span style="color: #a0522d;">dset_rank</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">hsize_t</span>* <span style="color: #a0522d;">offset_file</span>,
<span style="color: #228b22;">hsize_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">size_read</span>,
<span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">eof_read_size</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int</span> <span style="color: #a0522d;">is_index</span>,
<span style="color: #228b22;">void</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">data_sparse</span>
)
{
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int</span> <span style="color: #a0522d;">h5_rank</span> = 1;
<span style="color: #a020f0;">if</span> (dset_rank == 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ARG_3;
// <span style="color: #b22222;">get the dataset handle</span>
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dset_id</span> = H5Dopen(group_id, dset_name, H5P_DEFAULT);
<span style="color: #a020f0;">if</span> (dset_id &lt;= 0) <span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
// <span style="color: #b22222;">get the dataspace of the dataset</span>
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">fspace_id</span> = H5Dget_space(dset_id);
<span style="color: #a020f0;">if</span> (fspace_id &lt; 0) {
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
/* <span style="color: #b22222;">get dims of the dset stored in the file to check whether reading with user-provided chunk size</span>
<span style="color: #b22222;"> will reach end of the dataset (i.e. EOF in TEXT back end)</span>
<span style="color: #b22222;"> </span>*/
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">ddims</span>[1] = {0};
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">rrank</span> = H5Sget_simple_extent_dims(fspace_id, ddims, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (rrank != h5_rank) {
H5Sclose(fspace_id);
H5Dclose(dset_id);
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
<span style="color: #228b22;">hsize_t</span> <span style="color: #a0522d;">max_offset</span> = offset_file[0] + size_read[0];
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">is_EOF</span> = 0;
// <span style="color: #b22222;">if max_offset exceed current dim of the dset =&gt; EOF</span>
<span style="color: #a020f0;">if</span> (max_offset &gt; ddims[0]) {
is_EOF = 1;
// <span style="color: #b22222;">lower the value of count to reduce the number of elements which will be read</span>
size_read[0] -= (max_offset - ddims[0]);
// <span style="color: #b22222;">modified the value of eof_read_size passed by address</span>
<span style="color: #a020f0;">if</span> (eof_read_size != <span style="color: #008b8b;">NULL</span>) *eof_read_size = size_read[0]/dset_rank;
}
// <span style="color: #b22222;">special case when reading int indices</span>
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">size_ranked</span> = (<span style="color: #228b22;">uint64_t</span>) size_read[0];
<span style="color: #228b22;">void</span>* <span style="color: #a0522d;">index_p</span> = <span style="color: #008b8b;">NULL</span>;
// <span style="color: #b22222;">read the datatype from the dataset and compare with the pre-defined values</span>
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">dtype</span> = H5Dget_type(dset_id);
<span style="color: #a020f0;">if</span> (is_index == 1) {
<span style="color: #a020f0;">if</span> (H5Tequal(dtype, H5T_NATIVE_UINT8) &gt; 0) {
<span style="color: #228b22;">uint8_t</span>* <span style="color: #a0522d;">index</span> = CALLOC(size_ranked, uint8_t);
<span style="color: #a020f0;">if</span> (index == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_ALLOCATION_FAILED;
index_p = index;
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (H5Tequal(dtype, H5T_NATIVE_UINT16) &gt; 0) {
<span style="color: #228b22;">uint16_t</span>* <span style="color: #a0522d;">index</span> = CALLOC(size_ranked, uint16_t);
<span style="color: #a020f0;">if</span> (index == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> TREXIO_ALLOCATION_FAILED;
index_p = index;
} <span style="color: #a020f0;">else</span> {
index_p = data_sparse;
}
}
<span style="color: #228b22;">herr_t</span> <span style="color: #a0522d;">status</span> = H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, offset_file, <span style="color: #008b8b;">NULL</span>, size_read, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (status &lt; 0) {
H5Sclose(fspace_id);
H5Dclose(dset_id);
<span style="color: #a020f0;">if</span> (index_p != data_sparse) FREE(index_p);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
<span style="color: #228b22;">hid_t</span> <span style="color: #a0522d;">memspace_id</span> = H5Screate_simple(h5_rank, size_read, <span style="color: #008b8b;">NULL</span>);
<span style="color: #a020f0;">if</span> (memspace_id &lt; 0) {
H5Sclose(fspace_id);
H5Dclose(dset_id);
<span style="color: #a020f0;">if</span> (index_p != data_sparse) FREE(index_p);
<span style="color: #a020f0;">return</span> TREXIO_INVALID_ID;
}
<span style="color: #a020f0;">if</span> (is_index == 1) {
status = H5Dread(dset_id,
dtype,
memspace_id, fspace_id, H5P_DEFAULT,
index_p);
} <span style="color: #a020f0;">else</span> {
status = H5Dread(dset_id,
dtype,
memspace_id, fspace_id, H5P_DEFAULT,
data_sparse);
}
H5Sclose(fspace_id);
H5Sclose(memspace_id);
H5Dclose(dset_id);
<span style="color: #a020f0;">if</span> (status &lt; 0) {
<span style="color: #a020f0;">if</span> (index_p != data_sparse) FREE(index_p);
<span style="color: #a020f0;">return</span> TREXIO_FAILURE;
}
<span style="color: #a020f0;">if</span> (is_index == 1) {
<span style="color: #a020f0;">if</span> (H5Tequal(dtype, H5T_NATIVE_UINT8) &gt; 0) {
<span style="color: #228b22;">uint8_t</span>* <span style="color: #a0522d;">index</span> = (<span style="color: #228b22;">uint8_t</span>*) index_p;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">i</span>=0; i&lt;size_ranked; ++i){
((<span style="color: #228b22;">int32_t</span>*)data_sparse)[i] = (<span style="color: #228b22;">int32_t</span>) index[i];
}
FREE(index_p);
} <span style="color: #a020f0;">else</span> <span style="color: #a020f0;">if</span> (H5Tequal(dtype, H5T_NATIVE_UINT16) &gt; 0) {
<span style="color: #228b22;">uint16_t</span>* <span style="color: #a0522d;">index</span> = (<span style="color: #228b22;">uint16_t</span>*) index_p;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">i</span>=0; i&lt;size_ranked; ++i){
((<span style="color: #228b22;">int32_t</span>*)data_sparse)[i] = (<span style="color: #228b22;">int32_t</span>) index[i];
}
FREE(index_p);
}
}
<span style="color: #a020f0;">if</span> (is_EOF == 1) <span style="color: #a020f0;">return</span> TREXIO_END;
<span style="color: #a020f0;">return</span> TREXIO_SUCCESS;
}
</pre>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: TREX-CoE</p>
<p class="date">Created: 2022-06-03 Fri 08:39</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>