mirror of
https://github.com/TREX-CoE/trexio.git
synced 2025-01-10 21:18:35 +01:00
Add 32-bit funcs and document front end (#39)
* 32-bit functions * adapt tests since the default write/read_num is now 32-bit * minor cleaning in the generator * add test for _32 functionality * rm stdint-based types from test * documentation * rm trailing whitespaces in emacs * change TREXIO_INVALID_BACK_END * update gitignore
This commit is contained in:
parent
4e47e497d5
commit
c43259176d
3
src/.gitignore
vendored
3
src/.gitignore
vendored
@ -20,8 +20,9 @@ trexio_hdf5.c
|
|||||||
trexio_f.f90
|
trexio_f.f90
|
||||||
trexio.mod
|
trexio.mod
|
||||||
|
|
||||||
test
|
test_c
|
||||||
test_f
|
test_f
|
||||||
*.h5
|
*.h5
|
||||||
trexio_test/
|
trexio_test/
|
||||||
|
trexio_test_fort/
|
||||||
|
|
||||||
|
@ -9,17 +9,11 @@ fileDir = dirname(abspath(__file__))
|
|||||||
parentDir = dirname(fileDir)
|
parentDir = dirname(fileDir)
|
||||||
|
|
||||||
with open(join(parentDir,'trex.json'), 'r') as f:
|
with open(join(parentDir,'trex.json'), 'r') as f:
|
||||||
config0 = json.load(f)
|
config = json.load(f)
|
||||||
|
|
||||||
print('Metadata I/O currently not supported')
|
print('Metadata I/O currently not supported')
|
||||||
# TODO, for now remove metadata-related stuff
|
# TODO, for now remove metadata-related stuff
|
||||||
del config0['metadata']
|
del config['metadata']
|
||||||
|
|
||||||
config = {}
|
|
||||||
#for k,v in config0.items():
|
|
||||||
# if k == 'nucleus' or k == 'ecp':
|
|
||||||
# config[k] = v
|
|
||||||
config = config0
|
|
||||||
# for now remove rdm because it is hardcoded
|
# for now remove rdm because it is hardcoded
|
||||||
del config['rdm']
|
del config['rdm']
|
||||||
|
|
||||||
@ -288,16 +282,26 @@ for fname in files_funcs_dsets:
|
|||||||
|
|
||||||
if params['dtype'] == 'double':
|
if params['dtype'] == 'double':
|
||||||
h5_dtype = 'double'
|
h5_dtype = 'double'
|
||||||
f_dtype = 'real(8)'
|
f_dtype_double = 'real(8)'
|
||||||
|
f_dtype_single = 'real(4)'
|
||||||
|
c_dtype_double = 'double'
|
||||||
|
c_dtype_single = 'float'
|
||||||
|
|
||||||
elif params['dtype'] == 'int64_t':
|
elif params['dtype'] == 'int64_t':
|
||||||
h5_dtype = 'long'
|
h5_dtype = 'long'
|
||||||
f_dtype = 'integer(8)'
|
f_dtype_double = 'integer(8)'
|
||||||
|
f_dtype_single = 'integer(4)'
|
||||||
|
c_dtype_double = 'int64_t'
|
||||||
|
c_dtype_single = 'int32_t'
|
||||||
|
|
||||||
|
templine1 = templine2.replace('$group_dset_dtype_double$', c_dtype_double)
|
||||||
|
templine2 = templine1.replace('$group_dset_dtype_single$', c_dtype_single)
|
||||||
|
|
||||||
templine1 = templine2.replace('$group_dset_h5_dtype$', h5_dtype)
|
templine1 = templine2.replace('$group_dset_h5_dtype$', h5_dtype)
|
||||||
templine2 = templine1.replace('$group_dset_h5_dtype$'.upper(), h5_dtype.upper())
|
templine2 = templine1.replace('$group_dset_h5_dtype$'.upper(), h5_dtype.upper())
|
||||||
|
|
||||||
templine1 = templine2.replace('$group_dset_f_dtype$', f_dtype)
|
templine1 = templine2.replace('$group_dset_f_dtype_double$', f_dtype_double)
|
||||||
templine2 = templine1.replace('$group_dset_f_dtype$'.upper(), f_dtype.upper())
|
templine2 = templine1.replace('$group_dset_f_dtype_single$', f_dtype_single)
|
||||||
|
|
||||||
templine1 = templine2.replace('$group_dset_rank$', str(params['rank']))
|
templine1 = templine2.replace('$group_dset_rank$', str(params['rank']))
|
||||||
templine2 = templine1
|
templine2 = templine1
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
#+Title: Templator for frontend
|
#+Title: Templator for front end
|
||||||
|
|
||||||
* Constant file prefixes (not used by generator) :noexport:
|
* Constant file prefixes (not used by generator) :noexport:
|
||||||
|
|
||||||
|
Prefixes in C contain mainly `#include` as well as some
|
||||||
|
`#define` and `typedef` statements.
|
||||||
|
Prefixes in Fortran contain back-end definitions.
|
||||||
|
|
||||||
#+NAME:header
|
#+NAME:header
|
||||||
#+begin_src c
|
#+begin_src c
|
||||||
/* This file was generated from the templator_front.org org-mode file.
|
/* This file was generated from the templator_front.org org-mode file.
|
||||||
@ -22,7 +26,7 @@ module trexio
|
|||||||
integer, parameter :: TREXIO_HDF5 = 0
|
integer, parameter :: TREXIO_HDF5 = 0
|
||||||
integer, parameter :: TREXIO_TEXT = 1
|
integer, parameter :: TREXIO_TEXT = 1
|
||||||
! integer, parameter :: TREXIO_JSON = 2
|
! integer, parameter :: TREXIO_JSON = 2
|
||||||
integer, parameter :: TREXIO_INVALID_BACK_END = 3
|
integer, parameter :: TREXIO_INVALID_BACK_END = 2
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
@ -64,7 +68,6 @@ typedef int32_t trexio_exit_code;
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
* Coding conventions
|
* Coding conventions
|
||||||
|
|
||||||
- integer types will be defined using types given in ~stdint.h~
|
- integer types will be defined using types given in ~stdint.h~
|
||||||
@ -75,6 +78,7 @@ typedef int32_t trexio_exit_code;
|
|||||||
- ~#define~ constants are in upper case
|
- ~#define~ constants are in upper case
|
||||||
- structs are suffixed by ~_s~
|
- structs are suffixed by ~_s~
|
||||||
- types are suffixed by ~_t~
|
- types are suffixed by ~_t~
|
||||||
|
- API calls return ~trexio_exit_code~ (except for ~trexio_open~ function)
|
||||||
|
|
||||||
** Memory allocation
|
** Memory allocation
|
||||||
|
|
||||||
@ -94,10 +98,10 @@ typedef int32_t trexio_exit_code;
|
|||||||
#define FREE(X) { free(X) ; (X)=NULL; }
|
#define FREE(X) { free(X) ; (X)=NULL; }
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
* Front end
|
* Front end
|
||||||
|
|
||||||
All calls to TREXIO are thread-safe.
|
All calls to TREXIO are thread-safe.
|
||||||
|
TREXIO front end is modular, which simplifies impelementation of new back ends.
|
||||||
|
|
||||||
** Error handling
|
** Error handling
|
||||||
|
|
||||||
@ -292,18 +296,36 @@ void trexio_string_of_error_f(const trexio_exit_code error, char result[<<MAX_ST
|
|||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
** Back ends
|
** Back ends
|
||||||
|
|
||||||
|
TREXIO has several back ends:
|
||||||
|
|
||||||
|
1) `TREXIO_HDF5` relies on extensive use of the HDF5 library and the associated file format.
|
||||||
|
The HDF5 file is binary and tailored to high-performance I/O. This back end is the default one.
|
||||||
|
HDF5 can be compiled with MPI for parallel I/O.
|
||||||
|
Note, that HDF5 has to be downloaded and installed independently of TREXIO, which may cause
|
||||||
|
some obstacles, especially when the user is not allowed to install external software.
|
||||||
|
The produced files usually have `.h5` extension.
|
||||||
|
|
||||||
|
2) `TREXIO_TEXT` relies on basic file I/O in C, namely `fopen, fclose, fprintf, fscanf` etc.
|
||||||
|
from `stdio.h` library. This back end is not optimized for performance. It is supposed to be
|
||||||
|
used for debug purposes or, for example, when the user wants to modify some data manually within the file.
|
||||||
|
This back end is supposed to work "out-of-the-box" since there are no external dependencies, which might
|
||||||
|
be useful for users that do not have access to HDF5 library.
|
||||||
|
The produced files usually have `.txt` extension.
|
||||||
|
|
||||||
|
Additional back ends can be implemented thanks to the modular nature of the front end.
|
||||||
|
This can be achieved by adding a new `case` (corresponding to the desired back end) in the front-end `switch`
|
||||||
|
Then the corresponding back-end `has/read/write_` functions has to be implemented. For example, see the commented
|
||||||
|
lines that correspond to the `TREXIO_JSON` back end (not implemented yet).
|
||||||
|
|
||||||
#+begin_src c :tangle prefix_front.h
|
#+begin_src c :tangle prefix_front.h
|
||||||
typedef int32_t back_end_t;
|
typedef int32_t back_end_t;
|
||||||
|
|
||||||
#define TREXIO_HDF5 ( (back_end_t) 0 )
|
#define TREXIO_HDF5 ( (back_end_t) 0 )
|
||||||
#define TREXIO_TEXT ( (back_end_t) 1 )
|
#define TREXIO_TEXT ( (back_end_t) 1 )
|
||||||
#define TREXIO_JSON ( (back_end_t) 2 )
|
/*#define TREXIO_JSON ( (back_end_t) 2 )*/
|
||||||
#define TREXIO_INVALID_BACK_END ( (back_end_t) 3 )
|
#define TREXIO_INVALID_BACK_END ( (back_end_t) 2 )
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Read/write behavior
|
** Read/write behavior
|
||||||
@ -314,9 +336,9 @@ typedef int32_t back_end_t;
|
|||||||
|
|
||||||
Writing to TREXIO files is done with transactions (all-or-nothing
|
Writing to TREXIO files is done with transactions (all-or-nothing
|
||||||
effect) in a per-group fashion. File writes are attempted by
|
effect) in a per-group fashion. File writes are attempted by
|
||||||
calling explicitly the flush function, or when the TREXIO file is
|
calling explicitly the write (`TREXIO_HDF5`) or flush (`TREXIO_TEXT`)
|
||||||
closed. If writing is impossible because the data is not valid, no
|
function, or when the TREXIO file is closed.
|
||||||
data is written.
|
If writing is impossible because the data is not valid, no data is written.
|
||||||
|
|
||||||
The order in which the data is written is not necessarily consistent
|
The order in which the data is written is not necessarily consistent
|
||||||
with the order in which the function calls were made.
|
with the order in which the function calls were made.
|
||||||
@ -346,7 +368,7 @@ struct trexio_s {
|
|||||||
pthread_mutex_t thread_lock;
|
pthread_mutex_t thread_lock;
|
||||||
back_end_t back_end;
|
back_end_t back_end;
|
||||||
char mode;
|
char mode;
|
||||||
char padding[7]; /* Ensures the proper alignment of back-ends */
|
char padding[7]; /* Ensures the proper alignment of back ends */
|
||||||
};
|
};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -354,18 +376,39 @@ struct trexio_s {
|
|||||||
|
|
||||||
Polymorphism of the ~trexio_t~ type is handled by ensuring that the
|
Polymorphism of the ~trexio_t~ type is handled by ensuring that the
|
||||||
corresponding types for all back ends can be safely casted to
|
corresponding types for all back ends can be safely casted to
|
||||||
~trexio_t~. This is done by making the back end structs start with
|
~trexio_t~. This is done by making the back-end structs start with
|
||||||
~struct trexio_s~:
|
~struct trexio_s~:
|
||||||
|
|
||||||
#+begin_src c
|
#+begin_src c
|
||||||
struct trexio_back_end_s {
|
struct trexio_back_end_s {
|
||||||
trexio_t parent ;
|
trexio_t parent ;
|
||||||
/* add below specific back end data */
|
/* add below specific back-end data */
|
||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** File opening
|
** File opening
|
||||||
|
|
||||||
|
`trexio_open` creates a new ~TREXIO~ file or opens existing one.
|
||||||
|
|
||||||
|
`trexio_open` input:
|
||||||
|
1) `file_name` - string containing file name
|
||||||
|
2) `mode` - character containing open mode (see below)
|
||||||
|
1. `'w'` - (write) creates a new file as READWRITE (overwrite existing file)
|
||||||
|
2. `'r'` - (read) opens existing file as READONLY
|
||||||
|
3. `'a'` - (append) either opens file in READWRITE mode if it already exists or creates a new one
|
||||||
|
3) `back_end` - integer number (or the corresponding global parameter) specifying the back end
|
||||||
|
1. `TREXIO_HDF5` - for HDF5 back end (integer alternative: 0)
|
||||||
|
2. `TREXIO_TEXT` - for TEXT back end (integer alternative: 1)
|
||||||
|
|
||||||
|
`trexio_open` output:
|
||||||
|
`trexio_t` file handle
|
||||||
|
|
||||||
|
_**Note: the `file_name` in TEXT back end actually corresponds to the name of the folder where `.txt`
|
||||||
|
data files are stored. The actual name of each `.txt.` file corresponds to the `group` name provided in
|
||||||
|
`trex.config` (e.g. `nucleus.txt` for nucleus-related data like atomic coordinates).
|
||||||
|
These names are populated by the `generator.py` (i.e. they are hard-coded), which is why the user
|
||||||
|
should tend to avoid renaming the `.txt` data files.**_
|
||||||
|
|
||||||
#+begin_src c :tangle prefix_front.h
|
#+begin_src c :tangle prefix_front.h
|
||||||
trexio_t* trexio_open(const char* file_name, const char mode, const back_end_t back_end);
|
trexio_t* trexio_open(const char* file_name, const char mode, const back_end_t back_end);
|
||||||
#+end_src
|
#+end_src
|
||||||
@ -449,7 +492,7 @@ trexio_t* trexio_open(const char* file_name, const char mode, const back_end_t b
|
|||||||
case TREXIO_TEXT:
|
case TREXIO_TEXT:
|
||||||
rc = trexio_text_lock(result);
|
rc = trexio_text_lock(result);
|
||||||
break;
|
break;
|
||||||
|
/* HDF5 v.>=1.10 has file locking activated by default */
|
||||||
case TREXIO_HDF5:
|
case TREXIO_HDF5:
|
||||||
rc = TREXIO_SUCCESS;
|
rc = TREXIO_SUCCESS;
|
||||||
break;
|
break;
|
||||||
@ -483,6 +526,14 @@ end interface
|
|||||||
|
|
||||||
** File closing
|
** File closing
|
||||||
|
|
||||||
|
`trexio_close` closes an existing `trexio_t` file.
|
||||||
|
|
||||||
|
`trexio_close` input:
|
||||||
|
`file` - TREXIO file handle.
|
||||||
|
|
||||||
|
`trexio_close` output:
|
||||||
|
`trexio_exit_code` exit code.
|
||||||
|
|
||||||
#+begin_src c :tangle prefix_front.h
|
#+begin_src c :tangle prefix_front.h
|
||||||
trexio_exit_code trexio_close(trexio_t* file);
|
trexio_exit_code trexio_close(trexio_t* file);
|
||||||
#+end_src
|
#+end_src
|
||||||
@ -565,16 +616,95 @@ end interface
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Templates for front end
|
* Templates for front end
|
||||||
** Template for frontend has/read/write a number
|
|
||||||
|
Consider the following block of `trex.json`:
|
||||||
|
|
||||||
|
{
|
||||||
|
"nucleus": {
|
||||||
|
"num" : [ "int" , [ ] ]
|
||||||
|
, "charge" : [ "float", [ "nucleus.num" ] ]
|
||||||
|
, "coord" : [ "float", [ "nucleus.num", "3" ] ]
|
||||||
|
, "label" : [ "char" , [ "nucleus.num", "32" ] ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~TREXIO~ is generated automatically by the `generator.py` Python script
|
||||||
|
based on the tree-like configuration provided in the `trex.json` file.
|
||||||
|
Because of that, generalized templates can be implemented and re-used.
|
||||||
|
This approach minimizes the number of bugs as compared with manual copy-paste-modify scheme.
|
||||||
|
|
||||||
|
All templates presented below use the `$var$` notation to indicate the variable,
|
||||||
|
which will be replaced by the `generator.py`. Sometimes the upper case is used, i.e.
|
||||||
|
`$VAR$` (for example, in `#define` statements).
|
||||||
|
More detailed description of each variable can be found below:
|
||||||
|
|
||||||
|
| Template variable | Description | Example |
|
||||||
|
|-------------------------------+--------------------------------------------------+------------------|
|
||||||
|
| ~$group$~ | 'Name of the group' | nucleus |
|
||||||
|
| ~$group_num$~ | 'Name of the dimensioning variable (scalar)' | nucleus_num |
|
||||||
|
| ~$group_dset$~ | 'Name of the dataset (vector/matrix/tensor)' | nucleus_coord |
|
||||||
|
| ~$group_dset_rank$~ | 'Rank of the dataset' | 2 |
|
||||||
|
| ~$group_dset_dim$~ | 'Selected dimension of the dataset' | nucleus_num |
|
||||||
|
| ~$group_dset_dim_list$~ | 'All dimensions of the dataset' | {nucleus_num, 3} |
|
||||||
|
| ~$group_dset_dtype$~ | 'Basic type of the dataset (int/float/char)' | float |
|
||||||
|
| ~$group_dset_h5_dtype$~ | 'Type of the dataset in HDF5' | double |
|
||||||
|
| ~$group_dset_std_dtype_in$~ | 'Input type of the dataset in TEXT [fscanf] ' | %lf |
|
||||||
|
| ~$group_dset_std_dtype_out$~ | 'Output type of the dataset in TEXT [fprintf]' | %24.16e |
|
||||||
|
| ~$group_dset_dtype_single$~ | 'Single precision type of the dataset [C]' | float |
|
||||||
|
| ~$group_dset_dtype_double$~ | 'Double precision type of the dataset [C]' | double |
|
||||||
|
| ~$group_dset_f_dtype_single$~ | 'Single precision type of the dataset [Fortran]' | real(4) |
|
||||||
|
| ~$group_dset_f_dtype_double$~ | 'Double precision type of the dataset [Fortran]' | real(8) |
|
||||||
|
|
||||||
|
Note: parent group name is always added to the child objects upon consruction of TREXIO
|
||||||
|
(e.g. `num` of `nucleus` group becomes `nucleus_num` and should be accessed accordingly within TREXIO).
|
||||||
|
|
||||||
|
TREXIO generator parses the `trex.json` file. TREXIO operates with names of variables
|
||||||
|
based on the 1-st (parent group) and 2-nd (child object) levels of `trex.json`.
|
||||||
|
The parsed configutation is divided in 2 parts:
|
||||||
|
|
||||||
|
1) Dimensioning variables (containing `num`). These are always scalar integers.
|
||||||
|
2) Datasets. These can be vectors, matrices or tensors. The types are indicated in `trex.json`.
|
||||||
|
Currently supported types: int, float. TODO: strings.
|
||||||
|
|
||||||
|
For each of the aforementioned objects, TREXIO provides `has`,`read` and `write` functionality.
|
||||||
|
TREXIO supports I/O with single or double precision for integer and floating point numbers.
|
||||||
|
|
||||||
|
|
||||||
|
** Templates for front end has/read/write a dimension
|
||||||
|
|
||||||
|
This section concerns API calls related to dimensioning variables.
|
||||||
|
|
||||||
|
| Function name | Description | Precision |
|
||||||
|
|-------------------------------+----------------------------------------------------+-----------|
|
||||||
|
| ~trexio_has_$group_num$~ | 'Check if a dimensioning variable exists in a file | --- |
|
||||||
|
| ~trexio_read_$group_num$~ | 'Read a dimensioning variable ' | Single |
|
||||||
|
| ~trexio_write_$group_num$~ | 'Write a dimensioning variable' | Single |
|
||||||
|
| ~trexio_read_$group_num$_32~ | 'Read a dimensioning variable ' | Single |
|
||||||
|
| ~trexio_write_$group_num$_32~ | 'Write a dimensioning variable' | Single |
|
||||||
|
| ~trexio_read_$group_num$_64~ | 'Read a dimensioning variable ' | Double |
|
||||||
|
| ~trexio_write_$group_num$_64~ | 'Write a dimensioning variable' | Double |
|
||||||
|
|
||||||
|
*** C templates for front end f
|
||||||
|
|
||||||
|
The C templates that correspond to each of the abovementioned functions can be found below.
|
||||||
|
First parameter is the ~TREXIO~ file handle. Second parameter is the variable to be written/read
|
||||||
|
to/from the ~TREXIO~ file (except for `trexio_has_` functions).
|
||||||
|
Suffixes `_32` and `_64` correspond to API calls dealing with single and double precision, respectively.
|
||||||
|
The basic (non-suffixed) API call on dimensioning variables deals with single precision (see Table above).
|
||||||
|
|
||||||
|
|
||||||
#+begin_src c :tangle hrw_num_front.h
|
#+begin_src c :tangle hrw_num_front.h
|
||||||
trexio_exit_code trexio_has_$group_num$(trexio_t* const file);
|
trexio_exit_code trexio_has_$group_num$(trexio_t* const file);
|
||||||
trexio_exit_code trexio_read_$group_num$(trexio_t* const file, int64_t* const num);
|
trexio_exit_code trexio_read_$group_num$(trexio_t* const file, int32_t* const num);
|
||||||
trexio_exit_code trexio_write_$group_num$(trexio_t* const file, const int64_t num);
|
trexio_exit_code trexio_write_$group_num$(trexio_t* const file, const int32_t num);
|
||||||
|
trexio_exit_code trexio_read_$group_num$_32(trexio_t* const file, int32_t* const num);
|
||||||
|
trexio_exit_code trexio_write_$group_num$_32(trexio_t* const file, const int32_t num);
|
||||||
|
trexio_exit_code trexio_read_$group_num$_64(trexio_t* const file, int64_t* const num);
|
||||||
|
trexio_exit_code trexio_write_$group_num$_64(trexio_t* const file, const int64_t num);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle read_num_front.c
|
#+begin_src c :tangle read_num_64_front.c
|
||||||
trexio_exit_code trexio_read_$group_num$(trexio_t* const file, int64_t* const num) {
|
trexio_exit_code trexio_read_$group_num$_64(trexio_t* const file, int64_t* const num) {
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
|
|
||||||
uint64_t u_num = 0;
|
uint64_t u_num = 0;
|
||||||
@ -603,8 +733,8 @@ trexio_exit_code trexio_read_$group_num$(trexio_t* const file, int64_t* const nu
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle write_num_front.c
|
#+begin_src c :tangle write_num_64_front.c
|
||||||
trexio_exit_code trexio_write_$group_num$(trexio_t* const file, const int64_t num) {
|
trexio_exit_code trexio_write_$group_num$_64(trexio_t* const file, const int64_t num) {
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
if (num < 0 ) return TREXIO_INVALID_ARG_2;
|
if (num < 0 ) return TREXIO_INVALID_ARG_2;
|
||||||
|
|
||||||
@ -613,15 +743,15 @@ trexio_exit_code trexio_write_$group_num$(trexio_t* const file, const int64_t nu
|
|||||||
switch (file->back_end) {
|
switch (file->back_end) {
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
case TREXIO_TEXT:
|
||||||
rc = trexio_text_write_$group_num$(file, (uint64_t) num);
|
rc = trexio_text_write_$group_num$(file, (int64_t) num);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
case TREXIO_HDF5:
|
||||||
rc = trexio_hdf5_write_$group_num$(file, (uint64_t) num);
|
rc = trexio_hdf5_write_$group_num$(file, (int64_t) num);
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
case TREXIO_JSON:
|
case TREXIO_JSON:
|
||||||
rc = trexio_json_write_$group_num$(file, (uint64_t) num);
|
rc = trexio_json_write_$group_num$(file, (int64_t) num);
|
||||||
break;
|
break;
|
||||||
,*/
|
,*/
|
||||||
}
|
}
|
||||||
@ -631,6 +761,76 @@ trexio_exit_code trexio_write_$group_num$(trexio_t* const file, const int64_t nu
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle read_num_32_front.c
|
||||||
|
trexio_exit_code trexio_read_$group_num$_32(trexio_t* const file, int32_t* const num) {
|
||||||
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
|
|
||||||
|
uint64_t u_num = 0;
|
||||||
|
trexio_exit_code rc = TREXIO_FAILURE;
|
||||||
|
|
||||||
|
switch (file->back_end) {
|
||||||
|
|
||||||
|
case TREXIO_TEXT:
|
||||||
|
rc = trexio_text_read_$group_num$(file, &u_num);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TREXIO_HDF5:
|
||||||
|
rc = trexio_hdf5_read_$group_num$(file, &u_num);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
case TREXIO_JSON:
|
||||||
|
rc =trexio_json_read_$group_num$(file, &u_num);
|
||||||
|
break;
|
||||||
|
,*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
|
|
||||||
|
*num = (int32_t) u_num;
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle write_num_32_front.c
|
||||||
|
trexio_exit_code trexio_write_$group_num$_32(trexio_t* const file, const int32_t num) {
|
||||||
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
|
if (num < 0 ) return TREXIO_INVALID_ARG_2;
|
||||||
|
|
||||||
|
trexio_exit_code rc = TREXIO_FAILURE;
|
||||||
|
|
||||||
|
switch (file->back_end) {
|
||||||
|
|
||||||
|
case TREXIO_TEXT:
|
||||||
|
rc = trexio_text_write_$group_num$(file, (int64_t) num);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TREXIO_HDF5:
|
||||||
|
rc = trexio_hdf5_write_$group_num$(file, (int64_t) num);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
case TREXIO_JSON:
|
||||||
|
rc = trexio_json_write_$group_num$(file, (int64_t) num);
|
||||||
|
break;
|
||||||
|
,*/
|
||||||
|
}
|
||||||
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
|
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle read_num_def_front.c
|
||||||
|
trexio_exit_code trexio_read_$group_num$(trexio_t* const file, int32_t* const num) {
|
||||||
|
return trexio_read_$group_num$_32(file, num);
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle write_num_def_front.c
|
||||||
|
trexio_exit_code trexio_write_$group_num$(trexio_t* const file, const int32_t num) {
|
||||||
|
return trexio_write_$group_num$_32(file, num);
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle has_num_front.c
|
#+begin_src c :tangle has_num_front.c
|
||||||
trexio_exit_code trexio_has_$group_num$(trexio_t* const file) {
|
trexio_exit_code trexio_has_$group_num$(trexio_t* const file) {
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
@ -656,22 +856,67 @@ trexio_exit_code trexio_has_$group_num$(trexio_t* const file) {
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src f90 :tangle write_num_front_fortran.f90
|
*** Fortran templates for front end
|
||||||
|
|
||||||
|
The Fortran templates that provide an access to the C API calls from Fortran.
|
||||||
|
These templates are based on the use of `iso_c_binding`. Pointers have to be passed by value.
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle write_num_64_front_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_write_$group_num$_64 (trex_file, num) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
integer(8), intent(in), value :: num
|
||||||
|
end function trexio_write_$group_num$_64
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle read_num_64_front_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_read_$group_num$_64 (trex_file, num) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
integer(8), intent(out) :: num
|
||||||
|
end function trexio_read_$group_num$_64
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle write_num_32_front_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_write_$group_num$_32 (trex_file, num) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
integer(4), intent(in), value :: num
|
||||||
|
end function trexio_write_$group_num$_32
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle read_num_32_front_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_read_$group_num$_32 (trex_file, num) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
integer(4), intent(out) :: num
|
||||||
|
end function trexio_read_$group_num$_32
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle write_num_def_front_fortran.f90
|
||||||
interface
|
interface
|
||||||
integer function trexio_write_$group_num$ (trex_file, num) bind(C)
|
integer function trexio_write_$group_num$ (trex_file, num) bind(C)
|
||||||
use, intrinsic :: iso_c_binding
|
use, intrinsic :: iso_c_binding
|
||||||
integer(8), intent(in), value :: trex_file
|
integer(8), intent(in), value :: trex_file
|
||||||
integer(8), intent(in), value :: num
|
integer(4), intent(in), value :: num
|
||||||
end function trexio_write_$group_num$
|
end function trexio_write_$group_num$
|
||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src f90 :tangle read_num_front_fortran.f90
|
#+begin_src f90 :tangle read_num_def_front_fortran.f90
|
||||||
interface
|
interface
|
||||||
integer function trexio_read_$group_num$ (trex_file, num) bind(C)
|
integer function trexio_read_$group_num$ (trex_file, num) bind(C)
|
||||||
use, intrinsic :: iso_c_binding
|
use, intrinsic :: iso_c_binding
|
||||||
integer(8), intent(in), value :: trex_file
|
integer(8), intent(in), value :: trex_file
|
||||||
integer(8), intent(out) :: num
|
integer(4), intent(out) :: num
|
||||||
end function trexio_read_$group_num$
|
end function trexio_read_$group_num$
|
||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
@ -684,40 +929,49 @@ interface
|
|||||||
end function trexio_has_$group_num$
|
end function trexio_has_$group_num$
|
||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
** Templates for front end has/read/write a dataset
|
||||||
|
|
||||||
|
This section concerns API calls related to datasets.
|
||||||
|
|
||||||
|
| Function name | Description | Precision |
|
||||||
|
|----------------------------------------+--------------------------------------+-----------|
|
||||||
|
| ~trexio_has_$group$_$group_dset$~ | 'Check if a dataset exists in a file | --- |
|
||||||
|
| ~trexio_read_$group$_$group_dset$~ | 'Read a dataset ' | Double |
|
||||||
|
| ~trexio_write_$group$_$group_dset$~ | 'Write a dataset' | Double |
|
||||||
|
| ~trexio_read_$group$_$group_dset$_32~ | 'Read a dataset' | Single |
|
||||||
|
| ~trexio_write_$group$_$group_dset$_32~ | 'Write a dataset' | Single |
|
||||||
|
| ~trexio_read_$group$_$group_dset$_64~ | 'Read a dataset' | Double |
|
||||||
|
| ~trexio_write_$group$_$group_dset$_64~ | 'Write a dataset' | Double |
|
||||||
|
|
||||||
|
*** C templates for front end
|
||||||
|
|
||||||
|
The C templates that correspond to each of the abovementioned functions can be found below.
|
||||||
|
First parameter is the ~TREXIO~ file handle. Second parameter is the variable to be written/read
|
||||||
|
to/from the ~TREXIO~ file (except for `trexio_has_` functions).
|
||||||
|
Suffixes `_32` and `_64` correspond to API calls dealing with single and double precision, respectively.
|
||||||
|
The basic (non-suffixed) API call on datasets deals with double precision (see Table above).
|
||||||
|
|
||||||
** Template for frontend has/read/write a dataset
|
|
||||||
|
|
||||||
#+begin_src c :tangle hrw_dset_front.h
|
#+begin_src c :tangle hrw_dset_front.h
|
||||||
trexio_exit_code trexio_has_$group$_$group_dset$(trexio_t* const file);
|
trexio_exit_code trexio_has_$group$_$group_dset$(trexio_t* const file);
|
||||||
trexio_exit_code trexio_read_$group$_$group_dset$(trexio_t* const file, $group_dset_dtype$* const $group_dset$);
|
trexio_exit_code trexio_read_$group$_$group_dset$(trexio_t* const file, $group_dset_dtype_double$* const $group_dset$);
|
||||||
trexio_exit_code trexio_write_$group$_$group_dset$(trexio_t* const file, const $group_dset_dtype$* $group_dset$);
|
trexio_exit_code trexio_write_$group$_$group_dset$(trexio_t* const file, const $group_dset_dtype_double$* $group_dset$);
|
||||||
|
trexio_exit_code trexio_read_$group$_$group_dset$_32(trexio_t* const file, $group_dset_dtype_single$* const $group_dset$);
|
||||||
|
trexio_exit_code trexio_write_$group$_$group_dset$_32(trexio_t* const file, const $group_dset_dtype_single$* $group_dset$);
|
||||||
|
trexio_exit_code trexio_read_$group$_$group_dset$_64(trexio_t* const file, $group_dset_dtype_double$* const $group_dset$);
|
||||||
|
trexio_exit_code trexio_write_$group$_$group_dset$_64(trexio_t* const file, const $group_dset_dtype_double$* $group_dset$);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle read_dset_front.c
|
#+begin_src c :tangle read_dset_64_front.c
|
||||||
trexio_exit_code trexio_read_$group$_$group_dset$(trexio_t* const file, $group_dset_dtype$* const $group_dset$) {
|
trexio_exit_code trexio_read_$group$_$group_dset$_64(trexio_t* const file, $group_dset_dtype_double$* const $group_dset$) {
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
if ($group_dset$ == NULL) return TREXIO_INVALID_ARG_2;
|
if ($group_dset$ == NULL) return TREXIO_INVALID_ARG_2;
|
||||||
|
|
||||||
trexio_exit_code rc;
|
trexio_exit_code rc;
|
||||||
uint64_t $group_dset_dim$ = 0;
|
int64_t $group_dset_dim$ = 0;
|
||||||
|
|
||||||
switch (file->back_end) {
|
/* Error handling for this call is added by the generator */
|
||||||
|
rc = trexio_read_$group_dset_dim$_64(file, &($group_dset_dim$));
|
||||||
case TREXIO_TEXT:
|
|
||||||
rc = trexio_text_read_$group_dset_dim$(file, &$group_dset_dim$);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
|
||||||
rc = trexio_hdf5_read_$group_dset_dim$(file, &$group_dset_dim$);
|
|
||||||
break;
|
|
||||||
/*
|
|
||||||
case TREXIO_JSON:
|
|
||||||
rc = trexio_json_read_$group_dset_dim$(file, &$group_dset_dim$);
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc != TREXIO_SUCCESS) return rc;
|
|
||||||
|
|
||||||
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
@ -735,7 +989,7 @@ trexio_exit_code trexio_read_$group$_$group_dset$(trexio_t* const file, $group_d
|
|||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
case TREXIO_JSON:
|
case TREXIO_JSON:
|
||||||
return trexio_json_read_$group$_$group_dset$(file, $group_dset$);
|
return trexio_json_read_$group$_$group_dset$(file, $group_dset$, rank, dims);
|
||||||
break;
|
break;
|
||||||
,*/
|
,*/
|
||||||
default:
|
default:
|
||||||
@ -744,30 +998,17 @@ trexio_exit_code trexio_read_$group$_$group_dset$(trexio_t* const file, $group_d
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle write_dset_front.c
|
#+begin_src c :tangle write_dset_64_front.c
|
||||||
trexio_exit_code trexio_write_$group$_$group_dset$(trexio_t* const file, const $group_dset_dtype$* $group_dset$) {
|
trexio_exit_code trexio_write_$group$_$group_dset$_64(trexio_t* const file, const $group_dset_dtype_double$* $group_dset$) {
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
if ($group_dset$ == NULL) return TREXIO_INVALID_ARG_2;
|
if ($group_dset$ == NULL) return TREXIO_INVALID_ARG_2;
|
||||||
|
|
||||||
trexio_exit_code rc;
|
trexio_exit_code rc;
|
||||||
uint64_t $group_dset_dim$ = 0;
|
int64_t $group_dset_dim$ = 0;
|
||||||
switch (file->back_end) {
|
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
/* Error handling for this call is added by the generator */
|
||||||
rc = trexio_text_read_$group_dset_dim$(file, &$group_dset_dim$);
|
rc = trexio_read_$group_dset_dim$_64(file, &($group_dset_dim$));
|
||||||
break;
|
|
||||||
|
|
||||||
case TREXIO_HDF5:
|
|
||||||
rc = trexio_hdf5_read_$group_dset_dim$(file, &$group_dset_dim$);
|
|
||||||
break;
|
|
||||||
/*
|
|
||||||
case TREXIO_JSON:
|
|
||||||
rc = trexio_json_read_$group_dset_dim$(file, &$group_dset_dim$);
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc != TREXIO_SUCCESS) return rc;
|
|
||||||
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
uint32_t rank = $group_dset_rank$;
|
uint32_t rank = $group_dset_rank$;
|
||||||
@ -784,7 +1025,7 @@ trexio_exit_code trexio_write_$group$_$group_dset$(trexio_t* const file, const $
|
|||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
case TREXIO_JSON:
|
case TREXIO_JSON:
|
||||||
return trexio_json_write_$group$_$group_dset$(file, $group_dset$);
|
return trexio_json_write_$group$_$group_dset$(file, $group_dset$, rank, dims);
|
||||||
break;
|
break;
|
||||||
,*/
|
,*/
|
||||||
default:
|
default:
|
||||||
@ -793,6 +1034,129 @@ trexio_exit_code trexio_write_$group$_$group_dset$(trexio_t* const file, const $
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle read_dset_32_front.c
|
||||||
|
trexio_exit_code trexio_read_$group$_$group_dset$_32(trexio_t* const file, $group_dset_dtype_single$* const $group_dset$) {
|
||||||
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
|
if ($group_dset$ == NULL) return TREXIO_INVALID_ARG_2;
|
||||||
|
|
||||||
|
trexio_exit_code rc;
|
||||||
|
int64_t $group_dset_dim$ = 0;
|
||||||
|
|
||||||
|
/* Error handling for this call is added by the generator */
|
||||||
|
rc = trexio_read_$group_dset_dim$_64(file, &($group_dset_dim$));
|
||||||
|
|
||||||
|
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
|
uint32_t rank = $group_dset_rank$;
|
||||||
|
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
||||||
|
|
||||||
|
uint64_t dim_size = 1;
|
||||||
|
for (unsigned int i=0; i<rank; ++i){
|
||||||
|
dim_size *= dims[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
$group_dset_dtype_double$* $group_dset$_64 = CALLOC(dim_size, $group_dset_dtype_double$);
|
||||||
|
if ($group_dset$_64 == NULL) return TREXIO_ALLOCATION_FAILED;
|
||||||
|
|
||||||
|
switch (file->back_end) {
|
||||||
|
|
||||||
|
case TREXIO_TEXT:
|
||||||
|
rc = trexio_text_read_$group$_$group_dset$(file, $group_dset$_64, rank, dims);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TREXIO_HDF5:
|
||||||
|
rc = trexio_hdf5_read_$group$_$group_dset$(file, $group_dset$_64, rank, dims);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
case TREXIO_JSON:
|
||||||
|
rc = trexio_json_read_$group$_$group_dset$(file, $group_dset$_64, rank, dims);
|
||||||
|
break;
|
||||||
|
,*/
|
||||||
|
default:
|
||||||
|
return TREXIO_FAILURE; /* Impossible case */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc != TREXIO_SUCCESS){
|
||||||
|
FREE($group_dset$_64);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint64_t i=0; i<dim_size; ++i){
|
||||||
|
$group_dset$[i] = ($group_dset_dtype_single$) $group_dset$_64[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
FREE($group_dset$_64);
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle write_dset_32_front.c
|
||||||
|
trexio_exit_code trexio_write_$group$_$group_dset$_32(trexio_t* const file, const $group_dset_dtype_single$* $group_dset$) {
|
||||||
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
|
if ($group_dset$ == NULL) return TREXIO_INVALID_ARG_2;
|
||||||
|
|
||||||
|
trexio_exit_code rc;
|
||||||
|
int64_t $group_dset_dim$ = 0;
|
||||||
|
|
||||||
|
/* Error handling for this call is added by the generator */
|
||||||
|
rc = trexio_read_$group_dset_dim$_64(file, &($group_dset_dim$));
|
||||||
|
|
||||||
|
if ($group_dset_dim$ == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
|
uint32_t rank = $group_dset_rank$;
|
||||||
|
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
||||||
|
|
||||||
|
uint64_t dim_size = 1;
|
||||||
|
for (unsigned int i=0; i<rank; ++i){
|
||||||
|
dim_size *= dims[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
$group_dset_dtype_double$* $group_dset$_64 = CALLOC(dim_size, $group_dset_dtype_double$);
|
||||||
|
if ($group_dset$_64 == NULL) return TREXIO_ALLOCATION_FAILED;
|
||||||
|
|
||||||
|
/* A type conversion from single precision to double reqired since back end only accepts 64-bit data */
|
||||||
|
for (uint64_t i=0; i<dim_size; ++i){
|
||||||
|
$group_dset$_64[i] = ($group_dset_dtype_double$) $group_dset$[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (file->back_end) {
|
||||||
|
|
||||||
|
case TREXIO_TEXT:
|
||||||
|
rc = trexio_text_write_$group$_$group_dset$(file, $group_dset$_64, rank, dims);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TREXIO_HDF5:
|
||||||
|
rc = trexio_hdf5_write_$group$_$group_dset$(file, $group_dset$_64, rank, dims);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
case TREXIO_JSON:
|
||||||
|
rc = trexio_json_write_$group$_$group_dset$(file, $group_dset$_64, rank, dims);
|
||||||
|
break;
|
||||||
|
,*/
|
||||||
|
default:
|
||||||
|
return TREXIO_FAILURE; /* Impossible case */
|
||||||
|
}
|
||||||
|
|
||||||
|
FREE($group_dset$_64);
|
||||||
|
|
||||||
|
if (rc != TREXIO_SUCCESS) return rc;
|
||||||
|
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle read_dset_def_front.c
|
||||||
|
trexio_exit_code trexio_read_$group$_$group_dset$(trexio_t* const file, $group_dset_dtype_double$* const $group_dset$) {
|
||||||
|
return trexio_read_$group$_$group_dset$_64(file, $group_dset$);
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle write_dset_def_front.c
|
||||||
|
trexio_exit_code trexio_write_$group$_$group_dset$(trexio_t* const file, const $group_dset_dtype_double$* $group_dset$) {
|
||||||
|
return trexio_write_$group$_$group_dset$_64(file, $group_dset$);
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle has_dset_front.c
|
#+begin_src c :tangle has_dset_front.c
|
||||||
trexio_exit_code trexio_has_$group$_$group_dset$(trexio_t* const file) {
|
trexio_exit_code trexio_has_$group$_$group_dset$(trexio_t* const file) {
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
@ -817,23 +1181,67 @@ trexio_exit_code trexio_has_$group$_$group_dset$(trexio_t* const file) {
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
*** Fortran templates for front end
|
||||||
|
|
||||||
#+begin_src f90 :tangle write_dset_front_fortran.f90
|
The Fortran templates that provide an access to the C API calls from Fortran.
|
||||||
|
These templates are based on the use of `iso_c_binding`. Pointers have to be passed by value.
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle write_dset_64_front_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_write_$group$_$group_dset$_64 (trex_file, dset) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
$group_dset_f_dtype_double$, intent(in) :: dset(*)
|
||||||
|
end function trexio_write_$group$_$group_dset$_64
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle read_dset_64_front_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_read_$group$_$group_dset$_64 (trex_file, dset) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
$group_dset_f_dtype_double$, intent(out) :: dset(*)
|
||||||
|
end function trexio_read_$group$_$group_dset$_64
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle write_dset_32_front_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_write_$group$_$group_dset$_32 (trex_file, dset) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
$group_dset_f_dtype_single$, intent(in) :: dset(*)
|
||||||
|
end function trexio_write_$group$_$group_dset$_32
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle read_dset_32_front_fortran.f90
|
||||||
|
interface
|
||||||
|
integer function trexio_read_$group$_$group_dset$_32 (trex_file, dset) bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
integer(8), intent(in), value :: trex_file
|
||||||
|
$group_dset_f_dtype_single$, intent(out) :: dset(*)
|
||||||
|
end function trexio_read_$group$_$group_dset$_32
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle write_dset_def_front_fortran.f90
|
||||||
interface
|
interface
|
||||||
integer function trexio_write_$group$_$group_dset$ (trex_file, dset) bind(C)
|
integer function trexio_write_$group$_$group_dset$ (trex_file, dset) bind(C)
|
||||||
use, intrinsic :: iso_c_binding
|
use, intrinsic :: iso_c_binding
|
||||||
integer(8), intent(in), value :: trex_file
|
integer(8), intent(in), value :: trex_file
|
||||||
$group_dset_f_dtype$, intent(in) :: dset(*)
|
$group_dset_f_dtype_double$, intent(in) :: dset(*)
|
||||||
end function trexio_write_$group$_$group_dset$
|
end function trexio_write_$group$_$group_dset$
|
||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src f90 :tangle read_dset_front_fortran.f90
|
#+begin_src f90 :tangle read_dset_def_front_fortran.f90
|
||||||
interface
|
interface
|
||||||
integer function trexio_read_$group$_$group_dset$ (trex_file, dset) bind(C)
|
integer function trexio_read_$group$_$group_dset$ (trex_file, dset) bind(C)
|
||||||
use, intrinsic :: iso_c_binding
|
use, intrinsic :: iso_c_binding
|
||||||
integer(8), intent(in), value :: trex_file
|
integer(8), intent(in), value :: trex_file
|
||||||
$group_dset_f_dtype$, intent(out) :: dset(*)
|
$group_dset_f_dtype_double$, intent(out) :: dset(*)
|
||||||
end function trexio_read_$group$_$group_dset$
|
end function trexio_read_$group$_$group_dset$
|
||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
@ -847,17 +1255,13 @@ interface
|
|||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Back ends
|
|
||||||
|
|
||||||
TREXIO has multiple possible back ends:
|
|
||||||
|
|
||||||
- HDF5: The most efficient back-end, by default
|
|
||||||
- Text files: not to be used for production, but useful for debugging
|
|
||||||
- JSON: for portability
|
|
||||||
|
|
||||||
|
|
||||||
* Fortran helper/wrapper functions
|
* Fortran helper/wrapper functions
|
||||||
|
|
||||||
|
The function below adapts the original C-based `trexio_open` for Fortran.
|
||||||
|
This is needed due to the fact that strings in C are terminated by NULL character `\0`
|
||||||
|
unlike strings in Fortran.
|
||||||
|
Note, that Fortran interface calls the main ~TREXIO~ API, which is written in C.
|
||||||
|
|
||||||
#+begin_src f90 :tangle suffix_fortran.f90
|
#+begin_src f90 :tangle suffix_fortran.f90
|
||||||
contains
|
contains
|
||||||
integer(8) function trexio_open (filename, mode, backend)
|
integer(8) function trexio_open (filename, mode, backend)
|
||||||
@ -873,8 +1277,7 @@ contains
|
|||||||
end function trexio_open
|
end function trexio_open
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
* File suffixes :noexport:
|
||||||
* File suffixes :noxport:
|
|
||||||
|
|
||||||
#+begin_src c :tangle suffix_front.h
|
#+begin_src c :tangle suffix_front.h
|
||||||
#endif
|
#endif
|
||||||
@ -887,6 +1290,3 @@ contains
|
|||||||
#+begin_src f90 :tangle suffix_fortran.f90
|
#+begin_src f90 :tangle suffix_fortran.f90
|
||||||
end module trexio
|
end module trexio
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
24
src/test.c
24
src/test.c
@ -1,6 +1,5 @@
|
|||||||
#include "trexio.h"
|
#include "trexio.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@ -19,7 +18,7 @@ int main() {
|
|||||||
test_write();
|
test_write();
|
||||||
test_read();
|
test_read();
|
||||||
|
|
||||||
printf("%s\n", trexio_string_of_error(TREXIO_INVALID_ARG_2));
|
printf("Test error message: %s\n", trexio_string_of_error(TREXIO_INVALID_ARG_2));
|
||||||
return 0 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,7 +31,8 @@ int test_h5write() {
|
|||||||
trexio_exit_code rc;
|
trexio_exit_code rc;
|
||||||
|
|
||||||
// parameters to be written
|
// parameters to be written
|
||||||
int64_t num = 12;
|
int num = 12;
|
||||||
|
double charge[12] = {6., 6., 6., 6., 6., 6., 1., 1., 1., 1., 1., 1.};
|
||||||
|
|
||||||
double coord[36] = {
|
double coord[36] = {
|
||||||
0.00000000 , 1.39250319 , 0.00000000 ,
|
0.00000000 , 1.39250319 , 0.00000000 ,
|
||||||
@ -66,6 +66,8 @@ int test_h5write() {
|
|||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
rc = trexio_write_nucleus_coord(file,coord);
|
rc = trexio_write_nucleus_coord(file,coord);
|
||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
|
rc = trexio_write_nucleus_charge(file,charge);
|
||||||
|
assert (rc == TREXIO_SUCCESS);
|
||||||
|
|
||||||
// check if the written data exists in the file
|
// check if the written data exists in the file
|
||||||
rc = trexio_has_nucleus_num(file);
|
rc = trexio_has_nucleus_num(file);
|
||||||
@ -112,7 +114,7 @@ int test_h5read() {
|
|||||||
trexio_t* file = NULL;
|
trexio_t* file = NULL;
|
||||||
trexio_exit_code rc;
|
trexio_exit_code rc;
|
||||||
|
|
||||||
int64_t num;
|
int num;
|
||||||
double* coord;
|
double* coord;
|
||||||
|
|
||||||
/*================= START OF TEST ==================*/
|
/*================= START OF TEST ==================*/
|
||||||
@ -167,8 +169,8 @@ int test_write() {
|
|||||||
trexio_exit_code rc;
|
trexio_exit_code rc;
|
||||||
|
|
||||||
// parameters to be written
|
// parameters to be written
|
||||||
int64_t num = 12;
|
int num = 12;
|
||||||
double charge[12] = {6., 6., 6., 6., 6., 6., 1., 1., 1., 1., 1., 1.};
|
float charge[12] = {6., 6., 6., 6., 6., 6., 1., 1., 1., 1., 1., 1.};
|
||||||
double coord[36] = {
|
double coord[36] = {
|
||||||
0.00000000 , 1.39250319 , 0.00000000 ,
|
0.00000000 , 1.39250319 , 0.00000000 ,
|
||||||
-1.20594314 , 0.69625160 , 0.00000000 ,
|
-1.20594314 , 0.69625160 , 0.00000000 ,
|
||||||
@ -197,7 +199,7 @@ int test_write() {
|
|||||||
rc = trexio_write_nucleus_num(file,num);
|
rc = trexio_write_nucleus_num(file,num);
|
||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
|
|
||||||
rc = trexio_write_nucleus_charge(file,charge);
|
rc = trexio_write_nucleus_charge_32(file,charge);
|
||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
|
|
||||||
rc = trexio_write_nucleus_coord(file,coord);
|
rc = trexio_write_nucleus_coord(file,coord);
|
||||||
@ -224,8 +226,8 @@ int test_read() {
|
|||||||
trexio_t* file = NULL;
|
trexio_t* file = NULL;
|
||||||
trexio_exit_code rc;
|
trexio_exit_code rc;
|
||||||
|
|
||||||
int64_t num;
|
int num;
|
||||||
double* charge;
|
float* charge;
|
||||||
double* coord;
|
double* coord;
|
||||||
|
|
||||||
/*================= START OF TEST ==================*/
|
/*================= START OF TEST ==================*/
|
||||||
@ -237,8 +239,8 @@ int test_read() {
|
|||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
assert (num == 12);
|
assert (num == 12);
|
||||||
|
|
||||||
charge = (double*) calloc(num, sizeof(double));
|
charge = (float*) calloc(num, sizeof(float));
|
||||||
rc = trexio_read_nucleus_charge(file,charge);
|
rc = trexio_read_nucleus_charge_32(file,charge);
|
||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
assert(charge[10] == 1.);
|
assert(charge[10] == 1.);
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ subroutine test_write()
|
|||||||
integer(8) :: trex_file
|
integer(8) :: trex_file
|
||||||
|
|
||||||
integer :: rc = 1
|
integer :: rc = 1
|
||||||
integer(8) :: num
|
integer :: num
|
||||||
|
|
||||||
double precision :: charge(12)
|
double precision :: charge(12)
|
||||||
double precision :: coord(36)
|
double precision :: coord(36)
|
||||||
@ -94,7 +94,7 @@ subroutine test_read()
|
|||||||
integer(8) :: trex_file
|
integer(8) :: trex_file
|
||||||
|
|
||||||
integer :: rc = 1
|
integer :: rc = 1
|
||||||
integer(8) :: num, num_read
|
integer :: num, num_read
|
||||||
|
|
||||||
double precision :: charge(12)
|
double precision :: charge(12)
|
||||||
double precision :: coord(3,12)
|
double precision :: coord(3,12)
|
||||||
|
Loading…
Reference in New Issue
Block a user